如何在 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)))
我正在使用 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)))