我正在为Scheme (R5RS) 中的类C 语言编写一个小型解释器,并尝试转换如下内容:
for (i = 0; i < 100; i++)
{
if (isprime(i)) continue;
else /* do something with i */
}
到有效的Scheme(isprime函数只是一个例子,并不重要)。
但是,经过一段时间的尝试,我一直无法找到一种有效/简单的方法来将 continue 语句的等效项添加到 Scheme 中的 do 循环中。更好的是允许使用“继续”和“中断”的“for”宏。
我正在考虑切换到 Common Lisp。这种事情在 CL 中会更容易吗?
最佳答案
我们可以将FOR写成宏。 Common Lisp 版本:
(defmacro for ((var start end) &body body)
(let ((block-name (gensym "BLOCK")))
`(loop for ,var from ,start below ,end
do (block ,block-name
(flet ((continue ()
(return-from ,block-name)))
,@body)))))
CL-USER 2 > (for (i 10 20)
(if (evenp i) (continue))
(print i))
11
13
15
17
19
关于loops - for/继续方案/lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4585071/