我从http://www.learningclojure.com/2010/09/clojure-macro-tutorial-part-i-getting.html站点上阅读了宏教程,我不知道如何调试一些错误。有人能描述什么是错的/不对的吗?
( dbgm_v1 s (list 'let 'a s (list 'println (list‘s) "=“a) 'a) )
;;;;(defn factorial_v1 n )
;;
; let's test it(factorial_v1 5)不能将ClassCastException clojure.dg.alfa01$factorial_v1转换为java.lang.Number clojure.lang.Numbers.multiply (Numbers.java:146)
( dbgm_v9 x‘(设x# ~x (println '~x "=“x#) x#) )
;(defn factorial_v9 n)
;user=> (factorial_v9 5) ClassCastException clojure.dg.alfa01$factorial_v9不能转换为java.lang.Nu mber clojure.lang.Numbers.multiply (Numbers.java:146) user=>
同样的错误也会失败。
上面的代码有什么问题?谢谢您的提示/url/便条!
DG
发布于 2013-09-23 03:15:15
你漏掉了一个括号。
(defmacro dbgm_v9 [x]
`(let [x# ~x] (println '~x "=" x#) x#))
(defn factorial_v9 [n]
(if (< n 2) n
(dbgm_v9 (* n (factorial_v9 (dec n))))))
;^ Missing (
(factorial_v9 5) ;=> 120您可以验证宏如何使用macroexpand展开。
(macroexpand '(dbgm_v9 (* n factorial_v9 (dec n))))
;=>
(let* [x__31341__auto__ (* n factorial_v9 (dec n))]
(clojure.core/println (quote (* n factorial_v9 (dec n))) "=" x__31341__auto__)
x__31341__auto__)当*试图对n、factorial_v9和(dec n)进行操作时,出现了异常。由于*对数字进行操作,它试图将factorial_v9转换为一个数字,但失败了。
https://stackoverflow.com/questions/18951101
复制相似问题