3

特定のマクロが何をしているのかに興味があり、(macroexpand-1)より多くの情報を得るために電話をかけようとしました。ただし、ClojureScript の組み込みマクロ、特にcljs.core名前空間のマクロを展開する方法について少し混乱しています。ドキュメントによると、ClojureScript マクロは Clojure で記述されているため、(ClojureScript REPL ではなく) Clojure REPL でテストする必要があります。

私のClojureScriptプロジェクトのディレクトリから実行lein replして、これを試しました:

=> (require 'cljs.compiler)
=> (require 'cljs.core)
=> (macroexpand-1 '(cljs.core/int 99.9))
(macroexpand-1 '(cljs.core/int 99.9))
(cljs.core/int 99.9)

なぜそれが返されるの(cljs.core/int 99.9)ですか?ClojureScript sourceに基づいて、そのマクロは次のように展開されるべきではありません(bit-or ~x 0)か?

などの ClojureScript 以外のマクロを展開すると(macroexpand-1 '(when (even? 2) (println "2 is even")))、展開は正常に機能するようです。

概念的に何かが欠けているようです...

4

2 に答える 2

5

ほとんどの場合、マクロを導入するこのコミットより前のバージョンの ClojureScript を使用しています。intに追加[org.clojure/clojurescript "0.0-1835"]してみてください:dependencies

macroexpand-1また、これはここでは関係ありませんが、一般に、次のようなテストには Clojure ではなくClojureScript を使用する必要があります。

(require '[cljs.compiler :as comp]) ; must be required before cljs.core
(require '[cljs.core :as core])     ; the macros live here
(require '[cljs.analyzer :as ana])  ; macroexpand-1 lives here

;; ClojureScript's macroexpand-1 takes an environment as its first
;; argument; here's a useful initial environment:
(ana/macroexpand-1 {:locals {} :context :expr :ns 'cljs.user} '(int 5))
;= (cljs.core/bit-or 5 0)
于 2013-07-05T19:17:58.823 に答える
4

is allのコンパイラ マクロはありませんint

于 2013-07-05T15:17:10.427 に答える