From: Douglas K. <do...@go...> - 2014-07-23 01:53:07
|
Hi Jean-Philippe, The multiple-value-variants system uses your plambda system in a way that by your own claim (in the documentation for plambda) "won't do the right thing" Indeed the pending release of SBCL will make it even more not do the right thing. Backquoted expressions were previously, as in most Lisps, built using conses and symbols. That is no longer strictly true. As you're aware, based on your additional parenthetical remark "(since there's no easy portable way to walk backquoted expressions)", this is permissible from an implementation standpoint. In particular: (plambda `(funcall ,:1 ,:2)) => #<FUNCTION (LAMBDA ()) {100A2A23CB}> which is a function of zero arguments, when you intended it to be a function of 2 arguments. Setting *print-pretty* to NIL shows you that the backquoted expression is, at the outermost level, a use of the QUASIQUOTE macro, but within it there is a #S(COMMA) which your code treats as a literal atom. * '`(funcall ,:1 ,:2) => (SB-INT:QUASIQUOTE (FUNCALL #S(SB-IMPL::COMMA :EXPR :|1| :KIND 0) #S(SB-IMPL::COMMA :EXPR :|2| :KIND 0))) I might suggest that as a first approximation to a fix, it might work to macroexpand backquoted forms, supposing that on other Lisps it will do no harm and on SBCL it will help. Please be advised that this change will be released soon, and let me know if there's anything I can clarify for you in terms of system-internal details. Regards, Doug |