我们知道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=>
第二行看起来很奇怪,但也许不用介意,除非有帮助。
答案 0 :(得分:5)
使用像#'my
这样的尖引号是编写(var my)
的简写。
var
返回符号my
指向的Var对象。请注意,var
是Clojure的特殊形式,其行为不像常规函数调用。
有关Clojure中的符号,变量和值的完整详细信息,请参见以下问题:When to use a Var instead of a function?
另请参阅: