Find the value of arg
1
.
Find the value of arg
n
.
Apply the value of procedure to the values of arg
1
... arg
n
.
For example, consider the simple procedure application (+ 3 4). The value of + is the addition procedure,
the value of 3 is the number 3, and the value of 4 is the number 4. Applying the addition procedure to 3 and 4
yields 7, so our value is the object 7.
By applying this process at each level, we can find the value of the nested expression (* (+ 3 4) 2). The
value of * is the multiplication procedure, the value of (+ 3 4) we can determine to be the number 7, and the
value of 2 is the number 2. Multiplying 7 by 2 we get 14, so our answer is 14.
This rule works for procedure applications but not for quote expressions because the subexpressions of a
procedure application are evaluated, whereas the subexpression of a quote expression is not. The evaluation
of a quote expression is more similar to the evaluation of constant objects. The value of a quote expression
of the form (quote object) is simply object.
Constant objects, procedure applications, and quote expressions are only three of the many syntactic forms
provided by Scheme. Fortunately, only a few of the other syntactic forms need to be understood directly by a
Scheme programmer; these are referred to as core syntactic forms. The remaining syntactic forms are syntactic
extensions defined, ultimately, in terms of the core syntactic forms. We will discuss the remaining core
syntactic forms and a few syntactic extensions in the remaining sections of this chapter. Section 3.1 summarizes
the core syntactic forms and introduces the syntactic extension mechanism.
Before we go on to more syntactic forms and procedures, two points related to the evaluation of procedure
applications are worthy of note. First, the process given above is overspecified, in that it requires the
subexpressions to be evaluated from left to right. That is, procedure is evaluated before arg
1
, arg
1
is
evaluated before arg
2
, and so on. This need not be the case. A Scheme evaluator is free to evaluate the
expressions in any order---left to right, right to left, or any other sequential order. In fact, the subexpressions
may be evaluated in different orders for different applications, even in the same implementation.
The second point is that procedure is evaluated in the same way as arg
1
... arg
n
. While
procedure is often a variable that names a particular procedure, this need not be the case. Exercise 2.2.3
had you determine the value of the expression ((car (list + - * /)) 2 3). Here, procedure is
(car (list + - * /)). The value of (car (list + - * /)) is the addition procedure, just as if
procedure were simply the variable +.
Exercise 2.3.1
Write down the steps necessary to evaluate the expression below.
((car (cdr (list + - * /))) 17 5)
Section 2.4. Variables and Let Expressions
Suppose expr is a Scheme expression that contains a variable var. Suppose, additionally, that we would like
var to have the value val when we evaluate expr. For example, we might like x to have the value 2 when
we evaluate (+ x 3). Or, we might want y to have the value 3 when we evaluate (+ 2 y). The following
examples demonstrate how to do this using Scheme's let syntactic form.
(let ((x 2))
(+ x 3)) 5