#database #macros #clojure
#База данных #макросы #clojure
Вопрос:
Макросы, перечисленные в этом разделеhttps://gist.github.com/1177043 (вставлено ниже)
(defmacro wrap-connection [amp; body]
`(if (sql/find-connection)
~@body
(sql/with-connection db ~@body)))
(defmacro transaction [amp; body]
`(if (sql/find-connection)
(sql/transaction ~@body)
(sql/with-connection db (sql/transaction ~@body))))
кажется, это довольно полезно. Существует ли «стандартная» реализация этих? По стандарту я имею в виду что-то в clojure.contrib или аналогичное. Я могу легко скопировать и вставить это в свой код, но мне интересно, есть ли способ получше. Или, другими словами, каков способ clojure сделать это?
Это мой первый опыт написания кода clojure (я много читал об этом и Common Lisp), поэтому я также пытаюсь понять, какие библиотеки существуют. Мне кажется, что менталитет Lisp — это что-то вроде «я могу написать это сам в 15 строках, так зачем мне использовать кого-то другого».
Комментарии:
1. Спасибо. Я думаю, что мне понравится clojure!
Ответ №1:
Из того, что я видел, когда вы абстрагируетесь от sql/transactions
и т.д., абстракции, как правило, более специфичны для конкретного приложения. написание собственных оболочек, как указано выше, когда это действительно упрощает работу, является каноническим способом решения проблем.
Используйте столько макросов, сколько действительно упрощает вашу жизнь, может возникнуть соблазн использовать следующие макросы (как в gist) способами, которые более запутанны или сложнее в обслуживании. Мне нравится эта суть; просто будьте осторожны, чтобы не перегружать макросы.
ps: если какой-то код больше пяти строк, я смотрю, написал ли его кто-то другой первым 🙂 но многие пользователи clojurians считают иначе.