首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏的示例代码-相同(某种)错误

宏的示例代码-相同(某种)错误
EN

Stack Overflow用户
提问于 2013-09-23 02:49:32
回答 1查看 46关注 0票数 1

我从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) )

代码语言:javascript
复制
;;;;

(defn factorial_v1 n )

代码语言:javascript
复制
;;

; 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#) )

代码语言:javascript
复制
;

(defn factorial_v9 n)

代码语言:javascript
复制
;

user=> (factorial_v9 5) ClassCastException clojure.dg.alfa01$factorial_v9不能转换为java.lang.Nu mber clojure.lang.Numbers.multiply (Numbers.java:146) user=>

同样的错误也会失败。

上面的代码有什么问题?谢谢您的提示/url/便条!

DG

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-23 03:15:15

你漏掉了一个括号。

代码语言:javascript
复制
(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展开。

代码语言:javascript
复制
(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__)

*试图对nfactorial_v9(dec n)进行操作时,出现了异常。由于*对数字进行操作,它试图将factorial_v9转换为一个数字,但失败了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18951101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档