我读到书中局部定义,我遇到了这个例 -球拍
(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