【发布时间】:2010-11-04 11:49:05
【问题描述】:
Scheme 为所有变量使用一个命名空间,无论它们是否绑定到函数或其他类型的值。 Common Lisp 将两者分开,因此标识符“hello”可以在一个上下文中引用一个函数,而在另一个上下文中引用一个字符串。
(注1:这个问题需要上面的一个例子;随意编辑它并添加一个,或者给原作者发电子邮件,我会这样做。)
但是,在某些情况下,例如将函数作为参数传递给其他函数,程序员必须使用#' 明确区分他指定的是函数变量,而不是非函数变量,如下所示:
(sort (list '(9 A) '(3 B) '(4 C)) #'我一直认为这有点小问题,但我最近遇到了argument,说这实际上是一个功能:
...这 重要的区别实际上在于形式的语法,而不是 对象的类型。在不了解运行时值的情况下 很明显,函数形式的第一个元素 必须是一个函数。 CL 接受了这一事实,并将其作为 语言,以及宏和特殊形式,它们也可以(而且必须) 静态确定。所以我的问题是:你为什么要 函数名和变量名要相同 命名空间,当函数名的主要用途是出现在 变量名很少想出现?考虑类名的情况:为什么一个名为 FOO 的类要阻止 使用名为 FOO 的变量?唯一一次我会提到 名为 FOO 的类在需要类名的上下文中。如果,在 极少数情况下我需要获取绑定到的类对象 类名 FOO,有 FIND-CLASS。从经验来看,这个论点对我来说确实有些道理; Haskell 中也有类似的情况,字段名称也是用于访问字段的函数。这有点尴尬:
data Point = Point { x, y :: Double {- lots of other fields as well --} } isOrigin p = (x p == 0) && (y p == 0)这可以通过一些额外的语法来解决,
NamedFieldPuns扩展特别好:isOrigin2 Point{x,y} = (x == 0) && (y == 0)那么,对于这个问题,除了一致性之外,Common Lisp 与 Scheme 以及一般而言,所有值的单个命名空间与函数和非函数值的单独命名空间相比有哪些优点和缺点?
【问题讨论】:
-
“Lisp 与 Scheme”有点错误。 Lisp 是编程语言家族,Scheme 是 Lisp 的一种方言。 Common Lisp、Emacs Lisp、ISLisp、AutoLisp、Clojure 等也是 Lisp 家族的成员。有几种 Lisp 方言具有单独的命名空间(用于函数和变量),而另一些则没有。例如,新的 Lisp 方言 Clojure 就没有。 ISLisp(一种 ISO 标准化的 Lisp 方言)可以。
-
你是对的。我已更新帖子以使用“Common Lisp”而不仅仅是“Lisp”。
标签: variables scheme lisp common-lisp lisp-2