2011-08-23 83 views
4

例如,模式匹配是一種編程語言功能,可以通過宏添加到clojure語言中:http://www.brool.com/index.php/pattern-matching-in-clojure什麼語言功能可以通過庫添加到Clojure中?

可以將其他語言功能添加到該語言中?

+12

「如果你給某人Fortran,他有Fortran,如果你給Lisp一個人,他有他喜歡的任何語言。 Guy Steele –

+1

用這種方法列出你無法添加到語言中的內容會更容易。不幸的是,'goto'就是其中之一。 –

+1

JVM強加了一些限制,例如缺少正確的尾部調用(http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm)。 – ponzao

回答

1

我認爲這是一個愚蠢的問題要問,可以添加什麼,你應該問的是,你不能添加什麼。宏允許你掛鉤編譯器,這意味着你幾乎可以做任何事情。

此刻你不能你自己的語法添加到語言。 Clojure中沒有用戶extenseble閱讀器,這意味着你沒有任何讀者的宏(http://dorophone.blogspot.com/2008/03/common-lisp-reader-macros-simple.html)。這不是因爲技術問題,而是由Rich Hickey(Clojure的創造者)作出的更多決定。

你不能做的是落實需要虛擬maschine支持,例如添加尾部調用語義或goto功能。

如果你想看到一些東西,已經做了:Are there any Clojure DSLs?

注意,這份名單是不是100%是最新的。

編輯:

因爲你似乎你把模式匹配爲例(它是宏的力量一個很好的例子),你真的應該看看match庫。它探索了Clojure中最快速的模式匹配庫。 http://vimeo.com/27860102

+1

您仍然可以添加自己的語法:只需用您自己的代碼替換整個Clojure閱讀器,並將其用作'(my-include「file.clj」)'宏。 –

0

可以有效地添加任何你喜歡的語言功能。

這從宏在編譯時構建任意代碼的能力來看:只要你能夠找出你需要生成的代碼來實現你的語言特性,就可以用宏來實現。

我看到的一些例子:

有幾個注意事項:

  • 如果功能不被JVM直接支持(例如在相互遞歸的情況下調用尾部優化),那麼你必須模擬它。沒什麼大不了的,但可能會對性能產生一定的影響。
  • 如果該功能需要Clojure閱讀器不支持的語法,則需要提供自己的閱讀器(因爲Clojure目前缺少可擴展的閱讀器)。因此,如果你堅持使用Clojure的語法/表單,這會更容易。
  • 如果你做的事情太不尋常/單一,它可能不會被別人拿起。堅持標準Clojure慣例有很多價值。
  • 小心使用不需要的宏。通常,只使用普通函數(也許更高階的函數)足以實現許多新的語言特性。一般規則是:「除非你絕對需要,否則不要使用宏」。
相關問題