我有一個文件a.scm
定義這個小程序:關於「set!」和「讓」表情
(define f
(let ((x 0))
(lambda()
(set! x (+ 1 x))
x)))
當打電話f
反覆,結果不斷增加:
CHICKEN
(c) 2008-2016, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.11.0
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
compiled 2016-08-23 on buildvm-13.phx2.fedoraproject.org
#;1> (load "a.scm")
; loading a.scm ...
#;2> (f)
1
#;3> (f)
2
#;4> (f)
3
#;5>
可能有人請扔一些輕至於爲什麼x
綁定到0
只有第一次f
被調用?我預計每次調用f
時,都應執行let
綁定。
另外,如果反覆調用,x
不綁定到0
那麼如何lambda表達式去知道x
是它的身體內的「自由變量」(而不是返回像「變量錯誤不bound`或東西)?
謝謝。
'set!'不會綁定任何東西:它會改變現有的綁定。如果沒有現有的綁定,那麼它的行爲就沒有定義(事實上,很可能是一個錯誤:我對Scheme標準不太熟悉)。在CL中濫用'set!'或'setf' /'setq''來創建綁定通常是Python引發的braindamage的症狀。 – tfb
你說得對 - 我的確在想別的東西。不是Python。 – hyperlinq