在lisp中,我想编写一个宏for循环,而不使用lisp中的循环函数,它模仿C或Java中的for循环。我想只用基本的 Lisp 语法来实现这一点。
loop
和 do
以及其他迭代宏通常会扩展为 tagbody
形式。
如果您想编写自己的迭代宏,最好看看如何在 Common Lisp 实现中扩展
loop
。这是 SBCL 中 loop
形式的扩展:
CL-USER> (macroexpand-1 '(loop for x from 1 to 10 do (print x)))
(BLOCK NIL
(LET ((X 1))
(DECLARE (IGNORABLE X)
(TYPE (AND REAL NUMBER) X))
(TAGBODY
SB-LOOP::NEXT-LOOP
(WHEN (> X '10) (GO SB-LOOP::END-LOOP))
(PRINT X)
(SB-LOOP::LOOP-DESETQ X (1+ X))
(GO SB-LOOP::NEXT-LOOP)
SB-LOOP::END-LOOP)))
T