gpt4 book ai didi

clojure - 如何将 Clojure -> 宏与内部函数一起使用

转载 作者:行者123 更新时间:2023-12-02 10:45:44 25 4
gpt4 key购买 nike

我是 Clojure 初学者,我想了解 ->

此代码有效:

(-> '(1 2 3) reverse)

但这甚至无法编译,我不知道如何处理错误消息:

user=> (-> '(1 2 3) (fn [x] (reverse x)))

CompilerException java.lang.IllegalArgumentException:参数声明引用应该是向量,编译:(NO_SOURCE_PATH:1:1)

我该如何解决这个问题?

最佳答案

当意外的事情开始发生时,我经常使用macroexpand和 friend 。如果您在这里使用这些,那么发生的事情就会变得非常明显。

user=> (macroexpand-1 '(-> '(1 2 3) (fn [x] (reverse x))))
(fn (quote (1 2 3)) [x] (reverse x))

我认为看到这一点很明显 (quote (1 2 3) 不应该是 fn 的第一个参数。

我们还可以看到丑陋的双括号方法修复了它:

user=> (macroexpand-1 '(-> '(1 2 3) ((fn [x] (reverse x)))))
((fn [x] (reverse x)) (quote (1 2 3)))

旁注让我绊倒:你必须使用macroexpand-1才能在这里得到结果。如果您使用macroexpandclojure.walk/macroexpand-all,它会在第一次扩展后爆炸(除了您的异常(exception)),因为fn本身是一个宏,并且在第一次扩展后使用错误的语法进行调用。

关于clojure - 如何将 Clojure -> 宏与内部函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20219053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com