计划使用的所有变量单个命名空间,不管他们是否被绑定到函数或其他类型的值。 Common Lisp中分离两个,使得标识符“你好”可以指的是在功能一个上下文,并且在另一个字符串。
(注1:这个问题需要上述的例子;随意编辑和添加一个或电子邮件原作者用它,我将这样做。)
然而,在某些情况下,如通过功能参数等功能,程序员必须明确区分他指定的函数变量,而不是一个非函数变量,通过使用#'
,如:
(sort (list '(9 A) '(3 B) '(4 C)) #'< :key #'first)
我一直认为这是一个有点疣,但我最近碰到一个运行参数 ,这实际上是一个功能:
...的重要区别其实就在于形式的语法,而不是对象的类型。 不知道有关所涉及的运行值什么,这是很清楚的是,函数形式的第一个元素必须是一个函数。 CL采用这一事实,并使它成为语言的一部分,这也可以(而且必须)静态确定的宏观和特殊形式一起。 所以我的问题是:为什么你要的功能和变量名的名字是在同一个命名空间,当函数名的主要用途是哪里出现一个变量名不太会出现在哪里?
考虑类名称的情况下:为什么要一个名为Foo类禁止使用的变量命名为FOO? 我想通过姓名FOO被提及班级唯一的一次是在期待一个类名上下文。 如果,在个别情况下,我需要得到这势必类名FOO类对象,也就是找到-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的方案对比和一般的优点和缺点,?
这两种不同的方法有名字:Lisp的-1和Lisp-2。 一个Lisp-1具有两个变量和功能的单个命名空间(如方案),而一个Lisp-2具有用于变量和函数单独的名称空间(如在Common Lisp的)。 我提到这一点,因为你可能不知道的术语,因为你没有提到它在你的问题。
维基百科是指这场辩论 :
无论是功能不同的命名空间是一个优势是竞争的Lisp的社会根源。 它通常被称为Lisp的1对Lisp的2辩论。 Lisp的1指的是方案的模型和Lisp-2是指Common Lisp的模型。 这些名称由Richard P. Gabriel和肯特·皮特曼,其广泛的两种方法比较在1988年创造的纸张。
Gabriel和皮特曼的论文题目中功能的细胞和值单元分离的技术问题解决了这个问题非常。
其实,简列如由Richard Gabriel和肯特·皮特曼纸 ,辩论是关于Lisp的5对Lisp的6,因为还有其他几个命名空间已经存在,在被提及的类型名称,标签名称,块名称的纸,声明名称。 编辑:这似乎是不正确的,因为Rainer在评论中指出:其实计划似乎是一个Lisp-1。 以下是这个错误基本上不受影响,虽然。
是否一个符号表示待执行的东西或东西将被称为总是从上下文中清楚。 投掷函数和变量到同一个命名空间是主要的限制:程序员不能为的事情和动作使用相同的名称。 什么是Lisp的5失控的这仅仅是从一个不同的命名空间比什么可以避免当前上下文暗示引用一些东西句法开销。 编辑:这不是全貌,只是表面。
我知道,Lisp的5支持者喜欢的事实,功能是数据,而这是语言表达的核心。 我喜欢这样的事实,我可以打电话清单“列表”和汽车“车”不混淆我的编译器和函数是一个从根本上特殊的数据的反正。 编辑:这是我的主要观点:不同的命名空间不是疣的。
我也喜欢什么帕斯卡康斯坦萨不得不说这件事。
我在Python(统一命名空间)与红宝石(对于方法与非方法不同的命名空间)遇到了类似的区别。 在这方面,我更喜欢Python的方法 - 例如,用这种方法,如果我想要的东西,其中一些功能,而有些则没有列表,我没有做任何事情与他们的名字不同根据他们的“功能性”,例如。 类似的考虑适用于哪些函数对象是被周围到处传说,而不是所谓的(参数,并从高阶函数等,等返回值)的所有情况。
非函数可以调用,太(如果他们的类定义__call__
,在Python的情况下- “操作符重载”的一个特例),所以“上下文区别”不一定清楚,无论是。
然而,我的“口齿不清 - 旧”经验/主要是与计划,而不是Common Lisp的,所以我可以通过与最终来自于经验的统一命名空间熟悉下意识偏见。
在计划函数的名称仅仅是一个功能作为其值的变量。 无论我做(define x (y) (zy))
或(let ((x (lambda (y) (zy))))
我定义一个函数,我可以打电话,所以的想法,“一个变量名不太会出现有”是一种似是而非的就方案而言。
方案是一个典型的功能性的语言,所以治疗的功能数据是它的原则之一。 其功能是一种自己一个储存像所有其他的数据是承载的想法的一种方式。
我看到的最大的缺点,至少在Common Lisp的,是可理解性。 我们都同意,它使用不同的命名空间的变量和函数,但有多少它有? 在PAIP,Norvig还表明,它具有“至少七”的命名空间。
当语言的经典书籍,由德高望重的程序员编写一个,甚至不能说在其出版的图书一定,我觉得有一个问题。 我没有与多个命名空间的问题,但我希望的语言是,至少,很简单, 有人可以完全理解的是这个方面。
我很舒服使用相同的符号变量和函数,但我求助于使用不同的名称,因为惧怕比较模糊的区域(碰撞命名空间可真是很难调试!),那实在不应该的案件。
有好东西,这两种方法。 然而,我发现,当它很重要,我喜欢有两种功能:LIST和AA变量列表就不必明确他们中的一个错误。
文章来源: Separate Namespaces for Functions and Variables in Common Lisp versus Scheme