Задать вопрос

Python Pattern Matching?

Я люблю писать на Python. Решил, как говорится, just for fan, сделать на Python что-то вроде простейшего Pattern Matching в стиле Erlang (так как недавно начал заниматься эрлангом и проникся)). Есть одна проблема. Не знаю как сделать это красиво, так, чтобы было pythonic. ) Не придумал ничего лучше, чем как-то так:
class PFPM(object):
    
    def __init__(self, name):
        self._name = name
        self._clauses = []
        self._cur = 0
        
    def __call__(self, *fpars):
        # parse, execute
        return None #and return result

    def match(self, *pars):
        self._clauses.append({"match": pars})
        self._cur += 1
        return self

    def where(self, guard):
        self._clauses[self._cur]["guard"] = guard
        return self

    def func(self, *exprs):
        self._clauses[self._cur]["funcs"] = exprs
        return self
 
def max_of_list(numlist):
    fmax = PFPM("fmax")  # Далее, как это все выглядит:
    fmax.match("[H|T]").func("fmax(T,H)")
    fmax.match("[H|T]","N").where("H>N").func("fmax(T,H)")
    fmax.match("[_|T]","N").func("fmax(T,N)")
    fmax.match("[]","X").func("X")
    return fmax(numlist)

print max_of_list([3,1,2,6,4,5])



может кто-нибудь подскажет, предложит более «сахарный» путь…
  • Вопрос задан
  • 7296 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 2
bobry
@bobry
сахарный путь — выбрать другой язык, где pattern matching уже реализован. решение со строками *как мне кажется* не имеет практической ценности.

кстати в питоне есть tuple unpacking, чего обычно достаточно для нужд простых смертных.
Ответ написан
@Suor
Тоже баловался в этом направлении, вот что получилось:
github.com/Suor/patterns

Сахар достигается путём перестройки AST декорируемой функции.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы