Clojure 宏如何处理类似sql的fn使用映射

Clojure 宏如何处理类似sql的fn使用映射,clojure,Clojure,我想用一个宏来处理seq参数,但我不知道怎么做 e、 g: 我有多个参数调用这个宏,但没有使用map创建表def ps或reduce,我应该怎么处理 我使用宏是因为我想知道参数符号。我提出的这个版本与您的版本非常接近: (defmacro create-table-def [table-name key-val-map] (let [sql-part1 (vector "create table " (name table-name) "(") sql-pre-p

我想用一个宏来处理seq参数,但我不知道怎么做

e、 g:

我有多个参数调用这个宏,但没有使用map创建表def ps或reduce,我应该怎么处理


我使用宏是因为我想知道参数符号。

我提出的这个版本与您的版本非常接近:

(defmacro create-table-def [table-name key-val-map]
  (let [sql-part1 (vector "create table " 
      (name table-name)
      "(")
 sql-pre-part2 (apply vector 
        (map #(str (name (first %)) 
     " " 
     (second %)) 
      key-val-map))
 sql-part2 (butlast (interleave sql-pre-part2 (repeat ", ")))
 sql-part3 [");"]]
    (apply str (concat sql-part1 sql-part2 sql-part3))))

(create-table-def my-table {foo "varchar(20)" bar "int"})
;"create table my-table(foo varchar(20), bar int);"
如果你真的需要通过seq,你可以这样做:

(defmacro create-table-def2 [[name & pairs]]
  `(create-table-def ~name ~(apply array-map pairs)))

(create-table-def2 [my-table foo "varchar(20)" bar "int"])
;"create table my-table(foo varchar(20), bar int);"
或者就像直接论点一样:

(defmacro create-table-def3 [name & pairs]
  `(create-table-def ~name ~(apply array-map pairs)))

(create-table-def3 my-table foo "varchar(20)" bar "int")
;"create table my-table(foo varchar(20), bar int);"
但是,更直接地关注解决方案,滥用地图的印刷表示:

(use '[clojure.contrib.string :as str-utils])
(defmacro table-def [tname & things]
  (str-utils/join " " 
    ["create-table" (name tname) "("
     (str-utils/drop 1 
             (str-utils/chop 
              (print-str (apply array-map things))))
     ");"]))
(table-def my-table foo "varchar(20)" bar "int")
;"create-table my-table ( foo varchar(20), bar int );"

下次请用四个空格缩进您的代码,或者使用编辑栏中带有1和0的“代码”按钮为您执行此操作。我不知道您是更感兴趣学习编写宏还是学习在Clojure中使用SQL。如果是后者,请查看clojure.contrib.sql,特别是您问题中的示例create table函数。
(use '[clojure.contrib.string :as str-utils])
(defmacro table-def [tname & things]
  (str-utils/join " " 
    ["create-table" (name tname) "("
     (str-utils/drop 1 
             (str-utils/chop 
              (print-str (apply array-map things))))
     ");"]))
(table-def my-table foo "varchar(20)" bar "int")
;"create-table my-table ( foo varchar(20), bar int );"