Clojurescript宏和名称混淆

3

背景

我正在使用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))

我在编译时使用宏create-a-function定义了一个名为fname的函数。但是,当我尝试在运行时调用该函数时,它会失败。 我尝试过什么?
  • 降低优化级别:这样可以正常工作
  • 测试了宏在repl中的良好表现
  • 使用(declare fname)进行声明,这样可以消除编译时的警告,但在运行时出现相同的错误。
我的问题

如何使这种代码在高级优化级别下正常工作?


1
我无法重现你的问题。我复制粘贴了你的代码,在高级优化下它在这里可以正常工作。我假设你将宏放在单独的clj或cljc文件中,并使用require-macros导入?另外,你正在运行哪个版本的ClojureScript?我使用的是ClojureScript 1.10.238和shadow-cljs。虽然我不认为shadow-cljs在这里有什么区别.. - Hendrik Poernama
1个回答

3
我已经在这个仓库中重现了你的代码,并且它可以正常工作。
请注意,你需要将自己的宏放到一个.clj文件中。
如果你想要在ClojureScript中使用.cljc文件中的宏,请使用macrovich

谢谢,就这样了,我把宏放在了一个.cljc文件中。 - lc2817
更新了.cljc文件的答案。 - Michiel Borkent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接