xのinit()からend-1()のボディの値を1ずつ増やして計算するマクロ(my-dotimes [x init end] &本文)を書きたいと思います。 "可変キャプチャの問題"を回避する必要があります。各特定の変数にgensymを適用する方法
user=> (my-dotimes [x 0 4] (print x))
0123nil
私のコードは次のとおりです:それはこのように動作するはず
(defmacro my-dotimes [[x initial end] & body]
`(loop [i# ~initial]
(when (< i# ~end)
[email protected]
(recur (inc i#))))))
が、私はそれをチェックして検索しmacroexpandはを使用する場合:
user=> (macroexpand '(my-dotimes [x 0 4] (println x)))
(loop* [i__4548__auto__ 0] (clojure.core/when (clojure.core/<i__4548__auto__ 4)
(println x)
(recur (clojure.core/inc i__4548__auto__))))
私は
を変更する方法を疑問に思って(println x) => (clojure.core/println i__4548__auto__)
これはgensymを使用する必要はありません。しかし、ここでこの別の問題は、私はgensymを使用する必要があると思います:forループ(for-loop [symb init test change]&body])を書くと、変数、その初期値、終了条件、およびループの本体を指定します。 '(for-loop [i 0、(
そして、私のコードでは、 '(forループのdefmacro [[SYMBのiniトン変更]&ボディ]' \t ''(ループ[symbは#〜のini] \t \t(あります(loop * [change])))) '' macroexpand 'を使用してコードをチェックすると、 'user =>(macroexpand'(forループ[i 0(
@X iufenXu代わりに質問をコードブロックで更新してください。それは読みやすくなります。私もこれを見ています。 – coredump