Ошибка deftype в lein repl Что я делаю не так? - PullRequest
1 голос
/ 16 февраля 2012

за http://www.assembla.com/spaces/clojure/wiki/Datatypes

Я должен быть в состоянии набрать следующее в ответе:

(бар типа def [a b c d e])

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

Однако, когда я получаю, я получаю следующий вывод:

java.lang.Exception: Ожидается var, но Bar отображается на пользователя user.Bar (NO_SOURCE_FILE: 31)

Я в замешательстве и являюсь полным новичком, потому что всякая помощь приветствуется!

ПРИМЕЧАНИЕ: попробовал тот же код в стандартном clojure repl и получил ту же проблему.

ОТВЕТ: Ну, я ответил на свой вопрос с небольшим дополнительным поиском. Оказывается, образец был плохим. Правильный способ создания экземпляра Bar:

(def b (бар. 1 2 3 4 5))

. в конце бара в этом использовании важно. Все еще не совсем понимаю, почему (поэтому вы, эксперты, сомневаетесь, уточните, если у вас есть время, так как я хотел бы узнать подробности;)).

Спасибо всем!

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

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

(deftype Bar [a b c d e])

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

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

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

или, иначе говоря, в документах на страницеВы ссылаетесь, чтобы казаться устаревшим.

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

2 голосов
/ 16 февраля 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

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

...