[1 2]
は、入力すると、Clojure MapEntry
ではなく、クロージャーvector
リテラルであることに注意してください。これらの結果を参照してください。結果と
(ns tst.demo.core
(:use tupelo.test)
(:require
[tupelo.core :as t]))
(t/refer-tupelo)
(dotest
(newline)
(let [my-map {:a 1 :b 2}
map-entries (vec my-map)
map-entry-1 (first map-entries)
map-keys (keys my-map)
entry-1-key (key map-entry-1)
]
(is= map-entries [[:a 1] [:b 2]])
(is= map-entry-1 [:a 1])
(is= map-keys [:a :b])
(is= entry-1-key :a)
(spyxx my-map)
(spyxx map-entries)
(spyxx map-entry-1)
(spyxx map-keys)
(spyxx entry-1-key)
))
:
Testing tst.demo.core
my-map => <#clojure.lang.PersistentArrayMap {:a 1, :b 2}>
map-entries => <#clojure.lang.PersistentVector [[:a 1] [:b 2]]>
map-entry-1 => <#clojure.lang.MapEntry [:a 1]>
map-keys => <#clojure.lang.APersistentMap$KeySeq (:a :b)>
entry-1-key => <#clojure.lang.Keyword :a>
Ran 2 tests containing 4 assertions.
0 failures, 0 errors.
を問題はMapEntry
は、ベクトルと同じ出力していることである:
`[1 2]`
は、しかし、彼らはさまざまな種類があります。 (load-string "[1 2]")
を実行するとマップではなくベクトルが返されますので、keys
関数を呼び出すことはできません。あなたの元の質問に
パート#2
、あなたはおよそ
(catcher "(keys [1 2])") => Exception
を尋ねる私はload-string
は怠惰な結果を返して、そしてこれはあなたのコードが出た後まで実現されていないと思われますtry-catchブロックであり、例外がキャッチされないのはこのためです。
なぜあなたは好奇心から 'load-string'を使用していますか?これをマクロにすると、少し単純化することができるようです。 – Carcigenicate
私はtry/catchのためのテストベッドを望んでいましたが、私はまだマクロに慣れていません。 – planarian
あなたはtry/catchを使います。これは ''(defmacro catcher [body] '(try〜@ body catch Exception e(prn" caught ")))' 'のように見えます(コメント内で単一のバッククイックをエスケープするために、 – Carcigenicate