Я написал программу на схеме go, которая развивала L-систему с помощью макросов. По сути, существуют правила расширения токенов, которые будут выполняться рекурсивно. Например, учитывая правила:
F => F F
X => X < F > F
> => identity (stay >)
< => identity (stay <)
Если мы начнем с X
, мы получим:
// after 0 iterations
X
// after 1 iteration
X < F > F
// after 2 iterations
X < F > F < F F > F F
// after 3 iterations
X < F > F < F F > F F < F F F F > F F F F
и так далее . В Scheme это было прелестью. Супер простое сопоставление и рекурсивные определения макросов. Вызов выглядел примерно так:
; macro name iters starting tokens
(evolve-lsys-n 5 X F X)
Но я действительно изо всех сил пытаюсь сделать это с Rust.
Стандартный macro_rules!
имеет преимущество сопоставления с образцом, что действительно приятно. Но, к сожалению, насколько я могу судить, здесь нет цитирования / квазиквотирования, поэтому я не могу на самом деле хвостовой рекурсии (я думаю?)
Процедурные макросы кажутся способом go, но я также борюсь как это сделать.
Если ввод такой же, как и в схеме (evolve!(X F X)
), как мне go фактически перебирать эти токены?
С ржавчина более мощная, я также надеюсь, что смогу получить более выразительный ввод без дополнительных пробелов. Например, evolve!(XFX)
было бы неплохо. Это возможно? В этом нет особого преимущества, но при определении правил расширения они могут действительно стать довольно большими, поэтому было бы неплохо избегать пробелов.
Наконец, в схеме я также смог реализовать параметризация c макросы. Это означает, что некоторые «токены» будут иметь параметры. Вызов будет выглядеть примерно так: evolve!(X F(10) X)
, а расширение для F(10)
примет параметр и сделает что-нибудь с ним, например F(t) F(t * 2)
, так что F(10)
расширится до F(10) F(20)
.
Очевидно, я могу все это сделать без макросов. Тем не менее, мне очень нравится идея использования макросов для всего этого, поскольку это просто интересное упражнение, и оно исходит из идеи «определения вашей собственной грамматики», которая является для меня самой привлекательной частью Scheme и языков, подобных шепелявлению.
Спасибо,