我们知道 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)
Run Code Online (Sandbox Code Playgroud)
#'Clojure中的尖引号的作用是什么?
另外,关于元数据,我对以下内容有些困惑:
Children: [:ul [:li] [:li] [:li] [:li]]
Keyed: [:ul [^3[:li] ^4[:li] ^5[:li] ^6[:li]]]
Run Code Online (Sandbox Code Playgroud)
这是来自 Professional 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=>
Run Code Online (Sandbox Code Playgroud)
那里的第二行似乎很奇怪,但也许在第一种情况下不要介意,除非它有帮助。
使用尖引号 #'my是 write 的简写(var my)。
var返回符号my指向的 Var 对象。请注意,这var是 Clojure 的特殊形式,其行为与常规函数调用不同。
有关 Clojure 中符号、变量和值的完整详细信息,请参阅此问题: 何时使用变量而不是函数?
也可以看看:
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |