繁体   English   中英

确保let表单中的宏可以访问本地变量

[英]make sure that a macro inside a let form has access to local vars

这是一个例子:

(defmacro aupdate-in [a i f & args]
  `(do
     (aset ~a ~i (~f (aget ~a ~i) ~@args))
     a))
(let [a (long-array [1 2 3 4])]
  (do
    (aupdate-in a 2 * 5)
    (pprint (vec a))))

这给出了一个错误:

CompilerException java.lang.RuntimeException: No such var: cina.fn-browser/a, compiling:(/Users/kaiyin/personal_config_bin_files/workspace/cina/src/cina/fn_browser.clj:20:16)

我可以修改一下并使其起作用:

(defmacro aupdate-in [a i f & args]
  (list 'do
        (list 'aset a i
              (list* f
                     (list 'aget a i) args))))
(let [a (long-array [1 2 3 4])]
  (do 
    (aupdate-in a 2 * 5)
    (pprint (vec a))))

但是所有list list*东西看起来都很难看。 有更好的解决方案吗?

您需要取消对a引用,以使其引用传入的符号:

(defmacro aupdate-in [a i f & args]
  `(do
     (aset ~a ~i (~f (aget ~a ~i) ~@args))
     ~a))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM