04/02/21 12:28
>>189
ちょっとあなたのと仕様が違いますが、昔書いたものを。
(defmacro alist-bind ((&rest vars) alist &body body)
(let ((tmp (gensym)))
`(let ((,tmp ,alist))
(let ,(mapcar #'(lambda (var)
`(,var (cdr (assoc ',var ,tmp :test #'eq))))
vars)
,@body))))
(setq data '((a . 1) (b . 2) (c . 3)))
(alist-bind (b c a) data
(list b c a))
=> (2 3 1)
(macroexpand-1 '(alist-bind (b c a) data (list b c a)))
=> (LET ((#:G219 DATA))
(LET ((B (CDR (ASSOC 'B #:G219 :TEST #'EQ)))
(C (CDR (ASSOC 'C #:G219 :TEST #'EQ)))
(A (CDR (ASSOC 'A #:G219 :TEST #'EQ))))
(LIST B C A)))