loops - for/继续方案/lisp

标签 loops functional-programming scheme common-lisp

我正在为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/

相关文章:

scheme - 我如何使用和/或代替 if/cond?

syntax - 不了解 SICP 中的方案程序

scheme - 为什么不使用 letrec 作为修复?

php - 如何将循环值从选择表单中的隐藏输入字段传递到 Ajax

javascript - 这个函数可以重写为 Ramda 管道吗?如何?

python - 跟踪 Joblib 中并行 for 循环的索引

scala - 如何在 Scala 中对函数进行柯里化(Currying)

javascript - 使用循环在数组中存储闭包函数

php - 更新查询不在 while 循环中执行

javascript - 遍历 div 内的输入