因此,我认为命名一个计算指数^
的函数是一个好主意,但似乎插入符号实际上做了一些特殊的事情,因为Clojure REPL在评估'^
时会生成错误。谷歌搜索大都给了我this,所以我想知道Clojure中插入符号的实际用途是什么。
(此外,是否有可能将函数命名为^
?)
最佳答案
^
是“元字符”,它告诉the reader将以^
开头的符号作为元数据添加到下一个符号(前提是它实现了IMetas)
user=> (def x ^:IamMeta [1 2 3])
#'user/x
user=> x
[1 2 3]
user=> (meta x)
{:tag :IamMeta}
user=>
通过查看事物的
meta
(例如函数),您可以了解有关Clojure如何在幕后工作的很多知识:user=> (meta foo)
{:ns #<Namespace user>,
:name foo, :file "NO_SOURCE_PATH",
:line 5, :arglists ([s])}
这通常用于type hints
(defn foo [^String s] (.charAt s 1))
通常,最好打开反射警告
(set! *warn-on-reflection* true)
,然后添加类型提示,直到警告消失。如果没有这些,Clojure会在运行时查找函数操作数的类型,这虽然花费很少的钱,却为您避免了繁琐的类型麻烦。PS:我下一个喜欢的读者角色是“dispatch”字符
#
,接下来非常值得学习:)PPS:clojure 1.2.x和clojure 1.3.x有所不同
使用元字符时,Clojure 1.2.1中的元数据不组成:
user=> (def foo ^:foo ^:bar [1 2 3])
#'user/foo
user=> (meta foo)
{:tag :foo}
在1.3中,它“做正确的事”,并且关键字是选项而不是“标签”:
user=> (def foo ^:foo ^:bar [1 2 3])
#'user/foo
user=> (meta foo)
{:foo true, :bar true}
关于clojure - Clojure插入符号作为符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8920137/