Cur*_*son 30 lisp variables scheme common-lisp lisp-2
Scheme为所有变量使用单个名称空间,无论它们是绑定到函数还是其他类型的值.Common Lisp将两者分开,这样标识符"hello"可以引用一个上下文中的函数,而另一个中引用一个字符串.
(注1:此问题需要上述示例;请随意编辑并添加一个,或通过电子邮件发送原作者,我会这样做.)
但是,在某些上下文中,例如将函数作为参数传递给其他函数,程序员必须通过使用明确区分他指定函数变量而不是非函数变量#',如:
(sort (list '(9 A) '(3 B) '(4 C)) #'< :key #'first)
我一直认为这有点像疣,但我最近遇到的一个论点是,这实际上是一个特征:
......重要的区别实际上在于形式的语法,而不在于对象的类型.在不了解所涉及的运行时值的情况下,很明显函数形式的第一个元素必须是函数.CL采用这一事实并使其成为语言的一部分,以及宏观和特殊形式,这些形式也可以(并且必须)静态地确定.所以我的问题是:当函数名称的主要用途出现在很少想要出现变量名的地方时,为什么你希望函数的名称和变量的名称在同一名称空间中?
考虑类名的情况:为什么名为FOO的类会阻止使用名为FOO的变量?我唯一一次通过名称FOO引用该类是在期望类名的上下文中.如果在极少数情况下我需要获取绑定到类名FOO的类对象,则有FIND-CLASS.
这个论点确实从经验中对我有所帮助; Haskell中有一个类似的字段名称,它也是用于访问字段的函数.这有点尴尬:
data Point = Point { x, y :: Double {- lots of other fields as well --} }
isOrigin p = (x p == 0) && (y p == 0)
Run Code Online (Sandbox Code Playgroud)
这是通过一些额外的语法解决的,NamedFieldPuns扩展特别好:
isOrigin2 Point{x,y} = (x == 0) && (y == 0)
Run Code Online (Sandbox Code Playgroud)
那么,对于问题,超越一致性,Common Lisp vs. Scheme以及一般来说,所有值的单个命名空间与函数和非函数值的单独命名空间有哪些优点和缺点?
Gre*_*ill 22
两种不同的方法有名称:Lisp-1和Lisp-2.Lisp-1对变量和函数都有一个命名空间(如在Scheme中),而Lisp-2有变量和函数的独立命名空间(如在Common Lisp中).我之所以提到这一点是因为你可能不知道这个术语,因为你没有在你的问题中引用它.
维基百科提到了这场辩论:
函数的单独命名空间是否有优势是Lisp社区争用的根源.它通常被称为Lisp-1 vs. Lisp-2辩论.Lisp-1指的是Scheme的模型,Lisp-2指的是Common Lisp的模型.这些名字是由Richard P. Gabriel和Kent Pitman撰写的1988年论文中创造的,后者对这两种方法进行了广泛的比较.
加布里埃尔和皮特曼的题为" 功能细胞和价值细胞中分离的技术问题"的论文解决了这个问题.
Sva*_*nte 11
实际上,正如理查德·加布里埃尔和肯特·皮特曼在论文中所概述的那样,辩论是针对Lisp-5的Lisp-5,因为已经存在其他几个命名空间,本文中提到了类型名称,标签名称,块名称和声明名称. 编辑:这似乎是不正确的,正如Rainer在评论中指出的那样:Scheme实际上似乎是一个Lisp-1.但是,以下内容基本上不受此错误的影响.
从上下文中总是清楚符号表示要执行的内容或要引用的内容.将函数和变量抛出到同一名称空间主要是一个限制:程序员不能对事物和动作使用相同的名称.Lisp-5从中得到的只是避免了从当前上下文暗示的不同命名空间引用某些东西的语法开销. 编辑:这不是整个画面,只是表面.
我知道Lisp-5的支持者喜欢函数是数据这一事实,并且这是在语言核心中表达的.我喜欢这样一个事实:我可以在不混淆编译器的情况下调用列表"列表"和汽车"汽车",而且函数无论如何都是一种基本上特殊的数据. 编辑:这是我的要点:单独的命名空间根本不是疣.
我也很喜欢Pascal Constanza对此的看法.