在进行sicp练习4.9时如何处理此错误?

时间:2018-12-30 11:36:38

标签: scheme lisp sicp

我正在做sicp的练习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调用正在尝试接近一个未绑定的变量,

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

1 个答案:

答案 0 :(得分:2)

正如@Rainer在评论中所述,您对inner-loop的定义是错误的。

方案中的函数定义为:(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)))