From: Nikodemus S. <tsi...@cc...> - 2005-11-04 09:04:10
|
Something like this: (defun sb!xc:constantp (form &optional environment) #!+sb-doc "True of any FORM that has a constant value: self-evaluation objects, constant variables, quote forms, and forms that macroexpand to constant-foldable function calls in the ENVIRONMENT." (typecase object ;; (Note that the following test on INFO catches KEYWORDs as well as ;; explicitly DEFCONSTANT symbols.) (symbol (eq (info :variable :kind object) :constant)) (list ;; FIXME: Dealing with inline expansions here would be nice (destructuring-bind (operator &rest operands) (macroexpand object environment) (or (eq operator 'quote) (and (eq (info :function :kind operator) :function) (ir1-attributep (fun-info-attributes (info :function :info operator)) foldable) (every (lambda (op) (constantp op environment)) operands))))) ;; A form that is not a symbol or a list is a constant. (t t))) Note quite mergable yet: uses of CONSTANTP in the compiler need to be updated to pass on the LEXENV as it is now used. Ditto for CONSTANT-FORM-VALUE. Cheers, -- Nikodemus Schemer: "Buddha is small, clean, and serious." Lispnik: "Buddha is big, has hairy armpits, and laughs." |