;I create this function:
(defun list-pairs (pair-list)
(cond ((not pair-list)
nil)
(t
(destructuring-bind (a b &rest rest) pair-list
(cons (list (intern (symbol-name a)) b) (list-pairs rest)))))
;This is okay:
CL-USER> (list-pairs '(:fee "hi" :fie "ho"))
((FEE "hi") (FIE "ho"))
;So is this:
CL-USER> (setf vals '(:fee "hi" :fie "ho"))
(:FEE "hi" :FIE "ho")
CL-USER> (list-pairs vals)
((FEE "hi") (FIE "ho"))
;Then I create this function:
(defmacro let-list* (key-vals &body body)
`(let* ,(list-pairs key-vals)
,@body))
;This works:
CL-USER> (macroexpand-1 '(let-list* (:fee "hi" :fie "ho") (format t "~s ~s its off to work I go." fee fie)))
(LET* ((FEE "hi") (FIE "ho"))
(FORMAT T "~s ~s its off to work I go." FEE FIE))
T
CL-USER> (let-list* (:fee "hi" :fie "ho") (format t "~s ~s its off to work I go." fee fie))
"hi" "ho" its off to work I go.
NIL
;But this doesn't:
CL-USER> (macroexpand-1 '(let-list* vals (format t "~s ~s its off to work I go." fee fie)))
Error while parsing arguments to DESTRUCTURING-BIND:
invalid number of elements in
VALS
to satisfy lambda list
(A B &REST REST):
at least 2 expected, but got a non-list
[Condition of type SB-KERNEL::ARG-COUNT-ERROR]
;Why, and what do I need to do to get the value "passed in" or whatever terminology is used to describe the parameters in a call to a macro, to be expanded to their value to be provided to the function list-vals?