как создать символы в макросе из переданных аргументов - PullRequest
0 голосов
/ 02 марта 2019

Просто экспериментируя с ограничениями макросов или неизвестными, я не могу установить фиксированную длину для карты символов с измененными ключами во время выполнения.
Так что, когда k1 k2 передаются как аргументы для process-arity, это должно создать j1 j2 символовдля доступа к значениям k1 и k2 в макросе syms-from-map.
Предоставление ошибки компиляции:
CompilerException java.lang.IllegalArgumentException: Не знаю, как создать ISeq из: clojure.core $ mapцитирование без кавычек затрудняет написание макросов: - (

(defmacro syms-from-map[m]
  `(let [~@(mapcat (fn[[k v]] [k v]) (var-get (resolve m)))] 
     (prn "got" ~'j1 ~'j2))
  )

(defmacro process-arity[args]
  `(let [] (fn ~args 
     (let [~'map1 (zipmap '[j1 j2] ~args)] 
       (syms-from-map ~'map1)
       ))))
(def test-m1 (process-arity [k1 k2]))
(apply test-m1 [1 2])

1 Ответ

0 голосов
/ 02 марта 2019

macroexpand-1 является ценным инструментом.Используйте его.

(defmacro process-arity[args]
    `(let [] (fn ~args
                 (let [~'map1 (zipmap [~'j1 ~'j2] ~args)]
                     (syms-from-map ~'map1)))))

(syms-from-map ~'map1) не будет работать так, как вы ожидаете.Я предлагаю вам преобразовать его в функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...