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这里做什么?

4

2 回答 2

6

local此处作为一种 HtDP 语言的一部分或在此处作为local模块的一部分进行了记录。让我们依次看看每一个。首先是 HtDP 中的一个:

(local [definition ...] expression)将相关定义分组以在表达式中使用。每个定义都可以是定义或定义结构。本地求值时,依次求值每个定义,最后求值主体表达式。只有局部内的表达式(包括定义和表达式的右侧)可以引用定义定义的名称。如果在本地定义的名称与顶级绑定相同,则内部绑定会“遮蔽”外部绑定。也就是说,在本地内部,对该名称的任何引用均指内部名称。

接下来,local模块中的那个:

(local [definition ...] body ...+)与 letrec-syntaxes+values 一样,只是绑定的表达方式与顶层或模块体中的方式相同:使用 define、define-values、define-syntax、struct 等。定义与非通过部分扩展定义形式定义(参见部分扩展)。就像在顶层或模块体中一样,begin-wrapped 序列被拼接到定义序列中。

因此,根据使用的语言/模块,您会知道local您找到的是哪个。显然,它不是标准的特殊形式。

于 2013-03-06T00:45:24.200 回答
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

您可以在本地定义任意数量的函数。但是只能在主函数的范围内使用(这里的主函数是add-5-to-list)。

于 2013-03-07T22:49:04.450 回答