gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:57:07 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com