如何通过传递的参数在宏中创建符号

时间:2019-03-02 04:58:28

标签: clojure

仅尝试测试宏的限制或未知数,就无法在运行时更改键的情况下使符号映射固定不变。
因此,当将k1 k2作为args传递给进程arity时,它应该创建j1 j2符号来访问syms-from-map宏中的k1和k2值。
出现编译错误:
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 :(得分:0)

macroexpand-1是有价值的工具。使用它。

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

(syms-from-map ~'map1)无法按您期望的方式工作。我建议您将其转换为函数。