我讀到書中局部定義,我遇到了這個例 -球拍
(local ((define (f x) (+ x 5))
(define (g alon)
(cond
[(empty? alon) empty]
[else (cons (f (first alon)) (g (rest alon)))])))
(g (list 1 2 3)))
究竟是什麼local
在這裏做的地方?
我讀到書中局部定義,我遇到了這個例 -球拍
(local ((define (f x) (+ x 5))
(define (g alon)
(cond
[(empty? alon) empty]
[else (cons (f (first alon)) (g (rest alon)))])))
(g (list 1 2 3)))
究竟是什麼local
在這裏做的地方?
local
被記錄在here中作爲其中一種HtDP語言的一部分,或作爲local
模塊的一部分被記錄在here中。讓我們依次看看每一個。首先是HtDP中的那個:
(local [definition ...] expression)
用於表達的組相關定義。每個定義可以是定義或定義結構。評估本地時,每個定義都按順序進行評估,最後評估正文表達。只有本地表達式(包括定義和表達式的右側)中的表達式可以引用定義所定義的名稱。如果在本地定義的名稱與頂級綁定相同,則內部名稱會「陰影」外部名稱。也就是說,在本地內部,任何對該名稱的引用都指內部引用。
而旁邊,所述一個所述local
模塊中:
(local [definition ...] body ...+)
像letrec-語法+值,不同之處在於綁定以相同的方式表示爲頂層或一個模塊中的body:使用define,define-values,define-syntax,struct等。通過部分擴展定義形式,定義與非定義有區別(參見部分擴展)。如在頂層或模塊體中一樣,開始包裝的序列被拼接到定義序列中。
因此,根據使用的語言/模塊,您將知道哪個local
是您找到的。顯然,這不是一種標準的特殊形式。
本地用於在特定功能的範圍內定義一些輔助函數。比如我寫一個函數5添加到給定列表中的所有元素,
(define (add-5-to-list list)
(local
(;; definition area start
(define (f x) (+ x 5))
(define (g alon)
(cond
[(empty? alon) empty]
[else (cons (f (first alon))
(g (rest alon)))]))
) ;; definition area end
(g list)
) ;; local end
) ;; define end
,你在本地一樣可以定義儘可能多的功能。但是你只能在主函數的作用域中使用(這裏的主函數是add-5-to-list)。
這看起來像一個let綁定...一個http://docs.racket-lang.org/reference/let.html。我之前沒有看到「本地」,但它看起來應該和let做同樣的事情,即只爲本地調用(g(list 1 2 3))定義f和g,但不能讓其他部件訪問的代碼。這是你的意思還是別的什麼? – bchurchill 2013-03-06 00:38:57