【发布时间】:2013-11-09 13:20:56
【问题描述】:
(这是一个 CS 理论类型的问题;我希望这是可以接受的。)
“Lisp-1 vs Lisp-2”的争论是关于函数的命名空间是否应该与所有其他变量的命名空间不同,这与允许程序员将函数作为值传递的动态类型语言相关。 Lisp-1 语言(例如 Scheme)有一个命名空间,所以你不能同时拥有一个名为 f 的函数和一个名为 f 的整数(一个会影响另一个,就像两个名为 f 的整数一样) . Lisp-2 语言(例如 Common Lisp)有两个命名空间,所以你可以同时拥有 f 变量,但你必须用特殊语法指定你的意思(#'f 是函数,f 是整数)。
在我看来,如果语言也是静态类型的(与大多数 Lisps 不同),主要的技术问题,即消除函数与整数的歧义的需要不是问题。例如,如果 sort 函数需要一个列表和一个小于函数作为显式签名,
def sort[X](list: List[X], lessThan: Function[X, Boolean]) // Scala syntax; had to pick something
那么函数和其他所有内容是否在同一个命名空间中都没有关系。如果myless 是一个函数,sort(mylist, myless) 只会通过类型检查——不需要特殊语法。有人认为一个命名空间比两个命名空间更美观,但我想重点关注技术问题。
假设所讨论的语言是静态类型的,两个命名空间是否会变得更困难或更容易出错(或者相反,对于一个命名空间而言)?
(我在我正在研究的领域特定语言的背景下考虑这个问题,我想确保我不会在未来遇到问题。用它来实现会更容易两个命名空间(Lisp-2),因为它是静态类型的,所以不需要#'f。知道要问。)
【问题讨论】:
-
所以你想根据类型选择使用 Lisp-1 还是 Lisp-2?这似乎既令人困惑又容易出错。
-
为什么实现 Lisp-2 会更容易?您提供的链接引用了类型检查的性能成本,但如果您的语言是静态类型的,您就不会遇到这个问题。
标签: namespaces lisp static-typing lisp-2