Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 带有函数定义的宏,包括set!不在Clojurescript中工作_Macros_Clojurescript_Defn - Fatal编程技术网

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方法
我在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是名称空间别名):

我得到了“生产”和“其他生产”的定义,函数“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))