我和我的一些朋友正在开发一个新平台,我们想用 lisp 构建它。主要吸引力是宏。我们都使用 Common Lisp,但我想探索 Clojure 的选择。
当我提出这一点时,其中一位说宏观体系“较弱”。我想知道这是否属实,以及在哪些领域。
就您可以使用它们执行的操作而言,它们几乎是相同的,即:
- 它们在编译时执行
- 他们可以执行任意转换和生成代码(利用同形性 http://en.wikipedia.org/wiki/HomoiconicityLisp 代码)
- 它们适合用新的语言结构或 DSL 来“扩展语言”
- 你感觉自己非常强大,而且工作效率很高(在击败平均水平 http://www.paulgraham.com/avg.html way)
现在来看一些差异:
Common Lisp 还允许阅读器宏它允许您改变读者的行为。这允许您引入全新的语法(例如数据结构文字)。这可能是您的朋友将 Clojure 的宏系统描述为“较弱”的原因,因为 Clojure 不允许读取器宏。在 Clojure 中,你基本上会被语法所困扰(macro-name ....)
但除此之外你可以做任何你想做的事。关于阅读器宏是否是一件好事,人们的观点存在分歧:我个人的观点不是,因为它不会给你任何额外的“力量”,并且有可能引起极度的混乱。
在我看来,Clojure 有一个命名空间的更好实现我认为这使得 Clojure 的宏系统更容易使用。 Clojure 中的每个符号都是命名空间限定的,因此不同的库可以在自己的命名空间中定义不同的相同符号。所以+
可以单独定义为clojure.core/+
and my.vector.library/+
没有任何冲突的风险。在您自己的命名空间中,您可以use http://clojuredocs.org/clojure_core/clojure.core/use来自另一个命名空间的定义,这意味着您可以选择采用+
从任一clojure.core
or my.vector.library
如所须。
另一方面,Clojure 有额外的文字用于地图{}
和向量[]
。与传统的 Lisp s 表达式相比,它们为您提供了更多的表达能力(在简洁可读语法的意义上)。特别是,使用 [] 来绑定表单是 Clojure 中的一种约定,我认为它对于宏和普通代码都适用 - 它使它们从其他括号中清晰地脱颖而出。
Clojure 也是一个Lisp-1(像Scheme)所以它没有单独的函数和数据命名空间。 Common Lisp 是一个Lisp-2它具有单独的函数和数据命名空间(因此您可以同时拥有名为 foo 的函数和名为 foo 的数据项)。我稍微喜欢 Lisp-1 方法,因为它更简单,并且当您使用函数式语言编写时,代码和数据之间的划分似乎有点随意。不过,这可能是个人品味的问题。
总体而言,差异相对较小。我认为 Clojure 更简单、更优雅,而 Common Lisp 有一些额外的功能(使用风险自负!)。两者都非常有能力,所以选择任何一个都不会出错。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)