clojure - Clojure插入符号作为符号?

标签 clojure caret

因此,我认为命名一个计算指数^的函数是一个好主意,但似乎插入符号实际上做了一些特殊的事情,因为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/

相关文章:

使用 Clojure 开发 Android 应用程序

clojure - 程序流程 - 如果一次计算失败则停止运行

javascript - 在 contenteditable 插入符位置占 `<br>` s

clojure - 如何捕获 Clojure 的标准输出?

Clojure:部分更改 Enlive 中的属性值

clojure - 在 clojure 中将 comp 别名为 º 并将部分别名别名为 Ø

objective-c - 类型之间而不是变量之间的插入符,用括号括起来

c++ win32编辑框光标不闪烁

twitter-bootstrap - 更改 Bootstrap 插入符号(颜色和位置)

javascript - 在 contenteditable/input 中过滤输入以将插入符号放在原来的位置之后