【发布时间】:2011-05-16 08:37:24
【问题描述】:
好的,我想写一个 Clojure 宏来定义一个 struct-map 并让调用者为每个字段指定类型。
签名将如下所示:
(defmodel category :id Integer :name String)
它的作用是创建一个名为struct-map的类别,并创建一个绑定*category-meta*,这是一个映射{:id Integer :name String}
这是实现此目的的宏:
(defmacro defmodel [name & field-spec]
`(let [fields# (take-nth 2 ~@field-spec)]
(defstruct ~name fields#)
(def *~name-meta* (reduce #(assoc %1 (first %2) (last %2))) (partition 2 ~@field-spec))))
但是,问题是,我无法定义名称由另一个名称组成的绑定。基本上,(def *~name-meta* ...) 不起作用。
我怎样才能做到这一点?
谢谢。
【问题讨论】:
标签: macros clojure metaprogramming