0

我正在编写一个 Clojure 宏,它应该接受一个映射,该映射具有一些代码作为其键的值。

稍后我想根据提供的密钥评估代码。

如何避免在我做之前评估地图值?我不希望引用整个地图,因为我需要评估密钥。

我不想传递引用的代码语法。

有没有办法让宏引用地图内的值?

4

1 回答 1

1

首先,正如我在两天前对您的问题的回答中指出的那样,如果宏要以任何方式转换地图本身,它必须将其作为地图文字接收,而不是例如命名地图的符号-持有当地。好吧,严格来说,您也可以接受符号并评估它们的全局编译时值;虽然没有办法获得运行时值。

如果您很乐意只接受文字映射,那么您可以在它们上使用通常的映射转换函数。例如,此宏将引用传入的映射文字中的值,同时不引用键:

(defmacro quote-vals [map-literal]
  (zipmap (keys map-literal)
          (map #(list 'quote %) (vals map-literal))))

来自 REPL:

(quote-vals {(+ 1 2) (+ 1 2) (+ 3 4) (+ 3 4)})
;= {7 (+ 3 4), 3 (+ 1 2)}
于 2013-07-12T07:36:13.177 回答