3.4 Using optimized constructs
eql. During compilation, the form is evaluated and replaced by its value. Forms that can be constant folded include symbols defined by using
defconstant, atoms other than symbols, lists whose car is
quote, and constant numerical expressions.
The Compiler can use constant folding on each of the following expressions:
pi (+ 1 2) (* 2.0 pi) '(this is a constant list) \#(a constant vector) (aref \#(a b c) 1) (car '(a b)) "Hi, I'm a string" '(a b)The Compiler does not use constant folding on the following expressions:
random-symbol (list 'values 'of 'this 'expression 'are 'not 'eql) (cons 'a 'b) (make-array 10) (* 0 (random-function-that-may-have-side-effects))Nonnumerical expressions that allocate new storage are usually not folded because the values are not
Note: You should never update structures created from constant forms because constant objects that appear in compiled code might be allocated by the loader in a read-only area in memory.
For example, the following function is incorrect:
(defun this-will-lose () (let ((x \#(0 0 0))) (setf (aref x 0) 1) ; Cannot update constants. x))The following function is correct:
(defun this-will-win () (let ((x (copy-seq \#(0 0 0)))) (setf (aref x 0) 1) x))
Generated with Harlequin WebMaker