1

http://www.learningclojure.com/2010/09/clojure-macro-tutorial-part-i-getting.htmlサイトからマクロのチュートリアルを読みましたが、 いくつかのエラーをデバッグする方法がわかりません。誰かが間違っている/正しくないことを説明できますか?

  • シンプルなバージョン
(defmacro dbgm_v1 [s] 
   (list 'let ['a s] (list 'println (list 'quote s) "=" 'a) 'a)
)
;;;;
(defn factorial_v1 [n] 
   (if (< n 2) n
        (dbgm_v1 (* n factorial_v1(dec n)) )
    ) 
)
;;

; let's test it
(factorial_v1 5) 
ClassCastException clojure.dg.alfa01$factorial_v1 cannot be cast to java.lang.Number  clojure.lang.Numbers.multiply (Numbers.java:146)
  • 複雑なバージョン
(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)))
))
;
user=> (factorial_v9 5)
ClassCastException clojure.dg.alfa01$factorial_v9 cannot be cast to java.lang.Nu
mber  clojure.lang.Numbers.multiply (Numbers.java:146)
user=>

同じエラーで失敗します。

上記のコードの何が問題になっていますか? ヒント/URL/メモをよろしくお願いします!

DG

4

1 に答える 1

1

左括弧がありません。

(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__)

、、および*を操作しようとしたときに、例外が発生しました。数値を操作するため、数値にキャストしようとして失敗しました。nfactorial_v9(dec n)*factorial_v9

于 2013-09-23T03:15:15.520 に答える