通过图书馆可以添加哪些语言功能?

时间:2011-08-23 02:29:32

标签: clojure

例如,模式匹配是一种编程语言功能,可以通过宏添加到clojure语言中:http://www.brool.com/index.php/pattern-matching-in-clojure

该语言还可以添加哪些其他语言功能?

3 个答案:

答案 0 :(得分:2)

在我的帽子上,我有两个例子,但我相信还有更多。

答案 1 :(得分:0)

我认为这是一个愚蠢的问题,询问可以添加什么,你应该问的是你不能添加的内容。宏允许您挂钩编译器,这意味着您几乎可以做任何事情。

目前你无法在语言中添加自己的语法。 Clojure没有用户extensble阅读器,这意味着你没有任何阅读器宏(http://dorophone.blogspot.com/2008/03/common-lisp-reader-macros-simple.html)。这不是因为技术问题,而是Rich Hickey(Clojure创作者)的更多决定。

您不能做的是实现需要虚拟机支持的功能,如添加尾调用语义或goto

如果你想看到已经完成的一些事情:Are there any Clojure DSLs?

请注意,此列表并非100%最新。

编辑:

因为你似乎把模式匹配作为一个例子(它是宏的力量的一个非常好的例子),你应该真正看看match库。它可以说是Clojure中最快的模式匹配库。 http://vimeo.com/27860102

答案 2 :(得分:0)

您可以有效地添加自己喜欢的任何语言功能。

这是因为宏能够在编译时构造任意代码:只要您能够确定为了实现语言功能需要生成哪些代码,就可以用宏来实现。

我见过的一些例子:

有几点需要注意:

  • 如果JVM不直接支持该功能(例如,在相互递归的情况下进行尾调用优化),那么您将不得不模拟它。没什么大不了的,但可能会对性能产生一些影响。
  • 如果该功能需要Clojure阅读器不支持的语法,则需要提供自己的阅读器(因为Clojure目前缺少可扩展的阅读器)。因此,如果您坚持使用Clojure语法/表单,就会容易得多。
  • 如果你做任何太不寻常/单一的事情,它可能不会被其他人接受。坚持标准Clojure惯例有很多价值。
  • 注意在不需要的地方使用宏。通常,仅使用普通函数(可能是更高阶函数)就足以实现许多新的语言特性。一般规则是:“除非你绝对需要,否则不要使用宏。”