我的问题的目的不是要开始一场火焰战争,而是要确定在什么情况下每种语言都是"工作的最佳工具".
我已经阅读了几本关于Clojure的书(Clojure 编程,实用Clojure,Clojure 的喜悦,以及Clojure in Action的Manning Early Access版本),我认为这是一本很棒的语言.我目前正在阅读Let Over Lambda,它主要涉及Common Lisp宏,而且它也是一种非常有趣的语言.
我不是 Lisp专家(更多的是新手),但这个语言系列对我来说很有吸引力,一般来说,功能编程也是如此.
Clojure的优点(以及"其他"的缺点):
在JVM上运行.
JVM是一个非常稳定,高性能的语言环境,很好地满足了Sun的"一次编写,几乎在任何地方运行"的梦想.我可以在我的Macbook Pro上编写代码,将其编译成可执行的JAR文件,然后在Linux和Microsoft Windows上运行它,几乎不需要额外的测试.
(Hotspot和其他)JVM支持高质量的垃圾收集和非常高效的即时编译和优化.就在几年前,我写了一些必须在C中快速运行的东西,现在我毫不犹豫地在Java中这样做.
标准,简单,多线程模型.Common Lisp是否有标准的多线程包?
打破了所有这些括号的单调[]
,{}
和#{}
,虽然Common Lisp的专家可能会告诉我,有读者宏,你可以添加那些CL.
Clojure的缺点:
其他人的优点(特别是Common Lisp)(以及Clojure的缺点):
用户可定义的阅读器宏.
其他优点?
思考?其他差异?
我刚刚开始学习Lisp,我无法弄清楚如何编译和链接lisp代码到可执行文件.
我正在使用clisp
并clisp -c
生成两个文件:
接下来我要做什么来获取可执行文件?
我看到实用的Common Lisp使用(defvar *db* nil)
设立一个全局变量.是否可以setq
用于同一目的?
使用defvar
vs. 的优点/缺点是setq
什么?
为什么Lispers会像样本1中所示那样格式化代码,而不是样本2中所示?对我来说(我想,对于大多数来自不同编程背景而不是Lisp的人),样本2中显示的格式将更容易阅读.Lispers是否更喜欢样本1样式?
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))))
Run Code Online (Sandbox Code Playgroud)
(defun factorial (n)
(if (<= n 1)
1
(* n (factorial (- n 1)))
)
)
Run Code Online (Sandbox Code Playgroud) ".el"是以Emacs Lisp程序结尾的文件名的约定.编写Common Lisp程序时的惯例是什么?
我最近开始使用SBCL学习Common Lisp.如何将我的Lisp程序编译成Windows二进制文件?
最近几个月我一直在广泛使用Emacs作为我的主要开发环境,现在我已经到了一个点,我想学习它自己的Emacs Lisp为Emacs写我自己的小东西并将它扩展到我的个人需求.
话虽如此,我还想学习Common Lisp一段时间,一起玩,探索一种新语言.我的问题是,我应该从哪里开始?请问Emacs Lisp能否为我提供必要的知识,以便以后更轻松地获取Common Lisp,反之亦然?我基本上对每条路径的效率感兴趣,以便在我最终决定从一种方言转移到另一种方言时最小化学习曲线.
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以及一般来说,所有值的单个命名空间与函数和非函数值的单独命名空间有哪些优点和缺点?
从阅读关于Lisp的介绍材料,我现在认为以下内容是相同的:
(list 1 2 3)
'(1 2 3)
Run Code Online (Sandbox Code Playgroud)
但是,从我在Clojure和Emacs Lisp中使用引用形式时遇到的问题来看,它们并不相同.你能告诉我有什么区别吗?