aboutsummaryrefslogtreecommitdiff
path: root/macros.lisp
blob: 3832296551ff0cbcdfcca3b278f45962d439c5ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
;;;; macros.lisp --- utility macros


(in-package :lazybones)

(defmacro let-parameters ((&rest names) &body body)
  "NAMES is a list of symbols. Binds the names to the value of the
request parameters whose keys compare string-equal to the symbol-name
of each NAME, or NIL if there is no such parameter."
  (let ((params (gensym)))
    `(let ((,params (lazybones:request-parameters)))
      (let ,(loop for name in names
                  for string-name = (symbol-name name) 
                  collect `(,name (cdr (assoc ,string-name ,params :test #'string-equal))))
        ,@body))))

(defmacro map-parameters ((&rest params) &body body)
  "PARAMS is a list of pairs (NAME PARSER).  MAP-PARAMETERS behaves
exactly like LET-PARAMETERS except that the values boudn to NAMEs are
first mapped with the PARSER function."
  (assert (loop for (name parser) in params
                always (and (symbolp name)
                            (or (symbolp parser) (functionp parser))))
          ()
          "Malformed PARAMS in MAP-PARAMETERS macro")

  (let ((names (mapcar #'car params)))
    `(let-parameters ,names
       (let ,(loop for name in names
                   collect `(,name (when ,name (funcall ',(second (assoc name params)) ,name))))
         ,@body))))