Получение имени типа структуры Clojure? - PullRequest
12 голосов
/ 11 июня 2010

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 11 июня 2010

См .: этот пост в Clojure Google Group. Вообще групповые архивы - это сундук с сокровищами ...

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

4 голосов
/ 11 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...