(这是一个 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
那么函数和其他所有内容是否在同一个命名空间中都没有关系。 sort(mylist, myless)
如果是一个函数,只会通过类型检查myless
---不需要特殊的语法。有人认为一个命名空间比两个命名空间更美观,但我想关注技术问题。
假设所讨论的语言是静态类型的,那么两个命名空间是否会变得更困难或更容易出错(或者相反,对于一个命名空间)?
(我在我正在研究的领域特定语言的背景下考虑这个问题,我想确保我不会遇到问题。使用两个名称空间来实现会更容易( Lisp-2),并且由于它是静态类型的,因此不需要等效的#'f
。我一般问这个问题是因为我想听听一般观点,也许会意识到我还不知道要问的问题。)