球拍

2013-03-06 123 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)。