[Openmcl-devel] compiler bug?

Randall Beer beer at eecs.cwru.edu
Sat Sep 18 13:30:17 UTC 2004


> can't we just make (constantp x) be (numberp x)?
> I can't imagine a case where x would be anything else (other then 
> something that needs to be evaluated)
> :alex

This certainly works. However, it doesn't "expand away" as much of the 
computation as it could.  For example, with this definition, we get

? (macroexpand '(coerce-to-foreign-type #$NO :char))
(LET ((#:G2043 OS::NO))
    (IF (OR (EQ #:G2043 0) (NULL #:G2043))
         OS::NO
         OS::YES))
T

so that the test is still being done at runtime. Whereas with the EVAL 
change I made last night, we get.

? (macroexpand '(coerce-to-foreign-type #$NO :char))
0
T

Because these conversions have to happen for *every* argument passed 
into *every* message send, I was trying to do as much at compile-time 
as I possibly could.

BTW, my earlier bug shows once again why one should NOT use macros to 
address these sorts of efficiency concerns.  Instead, one should use 
functions with appropriate compiler macros to optimize the special 
cases (such as constant object and/or foreign type). I know this, but 
unfortunately still don't always do it.

Randy




More information about the Openmcl-devel mailing list