球拍

2013-03-06 97 views
4

我讀到書中局部定義,我遇到了這個例 -球拍

(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在這裏做的地方?

+1

這看起來像一個let綁定...一個http://docs.racket-lang.org/reference/let.html。我之前沒有看到「本地」,但它看起來應該和let做同樣的事情,即只爲本地調用(g(list 1 2 3))定義f和g,但不能讓其他部件訪問的代碼。這是你的意思還是別的什麼? – bchurchill 2013-03-06 00:38:57

回答

6

local被記錄在here中作爲其中一種HtDP語言的一部分,或作爲local模塊的一部分被記錄在here中。讓我們依次看看每一個。首先是HtDP中的那個:

(local [definition ...] expression)用於表達的組相關定義。每個定義可以是定義或定義結構。評估本地時,每個定義都按順序進行評估,最後評估正文表達。只有本地表達式(包括定義和表達式的右側)中的表達式可以引用定義所定義的名稱。如果在本地定義的名稱與頂級綁定相同,則內部名稱會「陰影」外部名稱。也就是說,在本地內部,任何對該名稱的引用都指內部引用。

而旁邊,所述一個所述local模塊中:

(local [definition ...] body ...+)像letrec-語法+值,不同之處在於綁定以相同的方式表示爲頂層或一個模塊中的body:使用define,define-values,define-syntax,struct等。通過部分擴展定義形式,定義與非定義有區別(參見部分擴展)。如在頂層或模塊體中一樣,開始包裝的序列被拼接到定義序列中。

因此,根據使用的語言/模塊,您將知道哪個local是您找到的。顯然,這不是一種標準的特殊形式。

1

本地用於在特定功能的範圍內定義一些輔助函數。比如我寫一個函數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)。