Ошибка deftype в lein repl, что я делаю не так?


person Y. Adam Martin    schedule 16.02.2012    source источник
comment
Сайт ассамблы устарел. Кроме того, это были проектные документы, которые по своей природе изменчивы и могут довольно быстро устареть. Проверьте clojure.org и clojure.github.com/clojure для получения актуальной документации.   -  person kotarak    schedule 16.02.2012


Ответы (2)


Я не очень хорошо знаком с deftype, но из того, что я вижу, вам нужна точка для создания экземпляра типа, попробуйте следующее:

(deftype Bar [a b c d e])

(def b (Bar. 1 2 3 4 5))

Обратите внимание, что это не Bar, а Bar.. См. примеры, например. здесь:

Этот поток, кажется, указывает, что это было изменение в deftype:

или, наоборот, документы на странице, на которую вы ссылаетесь, кажутся устаревшими.

Надеюсь это поможет.

person icyrock.com    schedule 16.02.2012

Есть два способа добиться того, что вы пытаетесь сделать. Во-первых, давайте рассмотрим пример deftype.

user=> (deftype Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 2 3 4 5))
#'user/b
user=> (:a b)
nil
user=> (.a b)
1

Здесь вы заметите несколько вещей. Как уже упоминалось, вам нужен "." для создания экземпляра вашего типа. Кроме того, вы не получаете доступа к ключевому слову (":", нотация), только доступ к полю (опять же, с ".").

Другой метод заключается в определении записи с defrecord:

user=> (defrecord Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 3 5 7 9))
#'user/b
user=> (:a b)
1
user=> (.a b)
1

Это дает вам доступ как к полю, так и к ключевому слову. Этот доступ также легко вкладывается, если вы решите, чтобы одно из ваших полей содержало другую запись.

person fredugolon    schedule 16.02.2012