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

时间:2014-05-28 02:15:45

标签: clojure

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

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

eg: *myvar* ..

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

eg: ^:dynamic ..

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

eg: list*

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

^Type → ^{:tag Type}
^:key → ^{:key true}
^:private
^{:once true}

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

1 个答案:

答案 0 :(得分:7)

在Clojure中,函数(或宏)的内部版本以*结尾很常见:非*版本是 public 用户应致电的用户。有时,这是一个围绕内部函数提供自定义语法的宏。

这种情况的极端情况发生在Clojure核心库中,其中几种形式(fn*let*等)作为在编译器本身中理解和实现的特殊形式的最底层。它只是一个惯例,他们的名字以*结尾。

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

  • ^Type表单用于为下一个类型提供类型提示 form:用于在编译Java互操作时避免反射 调用类型不明确的地方。更多信息: http://clojure.org/java_interop#Java%20Interop-Type%20Hints
  • ^:key表单用于提供各种布尔值 flags - 例如^:dynamic标记动态变量。看到 http://clojure.org/vars
  • ^:private表单可防止符号在公共列表中列出 命名空间的符号(尽管它仍可用于查找 并取消引用作为Var:#&f'foo。更多信息: http://clojure.org/special_forms
  • ^{:once true}是编译器可以用来避免的一些元数据 保留一个垃圾收集的中间对象(见 here了解更详细信息)。这是一个先进的 优化和你应该很少担心的事情。