Scheme - 动态范围和无限循环

时间:2011-12-23 13:13:04

标签: scope lisp scheme

我读了一本关于计划的书,它有下一个例子:

(define map
   (lambda (f s)
     (if (null? s)
         '()
          (cons (f (car s))
                (map f (cdr s)))))

(map (lambda (s)
        (set! s '(1 2 3 4))
        'hello)
     '(a b c d))

它说在动态范围内,我们将进入无限循环。但为什么?据我所知,在我们申请申请后,我们到达地图

f = (lambda (s)
        (set! s '(1 2 3 4))
        'hello)

和s = '(a b c d)。现在,对于第一次运行,我们将在f上应用(car '(a b c d)

((lambda (s)
    (set! s '(1 2 3 4))
    'hello)
 (car '(a b c d)))

现在,它将a更改为(1 2 3 4)。等等......这里的循环在哪里?

1 个答案:

答案 0 :(得分:1)

我认为作者的意思是,在f (car s)执行后,s的值将为'(1 2 3 4),因此(cdr s)的值将为'(2 3 4) },所以每次无限期都会给(map f '(2 3 4))打电话。

但是我不认为这是对动态范围的准确描述。由于s是lambda的参数(因此不是自由变量),因此只有set!s函数的map应该影响该参数不受影响。所以应该没有无限循环 - 无论你是否使用动态范围。如果我将代码转换为elisp(动态范围),代码确实不会导致无限循环。所以我说你的书说使用动态范围会有无限循环是错误的。