13
|
Vijay Mathew Chor-ming Lung · 技术社区 · 14 年前 |
![]() |
1
8
普通的lisp基本上是源于原始lisp 1.5的后代,或者更确切地说,是其分散方言的统一体。最初的Lisp 1.5现在被称为Lisp-2。因为它早在60年代,你可以把函数传递给其他函数这一事实已经够奇怪了。没有人会考虑让他们共享相同的名称空间。如今,几乎所有支持高阶函数和匿名函数的语言都选择单名称空间方法。包括Clojure,它在其他方面更接近普通Lisp而不是Scheme。 和clojure一样,scheme最初并不是一种与lisp 1.5不同的方言,出于它们的目的,它是有意义的。 当然,在clojure中,向量、散列图、集合以及所有可以应用于参数的东西,所以在某种意义上,clojure中的向量可以被看作是一个函数,它接受自然数并从中产生一个值。 |
![]() |
2
16
请看理查德·加布里埃尔的论文 Technical Issues of Separation in Function Cells and Value Cells 对这门学科进行全面的学术研究。 |
![]() |
3
7
虽然理论上可能有很多不同的论点,但我敢打赌,这在很大程度上是哲学的起源。Scheme是一个lisp-1,它更喜欢优雅而不是实用性,并且选择了同样的风格。
然而,在实践中,它主要意味着三件事:
然而,这是一些人喜欢一个口齿不清的主要原因之一。 |
![]() |
4
4
实际上,我喜欢有多个名称空间(甚至超过两个);它使用户和编译器编写器(实现)更容易:
|
![]() |
5
0
除了上面提到的其他问题之外,拥有一个单独的函数名称空间使得cl不卫生的宏更不可能攻击宏用户。在cl中,在调用点绑定的、出现在宏扩展中的名称将在调用点使用定义, 不 定义宏时使用的定义。因此,在cl的lisp-1版本中,如果宏扩展到对list函数的调用,并且list被定义为调用宏的点的变量,那么宏就会失效。(注意gensyms并不能解决这个问题,不像他们解决的逆问题。) 在Scheme中不会发生这种情况,因为默认情况下,Scheme宏是卫生的:宏扩展中使用的所有名称都具有定义宏的位置所具有的含义,而不是宏的使用位置。 |
![]() |
notamaster · 匿名命名空间中的变量声明和其他位置的定义 2 年前 |
![]() |
Bipolo · 使用另一个命名空间的名称创建子命名空间 3 年前 |
![]() |
The Vivandiere · 从命名空间中引入单个名称 7 年前 |
![]() |
Bercovici Adrian · 静态类内定义的类的约束 7 年前 |
![]() |
shir k · 使用命名空间重载函数(&O) 7 年前 |
![]() |
yearntolearn · R包命名空间 7 年前 |
![]() |
ambikanair · 与特权pod共享装载命名空间 7 年前 |
![]() |
landau · 如何检查环境是否为包命名空间[重复] 7 年前 |