Skip to content

Instantly share code, notes, and snippets.

@slyrus
Created August 27, 2019 23:17
Show Gist options
  • Save slyrus/5c558d268248c7935c25d50f985a9416 to your computer and use it in GitHub Desktop.
Save slyrus/5c558d268248c7935c25d50f985a9416 to your computer and use it in GitHub Desktop.
with-assoc
(defmacro with-assoc (associations object &body body)
(let ((obj (gensym)))
`(let ((,obj ,object))
(declare (ignorable ,obj))
(symbol-macrolet
,(mapcar (lambda (association-entry)
(destructuring-bind (assoc-name var-name)
association-entry
`(,var-name (cdr (assoc ,assoc-name ,obj)))))
associations)
,@body))))
@Bike
Copy link

Bike commented Aug 27, 2019

(defmacro with-assoc (associations object &body body)
  (let ((obj (gensym "OBJECT"))
        (pairvars (loop repeat (length associations)
                        collect (gensym "PAIR"))))
    `(let ((,obj ,object))
       (let (,@(loop for (value ignore) in associations
                     for pvar in pairvars
                     collect `(,pvar (assoc ,value ,obj))))
         (declare (ignorable ,@pairvars))
         (symbol-macrolet
             (,@(loop for (ignore var) in associations
                      for pvar in pairvars
                      collect `(,var (cdr ,pvar))))
           ,@body)))))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment