Hi Gustavo
Thanks for the detailed report. I haven't looked at (or even used!)
this code for a _long_ time so it wouldn't surprise me if its broken.
I'll see what I can do over the Thanksgiving break.
regards,
On Nov 25, 2008, at 7:51 PM, Gustavo wrote:
> The compiler macros for functions disjoin and conjoin are broken.
> For debugging purposes, I copied the code to a macro to see what was
> happening.
>
> cl-user> (in-package :metatilities)
> #<package "METABANG.UTILITIES">
> utilities> (defmacro disjoin* (&whole form &rest fns)
> (cond ((every #'(lambda (x) (or (symbolp x) (function-expression-p
> x))) fns)
> (with-unique-names (args)
> `#'(lambda (,args)
> (or ,@(mapcar #'(lambda (x)
> `(apply ,(extract-head-form x)
> ,args))
> fns)))))
> (t form)))
> disjoin*
> utilities> (macroexpand-1 '(disjoin* #'macro-char-p #'whitespace-p))
> #'(lambda (#:|args/1399|)
> (or (apply macro-char-p #:|args/1399|) (apply whitespace-p #:|
> args/1399|)))
> t
>
> I realized this bug trying to compile a function - sbcl complained
> about the variables macro-char-p and whitespace-p not to be defined.
> That makes me wonder: what is "extract-head-form" doing? It should
> be usefull only if you did something like:
>
> (define-compiler-macro disjoin (fn &rest fns)
> ...
> `(,(extract-head-form x) ,@args)
> ...
> )
>
> I.e., eliminating the funcalls (I saw that somewhere on cliki.net
> some time ago).And, by the way, I guess that, the way the function
> disjoin is being defined, I guess there is no way to do this (the
> argument list is only known in execution time).
--
Gary Warren King, metabang.com
Cell: (413) 559 8738
Fax: (206) 338-4052
gwkkwg on Skype * garethsan on AIM