如何在Clojure中生成此表达式?

时间:2015-01-21 21:02:03

标签: clojure

我使用lobos创建一组表格:

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

表的架构保存在seq:

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用以下宏:

(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)))