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

寻找一些clojure特殊形式和元数据的解释,clojure,Clojure,我是clojure的新手,正在经历各种代码挑战/练习,以及通用API 我理解在符号两端用*命名动态变量的惯例 例如:*myvar* 我还了解插入符号的应用,例如在动态变量上 例如:^:dynamic 但我对有时符号/变量以*结尾,而不是以*开头的惯例感到困惑 eg:list* 下面是一些我感到困惑的其他元数据形式。。我知道他们提供了宏和特殊表单的附加信息。。但是,你什么时候会使用哪一种?如何使用 ^Type → ^{:tag Type} ^:key → ^{:key true} ^:privat

我是clojure的新手,正在经历各种代码挑战/练习,以及通用API

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

例如:*myvar*

我还了解插入符号的应用,例如在动态变量上

例如:^:dynamic

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

eg:list*

下面是一些我感到困惑的其他元数据形式。。我知道他们提供了宏和特殊表单的附加信息。。但是,你什么时候会使用哪一种?如何使用

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

任何解释或带有清晰解释的链接都将不胜感激。

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

Clojure核心库中出现了一种极端情况,其中有几种形式(
fn*
let*
,等等)作为特殊形式,在编译器中被理解和实现。他们的名字以
*
结尾只是一种惯例

最后提到的元标记在中进行了描述

  • ^Type
    表单用于为下一个类型提供类型提示 表单:用于在编译Java互操作时避免反射 在类型不明确的地方调用。详情如下:
  • ^:key
    表单用于提供各种布尔值 标志-例如
    ^:dynamic
    标记动态变量。看见
  • ^:private
    表单禁止在公共场合列出符号 名称空间的符号(尽管仍可用于查找) 以及作为变量的解引用:#'foo.更多信息:
  • ^{:once-true}
    是编译器可以用来避免的一点元数据 保留用于垃圾收集的中间对象(请参见 这是一个高级的 优化和一些你不应该担心的事情

,但坦率地说,我不认为结尾的*遵循任何惯例。所有以*结尾的其他形式的行为都类似,这与Clojure中默认的
let
行为相同。@DaoWen,感谢您的输入..以及您的陈述(即
list
list*
)是什么让我更加困惑。后来我遇到了很多特殊字符,大部分都在这里解释过。但是没有一个是关于
list*
的。我没有说
list
list*
之间没有区别,而是说在末尾添加
*
似乎没有一致的含义。
list*
类似于
list
,但它将另一个列表作为其最后一个参数(因此它只是
cons
es所有参数,但最后一个参数是最后一个).是的,你确实是对的。这对我以前来说并不明显。我只是使用了doc和source来了解list和list*之间的区别。我应该养成更经常使用doc/source的习惯。这是一个全面的报道,以及更多信息的链接。非常感谢。我会接受这个答案。