У меня проблема с созданием DSL в Clojure. Это конкретная проблема, которую я изолировал от всего остального.
Допустим, у нас есть простой макрос:
user> (defmacro m1 [x] `'~x)
#'user/m1
он просто возвращает предоставленный литерал
пользователь> (m1 toUpperCase)
toUpperCase
если мы вызываем Java-метод для объекта, все работает как положено
user> (. "a" toUpperCase)
"A"
но если подставить имя метода для вызова макроса, который возвращает имя метода
user> (. "a" (m1 toUpperCase))
; Evaluation aborted.
Unable to resolve symbol: toUpperCase in this context
Я хочу использовать некоторую библиотеку Java, которая имеет свободный интерфейс, такой как a (). B (). C ().
Это сопоставляется с Clojure как:
(.. obj method1 method2 method3....etc)
Я хочу создать макросы, которые заменят некоторые части этой цепочки, поэтому мой код должен выглядеть так:
(.. obj method1 macro1)
и это должно расшириться до
(.. obj method1 method2 method3)
определение также не помогает. Я попробовал это также