gpt4 book ai didi

clojure - 为什么我在下面的代码中会得到NPE?

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:20 25 4
gpt4 key购买 nike

以下代码按预期执行,但最后给出了一个 NullPointerException。我在这里做错了什么?

(ns my-first-macro)

(defmacro exec-all [& commands]
(map (fn [c] `(println "Code: " '~c "\t=>\tResult: " ~c)) commands))

(exec-all
(cons 2 [4 5 6])
({:k 3 :m 8} :k)
(conj [4 5 \d] \e \f))

; Output:
; Clojure 1.2.0-master-SNAPSHOT
; Code: (cons 2 [4 5 6]) => Result: (2 4 5 6)
; Code: ({:k 3, :m 8} :k) => Result: 3
; Code: (conj [4 5 d] e f) => Result: [4 5 d e f]
; java.lang.NullPointerException (MyFirstMacro.clj:0)
; 1:1 user=> #<Namespace my-first-macro>
; 1:2 my-first-macro=>

(对于正确语法突出显示的代码,请转到 here。)

最佳答案

看看正在发生的扩展:

(macroexpand '(exec-all (cons 2 [4 5 6])))
=>
((clojure.core/println "Code: " (quote (cons 2 [4 5 6])) "\t=>\tResult: " (cons 2 [4 5 6])))

如您所见,展开式周围多了一对括号,这意味着 Clojure 尝试执行 println 函数的结果,即 nil。

要解决这个问题,我建议修改宏以在前面包含一个“do”,例如

(defmacro exec-all [& commands]
(cons 'do (map (fn [c] `(println "Code: " '~c "\t=>\tResult: " ~c)) commands)))

关于clojure - 为什么我在下面的代码中会得到NPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247302/

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