Clojurescript宏和名称修改

时间:2018-06-02 04:19:49

标签: clojure clojurescript

上下文

我正在使用Clojurescript,我试图在编译时定义很多函数来包装Javascript API。我的代码适用于较低级别的编译器优化。是的,当我使用:optimizations :advanced Clojurescript编译器标志时,编译器会抛出警告:Use of undeclared Var my.namespace/fname并且我的代码在运行时不起作用(找不到某些损坏的符号)。

以下是此问题的最低示例:

(defmacro create-a-function [l]
  `(defn ~l [o#] (inc o#)))

(create-a-function fname)

;; Below inside another function
(defn fname-clone [k]
  (fname k))

我在编译时使用宏fname决定一个名为create-a-function的函数。当我尝试在运行时调用该函数时,它会失败。

我尝试了什么?

  • 降低优化级别:它可以正常工作
  • 测试了宏在repl上运行良好
  • 使用declare,如(declare fname),它在编译时删除警告但在运行时因同样的错误而失败。

我的问题

如何使用高级优化级别使这种代码工作?

1 个答案:

答案 0 :(得分:3)

我在this repo中复制了您的代码并且有效。

请注意,您必须将宏放在.clj文件中。

如果要在ClojureScript中使用.cljc文件中的宏,请使用macrovich