Scheme为所有变量使用单个名称空间,无论它们是绑定到函数还是其他类型的值.Common Lisp将两者分开,这样标识符"hello"可以引用一个上下文中的函数,而另一个中引用一个字符串.
(注1:此问题需要上述示例;请随意编辑并添加一个,或通过电子邮件发送原作者,我会这样做.)
但是,在某些上下文中,例如将函数作为参数传递给其他函数,程序员必须通过使用明确区分他指定函数变量而不是非函数变量#',如:
(sort (list '(9 A) '(3 B) '(4 C)) #'< :key #'first)
我一直认为这有点像疣,但我最近遇到的一个论点是,这实际上是一个特征:
......重要的区别实际上在于形式的语法,而不在于对象的类型.在不了解所涉及的运行时值的情况下,很明显函数形式的第一个元素必须是函数.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)
Run Code Online (Sandbox Code Playgroud)
这是通过一些额外的语法解决的,NamedFieldPuns扩展特别好:
isOrigin2 Point{x,y} = (x == 0) && (y == 0)
Run Code Online (Sandbox Code Playgroud)
那么,对于问题,超越一致性,Common Lisp vs. Scheme以及一般来说,所有值的单个命名空间与函数和非函数值的单独命名空间有哪些优点和缺点?