如何在 Clojure 中生成这个表达式?

How to generate this expression in Clojure?

我正在使用 lobos 创建一组 tables:

(create
  (table :users
    (integer :id 20)
    (varchar :name 100)))

table 的架构保存在一个序列中:

([:integer :id 20] [:varchar :name 100])

如何使用 seq 生成该表达式?我发现 clojure.contrib/apply-macro 可以使用,但是还有其他方法吗?

您可以使用以下宏:

(defmacro table-create [name coll]
  `(~'create
    (~'table ~name ~@(map (fn [r]
                            (let [[type c v] r]
                              (list (symbol (subs (str type) 1)) c v)))
                          coll))))

这是一个示例 运行:

(macroexpand-1 '(table-create :users ([:integer :id 20] [:varchar :name 100])))
;=>     (create
         (table :users
                (integer :id 20)
                (varchar :name 100)))