球拍局部

时间:2013-03-06 00:34:15

标签: scheme racket

我正在阅读本书中的本地定义,我遇到了这个例子 -

(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到底做了什么?

2 个答案:

答案 0 :(得分:6)

localhere中作为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)。