Рекурсивные процедурные макросы, цикл по токенам и цикл по символам - PullRequest
1 голос
/ 27 мая 2020

Я написал программу на схеме 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 и языков, подобных шепелявлению.

Спасибо,

...