为什么多个命名空间?

Vij*_*hew 13 lisp scheme namespaces common-lisp

在Common Lisp中为值和函数设置单独的命名空间的设计决策背后的基本原理是什么?支持和反对的论据是什么?

Gre*_*ill 17

请参阅Richard P. Gabriel的论文" 功能细胞和价值细胞分离技术问题",以便对该主题进行全面的学术处理.


Zor*_*orf 8

Common Lisp基本上是原始Lisp 1.5的后代,或者更确切地说是它的不同方言的统一.原来的Lisp 1.5就是现在所谓的Lisp-2.因为它回到了六十年代,而且你可以将函数传递给其他函数的事实很奇怪.没有人会想到让他们共享相同的命名空间.几乎所有今天发明的支持高阶函数和匿名函数的语言都选择单命名空间方法.包括Clojure,它更接近Common Lisp而不是Scheme.

像Clojure一样,Scheme并不是Lisp 1.5中的一种不同的方言,并且出于他们的目的它是有道理的.

当然,在Clojure中,向量,哈希映射,集合以及所有这些也可以应用于参数,因此在某种意义上,Clojure中的向量可以被视为一个函数,它采用自然数并从中生成一个值.

  • (可能还值得一提的是,非常旧的lisp(s)中的函数类似于Emacs Lisp中的函数 - 只是一个以`lambda`开头的列表.) (3认同)

Jas*_*uit 7

尽管在理论上可能存在大量的论据,但我敢打赌,它在很大程度上是哲学的起源.Scheme,一个Lisp-1,优于实用性,并define为变量和函数选择相同的语法,这使得单个命名空间感觉自然(并鼓励编程的功能风格).Common Lisp倾向于偏爱实用性和权力优于优雅,并且是尝试建立共识,因此看到现有的双命名空间解决方案被广泛接受并且运行良好,接受它.

然而,在实践中,它主要意味着三件事:

  • 在Common Lisp(和其他Lisp-2)中,你必须经常使用funcall
  • 在Scheme(和其他Lisp-1)中,你必须注意不要用变量覆盖所需的函数名; 例如,函数参数 lst而不是list
  • 在互联网上,会有争论

然而,这是为什么有些人喜欢一个Lisp到另一个人的一个主要因素.

  • 差异的结果比仅使用`funcall`或避免名称冲突更深入:在Scheme中使用高阶函数更自然,因此更惯用,因此编译器将努力优化它.但是,在CL中,如果你使用`defvar`来定义变量,然后``funcall`它,那么编译器很可能将它编译成比使用函数定义慢得多的代码.这类似于CLers更喜欢循环结构,而计划者更喜欢使用尾调用.但当然你的第三点是最重要的一点...... (6认同)