我正在阅读本书中的本地定义,我遇到了这个例子 -
(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
到底做了什么?
答案 0 :(得分:6)
local
在here中作为HtDP语言之一或here作为local
模块的一部分进行了记录。让我们依次看每一个。首先是HtDP中的一个:
(local [definition ...] expression)
用于表达的组相关定义。每个定义可以是define或define-struct。在评估local时,将按顺序评估每个定义,最后评估body表达式。只有本地(包括定义和表达式的右侧)中的表达式可以引用定义定义的名称。如果在本地定义的名称与顶级绑定相同,则内部名称“遮蔽”外部名称。也就是说,在本地内部,对该名称的任何引用都是指内部引用。
接下来是local
模块中的那个:
(local [definition ...] body ...+)
与letrec-syntaxes +值类似,不同之处在于绑定的表达方式与顶层或模块体中的表达方式相同:using define,define-values,define-syntax,struct,通过部分扩展定义形式(见部分扩展),定义与非定义不同。与在顶层或模块体中一样,开始包装的序列被拼接到定义序列中。
因此,根据所使用的语言/模块,您将知道您找到的local
。显然,它不是标准的特殊形式。
答案 1 :(得分:1)
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
您可以在本地定义任意数量的功能。但是你只能在main函数的范围内使用(这里的main函数是add-5-to-list)。