Fra*_*awr 16 macros clojure common-lisp
我和我的一些朋友正在开发一个新平台,我们希望在lisp中构建它.主要的吸引力是宏.我们都使用Common Lisp,但我想探索Clojure的选项.
当我提出这个时,其中一个人说宏观系统"较弱".我想知道这是否属实,以及在哪些方面.
mik*_*era 26
就你可以用它们做什么而言,它们都非常相同,即:
现在有一些差异:
Common Lisp还允许读取器宏允许您更改读取器的行为.这允许您引入全新的语法(例如,用于数据结构文字).这可能是你的朋友将Clojure的宏系统描述为"较弱"的原因,因为Clojure不允许读者宏.在Clojure中,你基本上坚持语法,(macro-name ....)但除此之外,你可以做任何你想做的事情.关于读者宏是否是好事的意见分歧:我的个人观点不是,因为它没有给你任何额外的"力量",并且有可能引起极度混乱.
在我看来,Clojure有一个更好的命名空间实现,我认为Clojure的宏系统更容易使用.Clojure中的每个符号都是名称空间限定的,因此不同的库可以在它们自己的名称空间中定义不同的相同符号.因此+可以单独定义为clojure.core/+ and my.vector.library/+没有任何冲突风险.在您自己的命名空间中,您可以使用另一个命名空间中的定义,这意味着您可以选择+从任一个clojure.core或my.vector.library根据需要获取.
另一方面,Clojure 为地图和向量提供了额外的文字.与传统的Lisp s表达式相比,它们使您的表达能力更强(在简洁的可读语法意义上).特别是,对于绑定表单使用[]是Clojure中的一种惯例,我认为它对宏和普通代码都很有效 - 它使它们从其他括号中清楚地脱颖而出.{}[]
Clojure也是一个Lisp-1(类似于Scheme),因此它没有单独的函数和数据命名空间.Common Lisp是一个Lisp-2,它有独立的函数和数据名称(因此你可以同时拥有一个名为foo的函数和一个名为foo的数据项).我稍微喜欢Lisp-1方法,因为它更简单,当你在函数语言中编写时,代码和数据之间的划分似乎有点武断.这可能是个人品味的事情.
总体而言,差异相对较小.我认为Clojure更简单,更优雅,而Common Lisp有一些额外的功能(使用风险自负!).两者都非常有能力,所以你也不能选错.
Vse*_*kin 12
关于普通宏,这里是Lisp和Clojure变体之间的区别:
总的来说,Lisp的方法更粗糙,但更灵活.当你超越简单的语法修改并开始定义完整的DSL时,Clojure的宏可能会稍微容易接近,但会变得更难使用.
关于读者宏,正如你所知,Clojure没有给用户这个选项,而CL也是如此.所以在CL阅读器中,宏找到了很多用途,比如字符串插值,国际化支持,SQL DSL或java互操作.更不用说过多的特殊情况,当读者宏可用于帮助创建高级DSL时.