更新2:我已經意識到我的原始答案是正確的,回滾到原來的,但會添加一些澄清說明。
在方案中,let*
允許以後的值取決於較早的值。因此,例如,你可以寫(在通常的語法):
(let* ((foo 3)
(bar (+ foo 1))
(baz (* bar 2)))
(* foo bar baz))
結合foo
3,bar
至4,baz
至8,並返回72課本的實現允許這一點。
但是,您的實現不允許這樣做 - 它要求獨立評估所有值。然而,它是let
的正確實現,而不是let*
。
您的教科書答案的工作方式是早期的值在之前的值之前被綁定。 因此,例如,在教科書的執行上面的代碼如下:
((lambda (foo)
((lambda (bar)
((lambda (baz) (* foo bar baz)) (* bar 2)))
(+ foo 1)))
3)
但是,如果您嘗試使用您的實現以同樣的方式:
((lambda (foo bar baz) (* foo bar baz)) 8 (+ foo 1) (* bar 2))
; Error - foo and bar aren't bound
那麼foo
在(+ foo 1)
會是未結合的,作爲foo
是在範圍上並不存在(相同於(* bar 2)
的bar
。
請注意,在您的實現中,(e)
應該只是e
,就像教科書的實現一樣;前者是一個熱門的電話,而後者只是一個表達。
可能重複[如何表達讓\ *爲lambda表達式(不是正規LET) ](http://stackoverflow.com/questions/16698548/how-to-express-let-as-a-lambda-expression-not-the-regular-let) – GoZoner