这是一个CS理论类型的问题,希望可以接受。 "Lisp-1 vs Lisp-2" 辩论是关于函数命名空间是否应该与所有其他变量的命名空间不同,在允许程序员将函数作为值传递的动态类型语言中很重要。Lisp-1语言(如Scheme)只有一个命名空间,因此您不能同时拥有名为
在我看来,主要的技术问题,即需要消除函数与整数之间的歧义,如果语言也是静态类型的(与大多数Lisp不同),则不是问题。例如,如果一个
如果函数和其他所有东西在同一个命名空间中或不在同一命名空间中,则无所谓。只有当
假设所涉及的语言是静态类型的,那么两个命名空间是否会使某些事情更加困难或更容易出错(反之亦然)?
(我正在考虑这个问题,在我工作的领域特定语言的上下文中,我想确保我将来不会遇到问题。使用两个命名空间(Lisp-2)实现会更容易,因为它是静态类型的,所以不需要等效于
f
的函数和整数(一个会遮盖另一个,就像两个名为f
的整数)。Lisp-2语言(如Common Lisp)有两个命名空间,因此您可以拥有两个f
变量,但您必须使用特殊语法指定您想要的是哪一个(#'f
是函数,f
是整数)。在我看来,主要的技术问题,即需要消除函数与整数之间的歧义,如果语言也是静态类型的(与大多数Lisp不同),则不是问题。例如,如果一个
sort
函数需要一个列表和一个显式签名的小于函数,def sort[X](list: List[X], lessThan: Function[X, Boolean]) // Scala syntax; had to pick something
如果函数和其他所有东西在同一个命名空间中或不在同一命名空间中,则无所谓。只有当
myless
是一个函数时,sort(mylist,myless)
才会通过类型检查---不需要特殊的语法。一些人认为一个命名空间比两个命名空间更美观,但我想重点讨论技术问题。假设所涉及的语言是静态类型的,那么两个命名空间是否会使某些事情更加困难或更容易出错(反之亦然)?
(我正在考虑这个问题,在我工作的领域特定语言的上下文中,我想确保我将来不会遇到问题。使用两个命名空间(Lisp-2)实现会更容易,因为它是静态类型的,所以不需要等效于
#'f
。我提出了一般性的问题,因为我想听取一般性的观点,也许还能意识到我尚未知道的问题。)