Я нашел макрос defadt
в clojure.contrib. типы. К сожалению, полезной документации по использованию ADT в clojure нет. Я часами гуглил и нашел крошечные фрагменты информации об этом. Что такое ADT в clojure? Как их использовать? Любая информация будет полезна :)
Алгебраические типы данных Clojure
Ответы (2)
Некоторую информацию можно найти в examples.clj в src / clojure / contrib / types. Он показывает пример древовидной структуры, определенной как adt:
(defadt ::tree
empty-tree
(leaf value)
(node left-tree right-tree))
Больше информации в исходном файле.
person
Maurits Rijk
schedule
27.03.2011
Defadt устарел?
- person Didier A.; 20.03.2017
Здесь есть действительно интересный пример ADT в Clojure, :
Мы определяем генератор ADT следующим образом:
(defmacro data
[adt-name equals-sign & constructors]
`(do
(defn ~(symbol (str adt-name "?")) [~'obj]
(= ~(str adt-name) (adt-name ~'obj)))
~@(for [[type-name & fields]
(filter (partial not= '(|))
(partition-by (partial = '|) constructors))]
(apply (partial emit-constructor adt-name type-name)
fields))))
Учитывая пример Haskell:
data Tree a = Empty
| Leaf a
| Node Tree Tree
Затем мы пишем Clojure
(data Tree = Empty | Leaf value | Node left right)
Что довольно круто.
person
hawkeye
schedule
04.07.2016