2012-05-14 4 views
5

clojure.walk/stringify-keysをレコードインスタンスを含むマップに呼び出そうとしています。 stringify-keysは再帰的なので、エラーの原因となる(が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は空を作成できません:user.Rec user.Rec(NO_SOURCE_FILE:1)

答えて

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?機能

を持っています
1

することができます各メンバーのタイプをチェックして、それが実際に地図であるか他のものであるかを確認してください(他の何かがレコードと推定される場合)。

user> (type {:a 1 :b 2}) 
clojure.lang.PersistentArrayMap 
関連する問題