[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
SIDE-EFFECT-FREE/STATELESS Functions
Date: Fri, 13 May 88 14:46:52 PDT
From: Jon L White <edsel!jonl@labrea.stanford.edu>
Could you clarify how you are using "function" below? sometimes it seems
to apply to the symbol naming the routine being defined, and other times
it applies only to the compiled function object:
It refers to the function object in all cases. I omitted the word
"name" in one place, and I've added it in brackets below.
Date: Fri, 13 May 88 12:30 EDT
From: David A. Moon <Moon@STONY-BROOK.SCRC.Symbolics.COM>
The LT:SIDE-EFFECTS and LT:REPLICABILITY declarations license the
compiler to assume that the current definition and all future
redefinitions of the declared function [name] will have the declared
properties. The reason these declarations exist is solely for that
constraint on future redefinitions, since this is information that the
compiler could easily deduce for itself by analyzing the function body.
These declarations are placed in the body of a function and
declare properties of the function being defined; these properties are
available in all scopes where the name of the function is lexically
available.
"Future redefinitions" must mean "future rebindings of some symbol-function
cell", right?
I don't think I should admit to knowing what you mean by implementation
dependent concepts like "binding" and "cell". If the function was defined
by DEFUN, redefinition means evaluating a DEFUN for the same name.
Also, it appears as though the declaration can only
appear in the body of the code to which it applies; thus you couldn't
tell the compiler that BAR is reducible in the following way?
There was no function name field in the declaration syntax I showed.
The declarations apply to functions, not to function names, sorry about
the confusion. I don't know what it would mean to locally declare a
function to be free of side-effects; I think that's a property of the
function, not of a caller of the function.
(defun foo (x)
(declare (<simple-or-whatever> bar))
(prog (...)
A (bar x) ;compiler might flush this call
(when (< (random 5) 3)
(return (bar 10))))) ;compiler could constant-fold this one
As I read your message, the only way the Symbolics compiler could obtain
information about 'bar', for use while compileing 'foo', is if 'foo' and
'bar' are being defined in the same lexical scope and the declare is
inside the definition of 'bar'. If this isn't right, then maybe you
could give some examples.
I suspect I did not understand this comment. When defining a function
named bar, one declares properties of that function and all future
redefinitions of the function by putting a declare inside the function's
definition. When calling a function named bar, the declarations
attached to the definition that will be called are used.