可以通过库向Clojure添加哪些语言功能?

可以通过库向Clojure添加哪些语言功能?,clojure,Clojure,例如,模式匹配是一种编程语言功能,可以通过宏添加到clojure语言中: 还有哪些语言功能可以添加到该语言中?我有两个例子,但我相信还有更多 合同规划: 声明逻辑: 我认为问什么是可以添加的是一个愚蠢的问题,你应该问什么是你不能添加的。宏允许您连接到编译器,这意味着您几乎可以做任何事情 目前,您无法将自己的语法添加到该语言中。Clojure没有用户可扩展读取器,这意味着您没有任何读取器宏()。这不是因为技术问题,更多的是因为Rich Hickey(Clojure的创建者)的决定 您不能实现需要

例如,模式匹配是一种编程语言功能,可以通过宏添加到clojure语言中:


还有哪些语言功能可以添加到该语言中?

我有两个例子,但我相信还有更多

  • 合同规划:
  • 声明逻辑:

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

目前,您无法将自己的语法添加到该语言中。Clojure没有用户可扩展读取器,这意味着您没有任何读取器宏()。这不是因为技术问题,更多的是因为Rich Hickey(Clojure的创建者)的决定

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

如果您想看到一些已经完成的工作:

请注意,此列表不是100%最新的

编辑:


既然您似乎以模式匹配为例(这是宏功能的一个很好的例子),那么您应该真正了解
match
库。它可能是Clojure中最快的模式匹配库

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

这源于宏在编译时构造任意代码的能力:只要您能够确定需要生成什么代码来实现语言功能,就可以使用宏实现

我见过一些例子:

  • 查询语言()
  • 逻辑编程()
  • 图像合成DSL()
  • 算术中缀符号
  • 代数运算
  • 实时数据流的声明性定义(,)
  • 音乐节目(,)
有几点需要注意:

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

“如果你给某人Fortran,他就有Fortran。如果你给某人Lisp,他就有他喜欢的任何语言。”Guy SteeleIt会更容易列出你无法添加到语言中的东西。不幸的是,
goto
就是其中之一。JVM施加了一些限制,例如缺少适当的尾部调用()。人们可能还注意到David Nolens正在处理,re mini-kanren。您仍然可以添加自己的语法:只需用自己的语法替换整个Clojure阅读器,并将其用作
(my include“file.clj”)
宏。