Size: a a a

Clojure — русскоговорящее сообщество

2020 April 10

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
quote - просто выражение, которое не эвалится
quasiquote - как quote, но внутри ~ эвалятся
источник

E

ETL in Clojure — русскоговорящее сообщество
"В выражении ~'x используется форма размаскирования (~), чтобы
принудительно использовать неквалифицированный символ x в ка-
честве имени значения в let-связке".
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
> '(:a (+ 1 2))

(:a (+ 1 2))

> `(:a (+ 1 2))

(:a (clojure.core/+ 1 2))

> `(:a ~(+ 1 2))

(:a 3)
источник

E

ETL in Clojure — русскоговорящее сообщество
Нашел у Эмерика, чукча рано стал писателем, надо было еще пару страниц читателем побыть (это я про себя в роли писателя макросов).
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
ETL
"В выражении ~'x используется форма размаскирования (~), чтобы
принудительно использовать неквалифицированный символ x в ка-
честве имени значения в let-связке".
переводчику настучать по голове
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
> `(:a ~@[1 2])

(:a 1 2)
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
на примерах по идее всё должно быть понятно
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
в теории все эти *quote не обязательно должны использоваться с макросами, но на практике чаще всего используются именно там
источник

E

ETL in Clojure — русскоговорящее сообщество
👍👍👍
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
на практике чаще всего используется quote 😊
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
на практике чаще всего используется quote 😊
вне макросов
источник

E

ETL in Clojure — русскоговорящее сообщество
т.е. это не дурной тон писать макросы на list/quote/concat?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ETL
т.е. это не дурной тон писать макросы на list/quote/concat?
наверное нет, но мне оригинальный вариант был не очень понятен
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
наверное нет, но мне оригинальный вариант был не очень понятен
впрочем, он и так не очень понятен, если в code используются символы conn и так далее

думаю, что было бы лучше передавать идентификаторы, используемые в code, как параметры в макрос
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
впрочем, он и так не очень понятен, если в code используются символы conn и так далее

думаю, что было бы лучше передавать идентификаторы, используемые в code, как параметры в макрос
типа (megamacro [conn db call] code ...)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
типа (megamacro [conn db call] code ...)
а линтеру сказать, что он как fn работает
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
типа (megamacro [conn db call] code ...)
@apostaat вот вариант без магического порождения байндингов внутри макроса:
(defmacro megamacro
 [[connection, database, coll] code]
 `(let [~connection (mg/connect)
        ~database   (mg/get-db ~connection "monger-test")
        ~coll "documents"]
    ~code))
=> #'dev.playground/megamacro
(macroexpand '(megamacro [conn db coll] :code))
=> (let* [conn (mg/connect) db (mg/get-db conn "monger-test") coll "documents"] :code)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
@apostaat вот вариант без магического порождения байндингов внутри макроса:
(defmacro megamacro
 [[connection, database, coll] code]
 `(let [~connection (mg/connect)
        ~database   (mg/get-db ~connection "monger-test")
        ~coll "documents"]
    ~code))
=> #'dev.playground/megamacro
(macroexpand '(megamacro [conn db coll] :code))
=> (let* [conn (mg/connect) db (mg/get-db conn "monger-test") coll "documents"] :code)
а если conn например не используется в code, то его можно скрыть и использовать только в макросе для получения db. Тогда будет только два байндинга.
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
только мне вот что-то не очень нравится идея биндить локальные имена извне
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
ETL
Есть макрос, который я написал и который работает

(defmacro megamacro [code]
  (list 'let '[conn (mg/connect)
          db   (mg/get-db conn "monger-test")
          coll "documents"] code))
а есть пара примеров того, как оно выглядит без макроса?
источник