好吧,這是一個相當基本的問題:我正在關注SICP視頻,我對define
,let
和set!
之間的差異有點困惑。define,let和set之間的區別!
1)據Sussman在視頻中,define
被允許附加一個值只能變化一次(REPL中除外),特別是兩行定義不允許。然而,Guile樂意運行此代碼
(define a 1)
(define a 2)
(write a)
和輸出2,如預期。事情是更復雜一點,因爲如果我嘗試這樣做(編輯:上面的定義後)
(define a (1+ a))
我得到一個錯誤,而
(set! a (1+ a))
是允許的。但我不認爲這是set!
和define
之間的唯一區別:我錯過了什麼?
2)define
和let
之間的差異讓我更加困惑。理論上我知道let
用於綁定局部範圍內的變量。不過,在我看來,這可與define
一樣,比如我可以代替
(define (f x)
(let ((a 1))
(+ a x)))
與
(define (g x)
(define a 1)
(+ a x))
和f
和g
工作一樣:尤其是可變a
是綁定外g
。
我可以看到這個有用的唯一方法是let
可能有一個更短的範圍,整個函數的定義。儘管如此,我仍然可以添加一個匿名函數來創建必要的範圍,並立即調用它,就像在javascript中一樣。那麼,let
的真正優勢是什麼?
必須先縮進'(+一個X)'在F'的'的定義,因爲它是let'的'範圍之內。 – 2011-03-23 14:12:13
你說得對,謝謝 – Andrea 2011-03-23 14:18:50
這取決於你使用的方案系統。 – knivil 2011-03-23 20:23:29