我对clojure很新,我正在经历各种代码挑战/练习,以及一般的API。
我理解在符号两端用*命名动态变量的惯例
eg: *myvar*
..
我也理解插入符号的应用,例如动态变量
eg: ^:dynamic
..
但我对有时候带有*的符号/变量结尾的惯例感到困惑,但不是以*开头。
eg: list*
。
以下是我发现令人困惑的其他一些元数据表单。我理解它们为宏和特殊表单提供了额外的信息..但是,你何时会使用哪些以及如何使用? ..
^Type → ^{:tag Type}
^:key → ^{:key true}
^:private
^{:once true}
任何有明确解释的解释或链接都将受到赞赏。
答案 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了解更详细信息)。这是一个先进的
优化和你应该很少担心的事情。