Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 帮助我在Clojure中编写Cond宏_Macros_Clojure - Fatal编程技术网

Macros 帮助我在Clojure中编写Cond宏

Macros 帮助我在Clojure中编写Cond宏,macros,clojure,Macros,Clojure,我正在Clojure学习宏,想写“cond”宏 我无法将参数分解为(条件)(参数)并编写递归宏 请帮帮我。我写这篇文章是为了说明这个过程。这段代码有很多bug,但是这个过程会让你尽快找到有趣的部分:) 写出对宏的调用以及希望该调用转换为什么(此步骤不是可选的;) 为最简单的情况编写模板,然后将其馈送到(macroexpand-1…)并旋转直到匹配 (defmacro my-cond [test result] `(if ~test ~result nil)) (macroexpand-1 '(

我正在Clojure学习宏,想写“cond”宏

我无法将参数分解为(条件)(参数)并编写递归宏


请帮帮我。

我写这篇文章是为了说明这个过程。这段代码有很多bug,但是这个过程会让你尽快找到有趣的部分:) 写出对宏的调用以及希望该调用转换为什么(此步骤不是可选的;)

为最简单的情况编写模板,然后将其馈送到(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,看看你有多接近

(defmacro my-cond [& cases]
  `(if (if ~(first cases) ~(second cases) ~(my-cond (drop 2 cases))