A critical aspect of a programming language is the means it provides
for using
names to refer to computational objects.
We say that the
name identifies a
variable
whose
value is the object.
In the Scheme dialect of Lisp, we name things with
define.
In Python, we name things with
declaration assignments.
| Original |
Python |
|
(define size 2)
|
size = 2
|
causes the interpreter to associate the value 2 with the
name
size.
Once the name
size
has been associated with the number 2, we can
refer to the value 2 by name:
| Original |
Python |
|
size
2
|
print(size)
2
|
| Original |
Python |
|
(* 5 size)
10
|
print(5 * size)
10
|
| Original |
|
Python |
| |
|
The Python interpreter needs to execute the declaration
assignment for size
before the name size can be used
in an expression. In this online book, the statements that need to be
evaluated before a new statement are omitted for brevity. However,
to see and play with the program, you can click on it. The
program then appears inline with all dependencies included.
Thus, as a result of clicking on
print(5 * size)
you see:
size = 2
print(5 * size)
|
Here are further examples of the use of
define:
declaration assignments:
| Original |
Python |
|
(define pi 3.14159)
|
pi = 3.14159
|
| Original |
Python |
|
(define radius 10)
|
radius = 10
|
| Original |
Python |
|
(* pi (* radius radius))
314.159
|
print(pi * radius * radius)
314.159
|
| Original |
Python |
|
(define circumference (* 2 pi radius))
|
circumference = 2 * pi * radius
|
| Original |
Python |
|
circumference
62.8318
|
print(circumference)
62.8318
|
Define
Declaration
assignment
is our language's
simplest means of abstraction, for it allows us to use simple names to
refer to the results of compound operations, such as the
circumference computed above.
In general, computational objects may have very complex
structures, and it would be extremely inconvenient to have to remember
and repeat their details each time we want to use them. Indeed,
complex programs are constructed by building, step by step,
computational objects of increasing complexity. The
interpreter makes this step-by-step program construction particularly
convenient because name-object associations can be created
incrementally in successive interactions. This feature encourages the
incremental development and testing of programs and is largely
responsible for the fact that a
Lisp
Python
program usually consists of a large
number of relatively simple
procedures.
functions.
It should be clear that the possibility of associating values with
names and later retrieving them means that the interpreter must
maintain some sort of memory that keeps track of the name-object
pairs. This memory is called the
environment
(more precisely the
global environment,
program environment,
since we will see later that a
computation may involve a number of different
environments).
1.1.2 Naming and the Environment