Мы знаем, что 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]]]
Это из главы, посвященной clojurescript / reagent в книге Professional Clojure. Является ли вторая строка обычным синтаксисом метаданных 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=>
Вторая строка там кажется странной , но, возможно, не обращайте внимания на это в первую очередь, если это не поможет.