【发布时间】:2015-08-02 22:20:51
【问题描述】:
我正在尝试定义一个应该执行以下操作的宏:
- 将“变量”与初始值绑定
- 使用基于变量名称的名称创建 setter 方法
我在 clojure 文件中定义了以下内容:
(defmacro defprop
[prop-name init-value]
`(do
(def ~prop-name ~init-value)
(def ~(symbol (str prop-name "-other")) ~init-value)
(defn ~(symbol (str prop-name "-11")) [] (set! ~prop-name 11))
(defn ~(symbol (str prop-name "-set")) [new-val] (set! ~prop-name new-val))))
当像这样从 clojurescript 调用时(cmacros 是命名空间别名):
(cmacros/defprop production 350)
我对“生产”和“生产-其他”的定义正确,“生产-11”功能有效(并将生产价值设置为 11),但最后一个不起作用。 我在不同的浏览器中遇到不同的错误。 Chrome 显示“Uncaught SyntaxError: Unexpected token .”。 Firefox “SyntaxError: missing ) after 形式参数”。
Firefox 指出的有问题的 javascript 代码如下所示:
cgamemini.core.production_set = (function
cgamemini$core$production_set(cgamemini.macros.new_val) {
return cgamemini.core.production = cgamemini.macros.new_val;
}
);
似乎所有括号都正确,尽管我不是 js 专家。 怎么了?为什么 -11 定义有效但 -set 无效?
【问题讨论】:
标签: macros clojurescript defn