我不明白的區別是什麼之間(遺憾的人爲的例子):創建本地綁定的'let'或'letrec'和'define'之間有什麼區別?
(define average
(lambda (elems)
(define length
(lambda (xs)
(if (null? xs)
0
(+ 1 (length (cdr xs))))))
(define sum
(lambda (xs)
(if (null? xs)
0
(+ (car xs) (sum (cdr xs))))))
(define total (sum elems))
(define count (length elems))
(/ total count)))
和
(define average
(lambda (elems)
(letrec ((length
(lambda (xs)
(if (null? xs)
0
(+ 1 (length (cdr xs))))))
(sum
(lambda (xs)
(if (null? xs)
0
(+ (car xs) (sum (cdr xs))))))
(total (sum elems))
(count (length elems)))
(/ total count))))
據我所知,他們都創造了新的範圍,在那個範圍內創建4個局部變量,這些變量是相互引用的,並且是自己的,並且評估並返回一個主體。
我在這裏丟失了些什麼,或者是letrec
與作用域define
s同義嗎?
我知道這可能取決於實施;我試圖理解Lisps的基本原理。
嚴格地說,'length'和'sum'保證是* bound *(到位置);不能保證的是他們還沒有被賦予它們的初始值*。即使他們已經被分配了他們,Scheme報告R5RS - R7RS表示,它仍然是一個「錯誤」,就像你在「total」和「count」的初始化子句中那樣引用這些值。 (但是,我不認爲需要實現來檢測和抱怨這個錯誤。)一些更多的差異btw'letrec' /'letrec *':http://stackoverflow.com/q/13078165/272427 – dubiousjim 2012-11-04 17:37:01