(这是CS理论类型的问题;我希望这是可以接受的。)
“Lisp-1 vs Lisp-2”争论是关于函数的命名空间是否应该与所有其他变量的命名空间不同,并且它与动态类型语言相关,允许程序员将函数作为值传递。 Lisp-1语言(例如Scheme)有一个名称空间,因此你不能同时拥有一个名为f
的函数和一个名为f
的整数(一个会影响另一个,就像两个整数命名一样) f
)。 Lisp-2语言(例如Common Lisp)有两个名称空间,因此您可以同时拥有两个f
变量,但必须使用特殊语法指定您的意思(#'f
是函数而f
1}}是整数。)
在我看来,如果语言也是静态类型的(与大多数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
。我一般都会问这个问题,因为我想听一般的观点,也许会发现我不知道的问题。但还是知道要问。)
答案 0 :(得分:5)
对多个名称空间的一个非常常见的反对意见是它使形式语义复杂化以具有任意数量的名称空间。一个名称空间简化了一些事下一个最简单的,所以我被告知(我不写这些东西),是一个无限数量的命名空间 - 我尝试做过一次但只有一半(see here if curious,但我认为它不是你在这种情况下要求的是什么)。当你将它限制在有限数量的命名空间时,正式的语义变得混乱,或者我被告知。当然,它也会使任何类型的编译器或解释器变得更复杂。这种反对意见跨越了审美和技术之间,因为它不是基于技术难度本身的异议,因为没有超级人类智能需要做多个名称空间,只需要大量额外的手工劳动,而是反对做一个更复杂的语义意味着更多的代码,更多的特殊情况,更多的错误机会等。就个人而言,我并没有受到这些争论的影响,我只是在你提出要求时指出它们。我想你会发现这些论点并不是致命的,你可以继续做你正在做的事情并看看它在哪里。我更关心程序员/最终用户体验而不是实现者难度。但我提到这个论点,因为我尊重的其他人似乎认为这是一个大问题,我相信这是你的难题和容易出错的问题的正确答案。
请注意,顺便说一下,当Gabriel和我写Technical Issues of Separation in Function Cells and Value Cells时,我需要一些文字来帮助我避免说“类似方案”和“类似Lisp”,因为人们有更不相干的理由更喜欢与命名空间无关。使用术语“Lisp1”和“Lisp2”使我能够使论文不再成为Scheme与Lisp的争论,并且将读者的注意力集中在命名空间问题上。最后,ANSI Common Lisp最终得到了至少4个名称空间(函数,值,go标签,块标签),或者如果你计算类型(在某些方面有点像命名空间而不是其他方式),可能只有5个,但在任何情况下都不是2.所以严格来说它将是一个Lisp4或Lisp5。但无论哪种方式,它仍然让那些喜欢单个命名空间的人感到恐惧,因为任何大于1的任意有限数都往往是不可接受的。
我个人的建议是,你应该根据你个人对正确的感觉来设计语言。对于某些语言,一个命名空间很好。对于其他人没有。只是不要这样做,因为有人告诉你任何一种方式必须是正确的方式 - 这是你选择的合法方式。
有些人认为一个命名空间在概念上更简单,但我认为这取决于简单性的概念。有人说更小更简单(通过命名或实现)。我声称概念上最简单的是你的大脑对事物的看法最为同构,并且你的大脑可能并不总是认为“小”是为了“简单”。我引用至少一个例子,即现有的每种人类语言对同一个词都有多个定义,几乎都是通过上下文解决的(你的类型推理可能是上下文信息的一个例子),这表明wetware旨在消除歧义。这样的事情,如果你不让它关心这些事情,你的大脑正在浪费它的一些自然能力。也许这种上下文推理确实增加了语言实现的复杂性,但语言只实现了一次,并且被多次使用,因此有充分理由优化最终用户体验,而不是实现者体验。这是一项后来获得回报的投资。
坚持思考你想要的事情。更多地担心让你的语言有一个良好的感觉,以及你想做什么是可以实现的,即使它确实需要工作和额外检查代码。对于每种语言而言,语言设计决策都不是正确的 - 语言是生态学,重要的是语言元素相互配合,而不是语言元素与其他语言相匹配。实际上,如果语言完全相同,那么拥有多种语言将毫无意义。