Clojure尖锐的报价?

时间:2020-02-12 12:05:42

标签: clojure

我们知道Clojure是Lisp-1,也就是说,没有单独的函数和变量名称空间。

我是从Common Lisp(Lisp-2)的角度出发的。

我正在寻求了解元数据,并对以下内容感到困惑:

user=> (def ^Integer my 3)
#'user/my
user=> (meta my)
nil
user=> (meta #'my)
{:tag java.lang.Integer, :line 1, :column 1, :file "NO_SOURCE_FILE", :name my, :ns #object[clojure.lang.Namespace 0x1d5a857d "user"]}

user=> (def myatom (atom (for [x [1 2 3]] ^{:key 'foo} x)))
#'user/myatom
user=> @myatom
(1 2 3)
user=> (first @myatom)
1
user=> (meta (first @myatom))
nil
user=> (meta #'(first @myatom))

RuntimeException EOF while reading, starting at line 1  clojure.lang.Util.runtimeException (Util.java:221)

RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:221)

在Clojure中,引号#'的作用是什么?


此外,关于元数据,我对以下内容感到有些困惑:

Children: [:ul [:li] [:li] [:li] [:li]]
Keyed: [:ul [^3[:li] ^4[:li] ^5[:li] ^6[:li]]]

这来自《专业Clojure》一书中的clojurescript / reagent一章。第二行是普通的Clojure元数据语法,还是仅由于试剂宏而有效?

Repl上还有更多实验:

user=> ^1[2]
IllegalArgumentException Metadata must be Symbol,Keyword,String or Map  clojure.lang.LispReader$MetaReader.invoke (LispReader.java:798)
user=> ^:a[1]
[2][1]
user=> ^:a[1]
[1]
user=> (meta ^:a[1])
{:a true}
user=> 

第二行看起来很奇怪,但也许不用介意,除非有帮助。

1 个答案:

答案 0 :(得分:5)

使用像#'my这样的尖引号是编写(var my)的简写。

var返回符号my指向的Var对象。请注意,var是Clojure的特殊形式,其行为不像常规函数调用。

有关Clojure中的符号,变量和值的完整详细信息,请参见以下问题:When to use a Var instead of a function?

另请参阅:

相关问题