如何在ClojureScript的cljs.core命名空间中展开宏

Mas*_*art 3 clojure clojurescript

我很好奇某些宏正在做什么,并试图打电话(macroexpand-1)来获取更多信息.但是,我对如何扩展ClojureScript中的内置宏有点困惑,特别是cljs.core命名空间中的宏.根据文档,ClojureScript宏是用Clojure编写的,因此必须在Clojure REPL(而不是ClojureScript REPL)中进行测试,这是我一直在尝试的.

lein repl从我的ClojureScript项目目录运行,我试过这个:

=> (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)
Run Code Online (Sandbox Code Playgroud)

为什么会这样(cljs.core/int 99.9)?基于ClojureScript源代码,该宏不应该扩展到类似的东西(bit-or ~x 0)吗?

当我扩展非ClojureScript宏时,例如(macroexpand-1 '(when (even? 2) (println "2 is even"))),扩展似乎工作正常.

好像我在概念上遗漏了一些东西......

Mic*_*zyk 5

很可能你在这个提交之前使用的ClojureScript版本引入了int宏.尝试添加[org.clojure/clojurescript "0.0-1835"]到您的:dependencies.

另外,虽然这里不相关,但一般来说你应该使用ClojureScript macroexpand-1而不是Clojure来进行这样的测试:

(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)
Run Code Online (Sandbox Code Playgroud)