寻求一些clojure特殊形式和元数据的解释

Chu*_*eto 3 clojure

我对clojure很新,我正在经历各种代码挑战/练习,以及一般的API.

我理解在符号的两端用*命名动态变量的约定

eg: *myvar* ..

我也理解插入符号的应用,例如动态变量

eg: ^:dynamic ..

但我对有时候带有*的符号/变量结尾的约定感到困惑,但不是以*开头.

eg: list*.

以下是我发现令人困惑的其他一些元数据表单.我理解它们为宏和特殊表单提供了额外的信息..但是,你何时会使用哪些以及如何使用?..

^Type ? ^{:tag Type}
^:key ? ^{:key true}
^:private
^{:once true}
Run Code Online (Sandbox Code Playgroud)

任何有明确解释的解释或链接都将受到赞赏.

Ale*_*ler 7

在Clojure中,函数(或宏)的内部版本的结尾是常见的*:非*版本是用户应该调用的公共版本.有时,这是一个围绕内部函数提供自定义语法的宏.

这方面的一个极端的情况下发生在Clojure的核心库,其中几种形式(fn*,let*等)底部的是,得到理解和执行在编译器本身作为特殊形式.这只是他们的名字结束的惯例*.

最后提到的元标记在http://clojure.org/metadata中描述.

  • ^Type表单用于为下一个表单的类型提供类型提示:这用于在编译类型不明确的Java互操作调用时避免反射.更多信息:http: //clojure.org/java_interop#Java%20Interop-Type%20Hints
  • ^:key表单用于提供各种布尔标志 - 例如^:dynamic标记动态变量.见 http://clojure.org/vars
  • ^:private表单可防止符号在名称空间的公共符号中列出(尽管它仍可用于查找和解除引用作为Var:#'foo.更多信息,请访问:http: //clojure.org/special_forms
  • ^{:once true}是编译器可以使用的一些元数据,以避免保留垃圾收集的中间对象(有关更多详细信息,请参见 此处).这是一项高级优化,您应该很少担心.