Получение названия типа структуры Clojure?

При определении типа структуры и экземпляра, я могу распечатать значение и получить тип реализации "структуры":

(defstruct person :name :age)
(def p (struct person "peter" 30))

user=> p
{:name "peter", :age 30}
user=> (type p)
clojure.lang.PersistentStructMap

Но действительно ли возможно сказать, является ли p экземпляром "человека" типа структуры?

12
задан j-g-faustus 11 June 2010 в 05:56
поделиться

2 ответа

См .: этот пост в группе Google Clojure. В целом групповые архивы представляют собой сундук с сокровищами ...

Примечание: Функциональность структур заменяется записями. Тогда это больше не проблема, потому что записи действительно определяют новый тип, и вы можете проверить с помощью экземпляра ? , относится ли что-то к записи определенного типа.

8
ответ дан 2 December 2019 в 21:42
поделиться

Немного некрасиво, но работает:

(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, отдайте предпочтение этому.

4
ответ дан 2 December 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: