【问题标题】:how to create symbols in macro from passed args如何从传递的参数在宏中创建符号
【发布时间】:2019-03-02 04:58:27
【问题描述】:

只是尝试宏限制或未知数,我无法在运行时使用更改的键对符号映射进行固定的透镜。
因此,当 k1 k2 作为 args 传递给 process-arity 时,它应该创建 j1 j2 符号来访问 syms-from-map 宏中的 k1 和 k2 值。
给出编译错误:
CompilerException java.lang.IllegalArgumentException:不知道如何从:clojure.core$map
创建 ISeq 引用取消引用使编写宏变得困难:-(

(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])

【问题讨论】:

  • 这些晦涩的宏观问题从何而来?是偶然的,还是有什么课程或什么 thaybis 建议每个人都去宏观狂野?

标签: clojure


【解决方案1】:

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

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

(syms-from-map ~'map1) 不会按您预期的方式工作。我建议你把它转换成一个函数。

【讨论】:

  • 如果我生成 j1、j2 符号,通过将其转换为函数,这些符号如何从 syms-from-map fn 传递给其他宏?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2022-11-30
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多