clojure - 如何从传递的参数在宏中创建符号
问题描述
只是尝试宏限制或未知数,我无法在运行时使用更改的键对符号映射进行固定的线性度。
因此,当 k1 k2 作为 args 传递给 process-arity 时,它应该创建 j1 j2 符号来访问 syms-from-map 宏中的 k1 和 k2 值。
给出编译错误:
CompilerException java.lang.IllegalArgumentException:不知道如何从以下位置创建 ISeq:clojure.core$map
引用 unquoting 使得难以编写宏 :-(
(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])
解决方案
macroexpand-1
是一个有价值的工具。用它。
(defmacro process-arity[args]
`(let [] (fn ~args
(let [~'map1 (zipmap [~'j1 ~'j2] ~args)]
(syms-from-map ~'map1)))))
(syms-from-map ~'map1)
不会按您期望的方式工作。我建议您将其转换为函数。
推荐阅读
- linux-device-driver - 将 midi 键盘连接到拱形安装时遇到问题。杰克问题显然
- django - 选择除一个 Django 之外的所有字段
- c++ - 使用 ASIO 聊天服务器/客户端,找不到客户端示例代码
- r - R:返回我的函数中的对象列表不返回预期列表
- mysql - 将 Xamarin.Forms 与 MySQL 数据库连接时出现连接错误
- haskell - Haskell 类型约束
- swift - 分离结果
- php - 从两个数据表中返回一个数组,这是在输出 JSON 之前在 mySQL 或 PHP 中完成的吗?
- javascript - 我可以向 javascript 事件发送一个额外的对象并在事件中使用对象属性吗?
- php - 我们如何将 FORM 数据从包含的文件传递到另一个页面?