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
Recursion repl中的Clojure递归宏扩展_Recursion_Clojure_Macros_Leiningen_Read Eval Print Loop - Fatal编程技术网

Recursion repl中的Clojure递归宏扩展

Recursion repl中的Clojure递归宏扩展,recursion,clojure,macros,leiningen,read-eval-print-loop,Recursion,Clojure,Macros,Leiningen,Read Eval Print Loop,这是一个简化的示例,问题的重点是了解如何调试递归宏以及macroexpand如何在REPL中工作 这是我粘贴到lein repl的示例代码: (defn f1 [& params] (map inc params)) (defmacro a [x] (if (= (count x) 0) () (let [first-x (first x)] (if (= (count x) 1) `(f1 ~first-x) (let

这是一个简化的示例,问题的重点是了解如何调试递归宏以及macroexpand如何在REPL中工作

这是我粘贴到
lein repl
的示例代码:

(defn f1 [& params] (map inc params))

(defmacro a [x]
  (if (= (count x) 0)
    ()
    (let [first-x (first x)]
      (if (= (count x) 1)
        `(f1 ~first-x)
        (let [rest-x (rest x)]
          `((f1 ~first-x) (a ~rest-x)))))))
这就是我得到的:

user=> (f1 3)
(4)
user=> (f1 2 3 4)
(3 4 5)
user=> (macroexpand '(a ()))
()
user=> (macroexpand '(a (12)))
(user/f1 12)
user=> (macroexpand '(a (8 14)))
((user/f1 8) (user/a (14)))
user=> (macroexpand-all '(a (8 14)))

CompilerException java.lang.RuntimeException: Unable to resolve symbol: macroexpand-all in this context, compiling:(/tmp/form-init1519958991634351316.clj:1:1) 
user=> 
f1函数只是简单地增加值,这是一个简化的演示示例

macroexpand'(a())
(macroexpand'(a(12))
行满足了我的要求

下面是问题部分:

如何修复此问题,以便
(macroexpand'(a(8 14))
将计算为

((user/f1 8) (user/f1 14))
repl
中,不要停止在此扩展:

((user/f1 8) (user/a (14)))

我还尝试了macroexpand all,但它抛出了,请参见上文。

您需要
clojure.walk/macroexpand all
,可以在
clojure.walk
命名空间中找到,它是clojure.core的一部分

问题的最后一部分现在起作用了:

user=> (clojure.walk/macroexpand-all '(a (8 14)))
((user/f1 8) (user/f1 14))

macroexpand all
在clojure.walk中,您需要通过该名称空间访问它。这就解决了它。谢谢。你为什么不把你的评论作为回答,这样我就可以接受了