DELTYPE не удалось в Lein Repl, что я делаю не так?
-
25-10-2019 - |
Вопрос
Перемещение http://www.assembla.com/spaces/clojure/wiki/datatypes
Я должен быть в состоянии ввести следующее в ответ Lein:
(DECTYPE BAR [ABCDE])
(Def B (бар 1 2 3 4 5))
Однако, когда я сделаю, я получаю следующий вывод:
java.lang.exception: ожидание var, но полоса отображается с классом user.bar (no_source_file: 31)
Я в замешательстве, и я полностью новичок в Clojure, вся помощь ценится!
Примечание: попробовал тот же код в стандартной Clojure Repl и получите одинаковую проблему.
Ответ: Ну, я ответил на свой собственный вопрос с небольшим дополнительным поиском. Оказывается, образец был плохим. Правильный способ создания бара был бы:
(def B (бар. 1 2 3 4 5))
А В конце бара в этом использовании важно. Все еще не совсем понимает, почему (так что вы, эксперты, пожалуйста, уточните, если у вас есть время, так как я хотел бы узнать детали;)).
Спасибо всем!
Решение
Я не так знаком с deftype
, но из того, что я вижу, вам нужна точка для создания экземпляра типа, попробуйте:
(deftype Bar [a b c d e])
(def b (Bar. 1 2 3 4 5))
Обратите внимание, это не Bar
, но Bar.
. Анкет Смотрите примеры, например, здесь:
- http://pastebin.com/9vqppebt
- http://onclojure.com/2010/08/26/reusable-method-implementations-for-deftypes/ (который использует
(new foo ...)
вместо(foo. ...)
)
Этот поток, кажется, указывает на это было изменение в deftype
:
Или, чтобы поставить его наоборот, документы на странице, которые вы ссылаетесь, кажутся устаревшими.
Надеюсь это поможет.
Другие советы
Есть два способа достижения того, что вы пытаетесь сделать. Во -первых, давайте пойдем через 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
Это дает вам поле для поля и ключевых слов. Этот доступ легко внесен, если вы решите, что одна из ваших полей содержит еще одну запись.