在Racket中,嵌套函数定义不需要“本地”吗?

时间:2013-12-11 22:13:55

标签: namespaces local racket

我一直在研究Racket(http://docs.racket-lang.org/continue/)的Web应用程序示例,它经常使用“local”函数来定义仅在另一个函数中使用的函数。我不明白为什么它是必要的,因为嵌套函数无论如何已经是本地的。

以玩具为例,这两个函数完全相同,据我所知:

(define (times6-v1 x)
  (define (times2 y)
    (* 2 y))
  (* 3 (times2 x)))

(define (times6-v2 x)
  (local
    [(define (times2 y)
       (* 2 y))]
    (* 3 (times2 x))))

无论哪种方式,“times2”只能在每个函数中访问,而不能在全局命名空间中访问。那么,为什么还要使用本地?

2 个答案:

答案 0 :(得分:2)

本地'表格用于教学语言,并预先确定内部定义的存在。因此,如果您将语言级别设置为"中级",您将看到没有' local'的版本。停止工作。

自然的下一个问题:为什么不摆脱本地?事实是,本地'在教学语言中有一些价值,至少有两个原因:

  • 当您要求学生明确说明他们生成局部变量的意图时,您可以提供更好的错误消息,
  • 如果改变教学语言,步进器会很难过。 :)

答案 1 :(得分:2)

在Racket中,与学生语言相反,local允许使用与顶层相同的形式表达语法和值:例如。 definedefine-for-syntax等等。

请参阅:racket/local

various let forms进行比较。