我们知道Clojure是一个Lisp-1,也就是说,没有单独的函数和变量名称空间。
我是从Common (这是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元数据语法,还是仅作为试剂宏的结果才有效?
更多的实验是:
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=> 第二行看上去很奇怪,但如果不起作用的话,也许在第一种情况下就无所谓了。
发布于 2020-02-12 12:28:34
使用像#'my这样的尖利引号是编写(var my)的缩写。
var返回符号my指向的Var对象。请注意,var是Clojure的一个特殊形式,它的行为不像常规函数调用。
请参阅此问题,以获取Clojure:什么时候使用Var而不是函数?中有关符号、var和值的详细信息。
另请参阅:
https://stackoverflow.com/questions/60187961
复制相似问题