scheme - 如何处理在执行 sicp 练习 4.9 时产生的这个错误?

标签 scheme lisp sicp

我正在做 sicp 的 exercise.4.9,我正在尝试实现“for 语句”的语法,它看起来像其他人在 c++ 中看到的:

(for (((i 0) (j 1))
      (< (+ i j) 10)
      ((i (+ i 1))))
     (display "i:")
     (display i)
     (display "\n")
     (display "j:")
     (display j)
     (display "\n"))

语法如下:

(for ((initial-statement) (predicate-statement) (updating-statement)) (for-body))

我生成的是这样的:

((lambda ()
   (define j 1)
   (define i 0)
   (define inner-loop
     (if (< (+ i j) 10)
         (begin (display "i:")
                (display i)
                (display "\n")
                (display "j:")
                (display j)
                (display "\n")
                (set! i (+ i 1))
                (inner-loop))))
   (inner-loop)))

我得到一个错误,说第一个 inner-loop 调用试图接近一个未绑定(bind)的变量,

我想知道我应该生成的正确代码是什么样的?

最佳答案

正如@Rainer 在评论中提到的,您对inner-loop 的定义不正确。

scheme中的一个函数定义为:(define (name ...args) body)

或者如果没有参数:(define (name) body)

以下作品:

((lambda ()
   (define j 1)
   (define i 0)
   (define (inner-loop)
     (if (< (+ i j) 10)
         (begin (display "i:")
                (display i)
                (display "\n")
                (display "j:")
                (display j)
                (display "\n")
                (set! i (+ i 1))
                (inner-loop))))
   (inner-loop)))

关于scheme - 如何处理在执行 sicp 练习 4.9 时产生的这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53977273/

相关文章:

list - 我如何用 Eager 语言制作一个懒惰的列表?

functional-programming - 在 Racket 中定义错误

recursion - 计算句子中奇数的个数

LISP SICP 视频讲座 2a 平均潮湿问题

sicp - 计算过程和程序之间的区别?

clojure - 我在 clojure 中对这个 SICP 问题做错了什么?

lambda - Scheme 如何评估 man or boy 测试?

递归方案

LISP 过滤函数

lisp - 如何在 Common Lisp 中进行模式匹配