2

(这是一个 CS 理论类型的问题;我希望这是可以接受的。)

Lisp-1 vs Lisp-2 ”的争论是关于函数的命名空间是否应该与所有其他变量的命名空间不同,并且它与允许程序员将函数作为值传递的动态类型语言相关。Lisp-1 语言(例如 Scheme)有一个命名空间,因此您不能同时拥有一个命名的函数f和一个命名的整数f(一个会影响另一个,就像两个命名的整数一样f)。Lisp-2 语言(例如 Common Lisp)有两个命名空间,因此您可以同时拥有两个变量,但您必须使用特殊语法(是函数和整数)f指定您所指的变量。#'ff

在我看来,如果语言也是静态类型的(与大多数 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。我一般问这个问题是因为我想听听一般观点,也许会意识到我还不知道要问的问题。)

4

1 回答 1

6

对多个名称空间的一个非常常见的反对意见是,它使形式语义复杂化以具有任意数量的名称空间。一个命名空间使事情变得简单。下一个最简单的,所以我被告知(我不写这些东西),是无限数量的命名空间——我尝试过一次但只完成了一半(如果好奇,请看这里,尽管我认为这不是您在这种情况下所要求的)。当你将它限制在有限数量的命名空间中时,形式语义就会变得混乱,或者我被告知。当然,它也使任何类型的编译器或解释器变得更加复杂。这种反对跨越美学和技术,因为它不是基于技术难度本身的反对,因为不需要超人的智慧来做多个命名空间,只是需要大量额外的体力劳动,而是反对做一个更复杂的语义意味着更多的代码,更多的特殊情况,更多的错误机会等。就我个人而言,我不会被这些论点所左右,我只是在你问的时候指出它们。我想你会发现这样的论点不是致命的,继续你做的事情是可以的 重新做,看看它会导致什么。我更关心程序员/最终用户的体验,而不是实现者的难度。但我提到这个论点是因为我尊重的其他人似乎认为这是一件大事,我相信这是对你关于难度和容易出错的问题的正确答案。

顺便提一下,当 Gabriel 和我写《功能细胞和价值细胞分离的技术问题》时,我需要一些词来帮助我避免说“Scheme-like”和“Lisp-like”,因为人们有不相关的理由偏爱与命名空间无关的 Scheme。使用“Lisp1”和“Lisp2”这两个术语让我避免了这篇论文成为一场 Scheme 与 Lisp 的争论,并让读者将注意力集中在命名空间的问题上。最后,ANSI Common Lisp 至少有 4 个命名空间(函数、值、go 标签、块标签),如果计算类型(在某些方面有点像命名空间,但在其他方面不是),可能有 5 个,但在任何情况下都不是 2。所以严格来说它将是 Lisp4 或 Lisp5。但无论哪种方式,它仍然让那些喜欢单一命名空间的人感到恐惧,因为任何大于 1 的任意有限数往往对他们来说都是不可接受的。

我个人的建议是你应该根据你个人对正确的感觉来设计语言。对于某些语言,一个命名空间就可以了。对于其他人没有。只是不要这样做,因为有人告诉你任何一种方式都必须是正确的方式——这确实是你的选择。

有人认为一个命名空间在概念上更简单,但我认为这取决于简单的概念。有人说更小更简单(在符号上或实现上)。我声称概念上最简单的东西与你的大脑对事物的看法最同构,而且你的大脑可能并不总是以“小”为“简单”。我至少举一个例子,现有的每一种人类语言对同一个词都有多个定义,几乎都由上下文解决(您的类型推断可能是上下文信息的一个例子),这表明湿件旨在消除歧义这样的事情,如果你不让它关心这些事情,你的大脑就会浪费它的一些自然能力。也许确实这种上下文推断增加了语言实现的复杂性,但语言只实现一次,并且被多次使用,因此完全有理由优化最终用户体验,而不是实现者体验。这是一项以后会得到回报的投资。

坚持按照自己的意愿思考事情。更多地担心让你的语言有良好的感觉,以及你想要做的事情是否完全可以实现,即使它确实需要工作和额外的代码检查。没有一种语言设计决策对每种语言都是正确的——语言是生态学,重要的是语言元素相互配合良好,而不是语言元素与其他语言匹配。事实上,如果语言都一样,那么拥有多种语言将毫无意义。

于 2014-01-18T07:06:40.603 回答