From ...
From: Erik Naggum
Subject: Re: help w/ &key in macros
Date: 1998/05/31
Message-ID: <3105643949024871@naggum.no>#1/1
X-Deja-AN: 358284550
References:
mail-copies-to: never
Organization: Naggum Software; +47 8800 8879; http://www.naggum.no
Newsgroups: comp.lang.lisp
* David Bakhash
| Basically, what I think might be happening is that if I define a
| function like:
|
| (defun f (x &optional y &key k1 k2)
| (..))
|
| and then call it like this:
|
| (f 10 :k1 3 :k2 4)
|
| then the &optional argument `y' gets the keyword value `:k1', and I
| somehow don't agree that this is how it should be, though I can also
| see how this is a subtle point, where someone had to make a decision.
you cannot disallow passing the keyword :K1 to the optional argument Y
via the standard argument-parsing machinery, which also cannot force the
argument list to match keywords at particular positions, such as ending
in a keyword plist. for the whole story on the ordinary lambda list:
http://www.harlequin.com/education/books/HyperSpec/Body/sec_3-4-1.html
| So, the question is how do be able to pass the args the way I did,
| such that it still works.
taking the easy way out and disallowing keywords as values of optional
arguments, which is not a brilliant solution, this could be a start.
(defun f (x &rest .arguments.)
(declare (dynamic-extent .arguments.))
(let ((y (unless (keywordp (first .arguments.)) (pop .arguments.))))
(destructuring-bind (&key k1 k2) .arguments.
...)))
this is obviously a macro-expansion... it is also not tested.
#:Erik
--
"Where do you want to go to jail today?"
-- U.S. Department of Justice Windows 98 slogan