(guile.info.gz) Eval Special
Info Catalog
(guile.info.gz) Eval Procedure
(guile.info.gz) Evaluating
14.3.1.4 Evaluating Special Syntactic Expressions
.................................................
When a procedure invocation expression is evaluated, the procedure and
_all_ the argument expressions must be evaluated before the procedure
can be invoked. Special syntactic expressions are special because they
are able to manipulate their arguments in an unevaluated form, and can
choose whether to evaluate any or all of the argument expressions.
Why is this needed? Consider a program fragment that asks the user
whether or not to delete a file, and then deletes the file if the user
answers yes.
(if (string=? (read-answer "Should I delete this file?")
"yes")
(delete-file file))
If the outermost `(if ...)' expression here was a procedure
invocation expression, the expression `(delete-file file)', whose side
effect is to actually delete a file, would already have been evaluated
before the `if' procedure even got invoked! Clearly this is no use --
the whole point of an `if' expression is that the "consequent"
expression is only evaluated if the condition of the `if' expression is
"true".
Therefore `if' must be special syntax, not a procedure. Other
special syntaxes that we have already met are `define', `set!' and
`lambda'. `define' and `set!' are syntax because they need to know the
variable _name_ that is given as the first argument in a `define' or
`set!' expression, not that variable's value. `lambda' is syntax
because it does not immediately evaluate the expressions that define
the procedure body; instead it creates a procedure object that
incorporates these expressions so that they can be evaluated in the
future, when that procedure is invoked.
The rules for evaluating each special syntactic expression are
specified individually for each special syntax. For a summary of
standard special syntax, see Syntax Summary.
Info Catalog
(guile.info.gz) Eval Procedure
(guile.info.gz) Evaluating
automatically generated byinfo2html