5

clojure.walk/stringify-keysレコード インスタンスを含む可能性のあるマップを呼び出そうとしています。stringify-keys は再帰的であるため、( (map? record-var)true であるため) 私のレコードのキーを変換しようとすると、エラーが発生します。var が単なる Clojure マップではなくレコードであるかどうかを判断する方法はありますか? stringify-keysレコード対応の独自の実装を提供したいと思います。

の現在の実装でstringify-keysは、次のことが発生します。

(use '[clojure.walk :only [stringify-keys]])

(defrecord Rec [x])    

(let [record (Rec. "foo")
      params {:x "x" :rec record}]
    (stringify-keys params))

これにより、次の例外が発生します: UnsupportedOperationException Can't create empty: user.Rec user.Rec (NO_SOURCE_FILE:1)

4

2 に答える 2

5

レコードは IRecord マーカー インターフェイスを実装しているようです。

user=> (defrecord Rec [x])    
user.Rec

user=> (require '[clojure.reflect :as r])
nil
user=> (:bases (r/reflect Rec))
#{java.io.Serializable clojure.lang.IKeywordLookup clojure.lang.IPersistentMap clojure.lang.IRecord java.lang.Object clojure.lang.IObj clojure.lang.ILookup java.util.Map}

user=> (instance? clojure.lang.IRecord (Rec. "hi"))
true

アップデート 1.6 には次のrecord?機能

于 2012-05-14T19:21:55.850 に答える
1

各メンバーのタイプを確認して、それが本当にマップなのか他のものなのかを確認できます (他のものはレコードであると推定されます)。

user> (type {:a 1 :b 2})
clojure.lang.PersistentArrayMap
于 2012-05-14T19:16:32.510 に答える