【发布时间】:2009-08-11 17:30:14
【问题描述】:
我正在学习 Clojure 中的宏,并想编写“cond”宏。
我在将参数解构为(条件)(参数)和编写递归宏时遇到问题。
请帮帮我。
【问题讨论】:
我正在学习 Clojure 中的宏,并想编写“cond”宏。
我在将参数解构为(条件)(参数)和编写递归宏时遇到问题。
请帮帮我。
【问题讨论】:
我写这篇文章是为了说明这个过程。这段代码有很多错误,但这个过程会让你尽快进入有趣的部分:) 写出对宏的调用以及您希望将该调用转换为的内容(此步骤不是可选的;)
(my-cond (even? 4) 42 (odd? 4 24))
(if (even? 4) 42 (if (odd? 4) 24)))
为最简单的情况编写一个模板,然后将其提供给 (macroexpand-1 ... ) 并旋转直到匹配为止
(defmacro my-cond [test result] `(if ~test ~result nil))
(macroexpand-1 '(my-cond (even? 4) 42) ==> (if (even? 4) 42)
现在让它更通用
(defmacro my-cond [& cases]
`(if (if ~(first cases) ~(second cases) ~(my-cond (drop 2 cases))
然后在macroexpand-1 中使用它,然后在macroexpand 中使用它(不带“-1”),以确保它完全扩展到正确的情况下
然后通过并清理存在奇数个术语等的极端情况......
然后查看 core.clj ,看看你有多接近。
【讨论】: