最近我开始写一些Clojure的代码,发现经常使用下面这种模式:
(let [x (bam)
y (boom)]
{:x x
:y y})
于是我写了以下宏:
(defmacro make-keyword-map [& syms]
`(hash-map ~@(mapcat (fn [s] [(keyword (name s)) s]) syms)))
有了这个,代码现在看起来像这样:
(let [x (bam)
y (boom)]
(make-keyword-map x y)
这种宏的写法是否被视为惯用的呢?还是我做错了什么,漏掉了已经建立的处理此类情况的模式?
(let [x (bam) y (boom x) z (zoom x)] ...)
。因为映射不能在自身内部引用其他键(因为它们在那个意义上不是“对象”)。 - missingfaktormake-keyword-map
更加简洁。原始版本似乎在一个尴尬的抽象层次上运行,其中映射的定义与本地变量的名称交织在一起。 - Chuck(defmacro make-keyword-map [& bindings] (let [ks (take-nth 2 bindings)] \
(let [~@bindings] (hash-map ~@(interleave (map keyword ks) ks)))))` - A. Webb