我正在使用Scheme (R5RS)为一种类似C的语言编写一个小解释器,并尝试将如下内容转换为:
for (i = 0; i < 100; i++)
{
if (isprime(i)) continue;
else /* do something with i */
}到有效的方案( isprime函数只是一个例子,并不重要)。
然而,在尝试了一段时间后,我还没有找到一种有效/简单的方法来向Scheme中的do循环添加等同于continue语句的语句。更好的是一个"for“宏,它允许使用"continue”和"break“。
我正在考虑改用Common Lisp。这类事情在CL中会更容易吗?
发布于 2011-01-04 05:50:52
我们可以以宏的形式为编写。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 发布于 2011-01-03 22:46:21
CL的tagbody是一个方便的目标:
(let (i)
(tagbody
(setf i 0)
body
(if (isprime i)
(go increment))
(do-something-with i)
increment
(setf i (1+ i))
(if (< i 100)
(go body))))发布于 2011-01-03 22:23:04
我会选择continuations,就像在这个伪模式示例中一样。
只需将当前执行点存储在延续中,并在适当的时候调用它。
(call/cc (lambda break ; jump outside the for
(for 0 100 (lambda i
(call/cc (lambda continue ; jump to the next iteration
(if (isprime i)
(continue)
(break))))))))https://stackoverflow.com/questions/4585071
复制相似问题