为什么我的clojurescript宏不起作用

时间:2018-03-24 14:03:34

标签: clojure macros lisp clojurescript leiningen

我需要与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

在浏览器的开发人员工具控制台中查看问题输出。

1 个答案:

答案 0 :(得分:1)

来自ClojureScript docs

  

当你可以使用defmacro时有一个严格的规则 - 你只能在我们称之为宏命名空间的地方使用它,有效地迫使你将你的编译时间和运行时代码分开。

错误是我试图在同一名称空间中测试宏。