Немного некрасиво, но это работает:
(require '[clojure.contrib.java-utils :as cj])
(defn struct-instance? [struct-def sm]
(= (cj/wall-hack-field clojure.lang.PersistentStructMap "def" sm)
struct-def))
(struct-instance? person p)
; => true
(struct-instance? person (conj p [:foo 1] [:bar 2]))
; => true
(defstruct foo :k1 :k2)
(struct-instance? foo p)
; => false
Материал из clojure.contrib.java-utils
будет доступен в версии 1.2, частично в clojure.java
, частично в clojure.contrib.java
(я полагаю?), Итакже в clojure.contrib.java-utils
для обратной совместимости ... Хотя детали могут все еще измениться.В любом случае, Майкель прав насчет defrecord
вместо defstruct
, поэтому, если вы работаете с 1.2, предпочтите это.