Clojure插入符号作为符号?

wro*_*ame 31 clojure caret

所以我认为命名一个计算指数的函数是一个不错的主意^,但看起来插入符实际上做了一些特殊的事情,因为Clojure REPL在评估时会产生错误'^.谷歌搜索大多给了我这个,所以我想知道Clojure中插入符号的实际用途是什么.

(另外,毕竟可以命名一个函数^吗?)

Art*_*ldt 40

^是"元字符"它告诉读者^将以元数据开头的符号添加到下一个符号(假设它是实现IMetas的东西)

user=> (def x ^:IamMeta [1 2 3])
#'user/x
user=> x
[1 2 3]
user=> (meta x)
{:tag :IamMeta}
user=> 
Run Code Online (Sandbox Code Playgroud)

你可以通过查看meta事物来了解很多关于clojure如何工作的知识,比如函数:

user=> (meta foo)                          
{:ns #<Namespace user>, 
 :name foo, :file "NO_SOURCE_PATH", 
 :line 5, :arglists ([s])}
Run Code Online (Sandbox Code Playgroud)

这通常用于类型提示

(defn foo [^String s] (.charAt s 1))
Run Code Online (Sandbox Code Playgroud)

通常最好打开反射警告(set! *warn-on-reflection* true),然后添加类型提示,直到警告消失.如果没有这些Clojure,它会在运行时查找函数操作数的类型,这样可以节省大量类型的烦恼.

PS:我的下一个最喜欢的读者角色是"派遣"角色#,下次值得学习它是值得的:)

PPS:这在clojure 1.2.x中与Clojure中的clojure 1.3.x不同1.2.1元数据在您使用元字符时不构成:

user=> (def foo ^:foo ^:bar [1 2 3])
#'user/foo
user=> (meta foo)
{:tag :foo}
Run Code Online (Sandbox Code Playgroud)

并且在1.3中它"做正确的事"并且关键字是选项而不是"标签":

user=> (def foo ^:foo ^:bar [1 2 3])
#'user/foo
user=> (meta foo)
{:foo true, :bar true}
Run Code Online (Sandbox Code Playgroud)