为什么我的clojurescript宏不起作用
我需要类似于clojure/core的when not empty let宏。因此,我刚刚添加了非空呼叫: 还将绑定0替换为第一个绑定,因为它不会以其他方式编译 我使用它的方式如下:为什么我的clojurescript宏不起作用,clojure,macros,lisp,clojurescript,leiningen,Clojure,Macros,Lisp,Clojurescript,Leiningen,我需要类似于clojure/core的when not empty let宏。因此,我刚刚添加了非空呼叫: 还将绑定0替换为第一个绑定,因为它不会以其他方式编译 我使用它的方式如下: (defn something [] (when-not-empty-let [foo ["foo"]] (.log js/console foo))) (something) 我得到以下输出: 未定义 检查 我做错了什么 使用Clojure v1.9.0构建,Clojure
(defn something
[]
(when-not-empty-let [foo ["foo"]]
(.log js/console foo)))
(something)
我得到以下输出:
未定义
检查
我做错了什么
使用Clojure v1.9.0构建,ClojureScript:v1.10.126,lein cljsbuild:v1.1.7
在Ubuntu下的Chrome v59.0.3071.115中测试
UPD:jsbin,它至少为我复制了问题:
请参阅浏览器开发人员工具控制台中问题的输出。来自:
对于何时可以使用defmacro,有一个严格的规则——您只能在我们称之为宏名称空间的地方使用它,这实际上迫使您将编译时代码和运行时代码分开
错误是我试图在同一命名空间中测试宏。无法复制,至少使用Clojure。我怀疑Cljs行为的差异会导致这种情况。您的输出似乎也没有意义。应立即进行检查,然后再进行未定义检查。如果您在检查后没有得到任何结果,那么未定义的内容似乎是无关的,实际上您根本没有得到任何输出。将打印更改为println后,在Clojure中运行此命令,我得到一个在它们之间换行的outout check[foo]。绑定分配也可以减少为使用解构让[[form tst]绑定]。这里没有问题,但它看起来更漂亮了。@Carcigenicate感谢您的参与,我已经更新了问题并链接到了jsbin,请查看。我不确定jsbin是怎么回事。输出只显示一个像素值,console出于某种原因显示扩展的宏,但不显示运行代码。@Carcigenicate这是迄今为止我发现的最好的小提琴手,不幸的是,您应该打开浏览器开发工具以查看实际日志,通常是F12/控制台部分
(defn something
[]
(when-not-empty-let [foo ["foo"]]
(.log js/console foo)))
(something)