我读了一本关于计划的书,它有下一个例子:
(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)
。等等......这里的循环在哪里?
答案 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(动态范围),代码确实不会导致无限循环。所以我说你的书说使用动态范围会有无限循环是错误的。