Этот вопрос основан на ограничении этот ответ .
Если у меня есть макрос, который использует кавычки со сращиванием, как это:
(defmacro instantiate [klass values]
`(new ~klass ~@values))
Это будет работать только в том случае, если values
является литеральной последовательностью или последовательной.
Если передается переменная, содержащая последовательность вроде:
(def v [1 2 3])
(macroexpand '(instantiate Person v))
Тогда на выходе будет ошибка, указывающая, что v
не является последовательностью.
Даже вызов функции будет интерпретирован как список:
(defn vf [] [1 2 3])
(macroexpand '(instantiate Person (vf)))
user=>(new Person vf)
У меня вопрос: есть ли способ использовать кавычки сплайсинга в макросах Clojure в тех двух случаях, когда последовательность, которая должна быть сплайсирована, не является литералом?