【问题标题】:local in racket本地球拍
【发布时间】:2013-03-06 00:34:15
【问题描述】:

我正在阅读书中有关本地定义的内容,并且遇到了这个示例-

(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 究竟在这里做什么?

【问题讨论】:

  • 这看起来像一个 let 绑定......就像docs.racket-lang.org/reference/let.html。我以前没见过“local”,但它看起来应该和 let 做同样的事情,即只在本地为调用定义 f 和 g (g (list 1 2 3)) 但不能让其他部分可以访问的代码。这是你的意思还是发生了其他事情?

标签: scheme racket


【解决方案1】:

local 记录在 here 作为 HtDP 语言之一的一部分,或者记录在 here 作为 local 模块的一部分。让我们依次看看每一个。首先是 HtDP 中的那个:

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

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

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

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

【讨论】:

    【解决方案2】:

    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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2011-02-22
      相关资源
      最近更新 更多