Rust 递归过程宏、循环标记和循环字符

Rust 递归过程宏、循环标记和循环字符,rust,macros,Rust,Macros,不久前,我在Scheme中编写了一个程序,该程序将使用宏来发展L系统。本质上,有一些关于如何扩展令牌的规则,这些规则将以递归方式运行。例如,根据规则: F => F F X => X < F > F > => identity (stay >) < => identity (stay <) 等等。在计划中,这是一种魅力。超级简单的匹配和递归宏定义。电话是这样的: ;宏名称iters启动令牌 (evolve-lsys-n 5 X F X

不久前,我在Scheme中编写了一个程序,该程序将使用宏来发展L系统。本质上,有一些关于如何扩展令牌的规则,这些规则将以递归方式运行。例如,根据规则:

F => F F
X => X < F > F
> => identity (stay >)
< => identity (stay <)
等等。在计划中,这是一种魅力。超级简单的匹配和递归宏定义。电话是这样的:

;宏名称iters启动令牌
(evolve-lsys-n 5 X F X)
但我真的很难做到这一点与生锈

标准
宏规则具有模式匹配的优势,这非常好。但不幸的是,据我所知,没有取消引用/准引用,所以我不能真正地进行尾部递归(我想是吧?)

程序宏似乎是一条可行之路,但我也在为如何做到这一点而挣扎

如果输入与我在Scheme中的输入相同(
evolve!(xfx)
),我如何实际循环这些令牌

由于rust功能更强大,我也希望我可以在没有额外空间的情况下获得更具表现力的输入。例如,
evolve!(XFX)
就好了。这可能吗?这在这里似乎没有什么好处,但在定义扩展规则时,它们实际上会变得非常大,因此最好避免使用空格

最后,在Scheme I中,我还能够实现参数化宏。这意味着一些“令牌”将具有参数。一个调用看起来像这样:
evolve!(xf(10)X)
,而
F(10)
的展开式将采用该参数并对其进行处理,例如
F(t)F(t*2)
,因此
F(10)
将展开为
F(10)F(20)

显然,我可以不用宏来完成所有这些。尽管如此,我还是很喜欢使用宏来完成这一切,因为这只是一个有趣的练习,来自于“定义自己的语法”的想法,这是Scheme和lisp语言中最吸引我的部分

谢谢

// 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