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