我正在阅读书中有关本地定义的内容,并且遇到了这个示例-
(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
在此处作为一种 HtDP 语言的一部分或在此处作为local
模块的一部分进行了记录。让我们依次看看每一个。首先是 HtDP 中的一个:
(local [definition ...] expression)
将相关定义分组以在表达式中使用。每个定义都可以是定义或定义结构。本地求值时,依次求值每个定义,最后求值主体表达式。只有局部内的表达式(包括定义和表达式的右侧)可以引用定义定义的名称。如果在本地定义的名称与顶级绑定相同,则内部绑定会“遮蔽”外部绑定。也就是说,在本地内部,对该名称的任何引用均指内部名称。
接下来,local
模块中的那个:
(local [definition ...] body ...+)
与 letrec-syntaxes+values 一样,只是绑定的表达方式与顶层或模块体中的方式相同:使用 define、define-values、define-syntax、struct 等。定义与非通过部分扩展定义形式定义(参见部分扩展)。就像在顶层或模块体中一样,begin-wrapped 序列被拼接到定义序列中。
因此,根据使用的语言/模块,您会知道local
您找到的是哪个。显然,它不是标准的特殊形式。
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)。