макрос как иметь дело с SQL как FN использовать карту - PullRequest
1 голос
/ 27 мая 2010

Я хочу использовать один макрос для обработки с параметром seq, но я не знаю, как!

например:.

(defmacro create-table-def
  [s]
  `(let [ks# (keys (struct-map ~s))
         sql# (map (fn [p#] (str (name p#) " varchar(20) ")) ks#)]
     (str "create-table " '~s " ( "
          (apply str (interleave seq# ", ")) " ) ") ))

У меня есть несколько параметров, вызывающих этот макрос, но я не использую map (map create-table-def ps) или lower, что мне делать, чтобы иметь дело.

Я использую макрос, потому что хочу знать символ параметра.

1 Ответ

0 голосов
/ 27 мая 2010

Я придумал эту версию, которая достаточно близка к вашей версии:

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

Однако, более прямо сфокусирован на решениях, (ab) используя печатное представление карты:

(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 );"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...