2024 Clojure状态调查!中分享你的想法。

欢迎!请在关于页面了解更多关于这个工具的信息。

+1 投票
ClojureScript

我正在尝试编写一个cljs宏,该宏可以将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))

当变量在宏使用的命名空间中定义时,这似乎可以正常工作,但当我从一个命名空间传递变量时,会抛出NullPointerException。

1 个答案

+2 投票

选中
 
最佳答案

不可以。

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

调用resolve会尝试在CLJ中解析变量,这只会在您使用.cljc文件时存在。这也可能是您尝试达到目标的最佳方式。

...