【问题标题】:Strange behaviour of keywords within macros in ClojureClojure 宏中关键字的奇怪行为
【发布时间】:2010-05-19 19:19:43
【问题描述】:

在宏扩展时评估关键字访问在 Clojure 中的行为方式让我有些困惑。

以下工作如我所料:

(def m {:a 1})
(:a m)
=> 1 

但是,在宏中似乎无法使用相同的关键字访问:

(def m {:a 1})
(defmacro get-a [x] (:a x))
(get-a m)
=> nil

知道这里发生了什么吗?

【问题讨论】:

    标签: map clojure macros keyword


    【解决方案1】:

    您应该考虑到宏不会评估它们的参数,除非您告诉它们。在您的版本中, get-a 得到一个符号 m ,结果不是代码,它是关键字 :a 在符号中查找自身,这显然是 nil。但是,这可行:

    (defmacro get-a [x] `(:a ~x))
    

    使用参数 m 调用此宏的结果是表达式 '(:a m)',它在您的上下文中计算为 1。

    【讨论】:

    • OK - 所以如果你想让宏扩展为“1”而不是“(:a m)”,你会怎么做?我感兴趣的是如何在宏扩展时而不是稍后进行关键字查找,如果这有意义的话.....
    • 如果你真的想这样做,你可以使用 eval: (defmacro get-a [x] (:a (eval x))),但如果你只需要这样,一个函数就是在这里更合适。
    • 酷 - 完美运行!非常感谢!似乎我需要做的是评估符号。我实际上是在尝试用宏做一些更复杂的事情,但这种特殊的行为让我很受挫:-)
    猜你喜欢
    • 2016-12-27
    • 2018-12-16
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    相关资源
    最近更新 更多