Macros 带有函数定义的宏,包括set!不在Clojurescript中工作
我正在尝试定义一个宏,该宏应执行以下操作:Macros 带有函数定义的宏,包括set!不在Clojurescript中工作,macros,clojurescript,defn,Macros,Clojurescript,Defn,我正在尝试定义一个宏,该宏应执行以下操作: 将“变量”与初始值绑定 使用基于变量名的名称创建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-nam
- 将“变量”与初始值绑定
- 使用基于变量名的名称创建setter方法
(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是名称空间别名):
我得到了“生产”和“其他生产”的定义,函数“production-11”起作用(并将生产值设置为11),但最后一个不起作用。
我在不同的浏览器中遇到不同的错误。Chrome说“未捕获的SyntaxError:意外标记”。Firefox“SyntaxError:missing)在形式参数之后
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却不起作用?问题在于
newval
。Clojure宏扩展不理解语法,因此它不知道new val
应该是一个参数——宏扩展中出现的任何裸符号都会自动命名为当前名称空间。这就是为什么您会在输出中看到cgamemini$core$production\u集(cgamemini.macros.new\u val)
。您要做的是使用宏语法来指示应该创建一个没有名称空间的新符号,例如
`(defn ~(symbol (str prop-name "-set")) [new-val#] (set! ~prop-name new-val#))
另一种方法是注入符号:
`(defn ~(symbol (str prop-name "-set")) [~'new-val] (set! ~prop-name ~'new-val))
`(defn ~(symbol (str prop-name "-set")) [~'new-val] (set! ~prop-name ~'new-val))