请在的2024年Clojure调查中分享您的想法!

欢迎!有关如何使用本网站的信息,请参阅关于页面。

+1
ClojureScript

我正在尝试编写一个Clojure宏,将Clojure数据(例如{:font-size "14px"})转换成CSS(font-size: 14px;)。

我还希望这个宏可以接受映射字面量和解析为映射的符号。

例如。

(defstyles foo
  {:font-size "14px"})

;; -- OR --

(def bar {:font-size "14px"})
(defstyles foo bar)

在宏中,我尝试了以下操作

(defmacro defstyles [vsym]
  @(resolve vsym))

当这个变量在同一ns中定义且宏被使用时,这看起来可以工作,但当从一个ns传递变量时会发生NullPointerException。

1 个答案

+2

被选中
 
最佳答案

不行。

生成的代码将只在某些JavaScript运行时(例如浏览器)中eval,只有它才会“知道”这些“变量”的内容。从宏的这一侧,您可以使用cljs.analyzer.api实用工具访问名称和一些元数据,但不能访问变量内容。

调用resolve会尝试在CLJ中解析变量,这只会在使用.cljc文件时存在。这可能是实现您想要的功能的最佳方式。

...