我需要与when-not-empty-let
的{{3}}类似的clojure/core
宏。所以,我刚刚向when-let
添加了not-empty
来电:
(defmacro when-not-empty-let
"bindings => binding-form test
When test is not empty, evaluates body with binding-form bound to the value of test"
[bindings & body]
(.log js/console "check")
(let [form (first bindings) tst (second bindings)]
`(let [temp# ~tst]
(when (not-empty temp#)
(let [~form temp#]
~@body)))))
(也将(bindings 0)
替换为(first bindings)
,因为它没有编译)
我以下列方式使用它:
(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重现问题(至少对我而言):when-let
macro from clojure's source code
在浏览器的开发人员工具控制台中查看问题输出。
答案 0 :(得分:1)
当你可以使用defmacro时有一个严格的规则 - 你只能在我们称之为宏命名空间的地方使用它,有效地迫使你将你的编译时间和运行时代码分开。
错误是我试图在同一名称空间中测试宏。