[plt-scheme] keyword arguments (in v4.0, maybe)
On Jun 13, Robby Findler wrote:
> On 6/12/07, Eli Barzilay <eli at barzilay.org> wrote:
> > On Jun 12, Robby Findler wrote:
> > > Here's another question (which I think your macro expansion
> > > message may have answered implicitly, I'm not sure): what
> > > happens when I do something like this:
> > >
> > > (lambda args (printf "~s\n" args) (apply f args))
> > >
> > > [...]
> >
> > You won't be able to see them -- and the problem that I'm talking
> > about is that you won't be able to accept them. This procedure
> > will simply barf if given keyword arguments. (At least IIUC, and
> > I think I do...) The bottom line is that this procedure is
> > sort-of like a traced `f' except that it does not accept keyword
> > arguments at all. (More in a separate message.)
> >
>
> You and Matthew seem to be in direct contradiction on this point.
If you remember, the problem started with
f == (lambda xs (apply f xs))
not being true for keyworded arguments. The rest argument does not
have the keyword information -- unlike the current situation with
"kw.ss".
As Matthew mentioned later, you will need an explicit
`make-keyword-procedure' to access the keywords -- without that, you
will not be able to see them, and because you have a non-keyword
procedure, calling it with keywords is an arity error. As Matthew
wrote:
|(define (trace-wrap f)
| (make-keyword-procedure
| (lambda (kw-args . rest)
| (printf "Called with ~s ~s\n" kw-args rest)
| (keyword-apply f kw-args rest))))
|
| > ((trace-wrap greet) "John" #:hi "Howdy")
| Called with ((#:hi . "Howdy")) ("John")
| "Howdy, John Smith"
--
((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
http://www.barzilay.org/ Maze is Life!