Structure and Interpretation of Computer Programs



Yüklə 2,71 Mb.
Pdf görüntüsü
səhifə7/222
tarix08.08.2018
ölçüsü2,71 Mb.
#61085
1   2   3   4   5   6   7   8   9   10   ...   222

designed in a modular manner, so that the parts can be constructed, replaced, and debugged separately.

Programming in Lisp

We need an appropriate language for describing processes, and we will use for this purpose the

programming language Lisp. Just as our everyday thoughts are usually expressed in our natural

language (such as English, French, or Japanese), and descriptions of quantitative phenomena are

expressed with mathematical notations, our procedural thoughts will be expressed in Lisp. Lisp was

invented in the late 1950s as a formalism for reasoning about the use of certain kinds of logical

expressions, called recursion equations, as a model for computation. The language was conceived by 

John McCarthy and is based on his paper ‘‘Recursive Functions of Symbolic Expressions and Their

Computation by Machine’’ (McCarthy 1960).

Despite its inception as a mathematical formalism, Lisp is a practical programming language. A Lisp 



interpreter is a machine that carries out processes described in the Lisp language. The first Lisp

interpreter was implemented by McCarthy with the help of colleagues and students in the Artificial

Intelligence Group of the MIT Research Laboratory of Electronics and in the MIT Computation 

Center.


1

 Lisp, whose name is an acronym for LISt Processing, was designed to provide

symbol-manipulating capabilities for attacking programming problems such as the symbolic

differentiation and integration of algebraic expressions. It included for this purpose new data objects

known as atoms and lists, which most strikingly set it apart from all other languages of the period.

Lisp was not the product of a concerted design effort. Instead, it evolved informally in an experimental

manner in response to users’ needs and to pragmatic implementation considerations. Lisp’s informal

evolution has continued through the years, and the community of Lisp users has traditionally resisted

attempts to promulgate any ‘‘official’’ definition of the language. This evolution, together with the

flexibility and elegance of the initial conception, has enabled Lisp, which is the second oldest language

in widespread use today (only Fortran is older), to continually adapt to encompass the most modern

ideas about program design. Thus, Lisp is by now a family of dialects, which, while sharing most of

the original features, may differ from one another in significant ways. The dialect of Lisp used in this

book is called Scheme.

2

Because of its experimental character and its emphasis on symbol manipulation, Lisp was at first very



inefficient for numerical computations, at least in comparison with Fortran. Over the years, however,

Lisp compilers have been developed that translate programs into machine code that can perform

numerical computations reasonably efficiently. And for special applications, Lisp has been used with

great effectiveness.

3

 Although Lisp has not yet overcome its old reputation as hopelessly inefficient,



Lisp is now used in many applications where efficiency is not the central concern. For example, Lisp

has become a language of choice for operating-system shell languages and for extension languages for

editors and computer-aided design systems.

If Lisp is not a mainstream language, why are we using it as the framework for our discussion of

programming? Because the language possesses unique features that make it an excellent medium for

studying important programming constructs and data structures and for relating them to the linguistic

features that support them. The most significant of these features is the fact that Lisp descriptions of

processes, called procedures, can themselves be represented and manipulated as Lisp data. The

importance of this is that there are powerful program-design techniques that rely on the ability to blur

the traditional distinction between ‘‘passive’’ data and ‘‘active’’ processes. As we shall discover,

Lisp’s flexibility in handling procedures as data makes it one of the most convenient languages in

existence for exploring these techniques. The ability to represent procedures as data also makes Lisp

an excellent language for writing programs that must manipulate other programs as data, such as the



interpreters and compilers that support computer languages. Above and beyond these considerations,

programming in Lisp is great fun.

1

 The Lisp 1 Programmer’s Manual appeared in 1960, and the Lisp 1.5 Programmer’s Manual 



(McCarthy 1965) was published in 1962. The early history of Lisp is described in McCarthy 1978. 

2

 The two dialects in which most major Lisp programs of the 1970s were written are MacLisp (Moon



1978; Pitman 1983), developed at the MIT Project MAC, and Interlisp (Teitelman 1974), developed at 

Bolt Beranek and Newman Inc. and the Xerox Palo Alto Research Center. Portable Standard Lisp 

(Hearn 1969; Griss 1981) was a Lisp dialect designed to be easily portable between different

machines. MacLisp spawned a number of subdialects, such as Franz Lisp, which was developed at the 

University of California at Berkeley, and Zetalisp (Moon 1981), which was based on a special-purpose

processor designed at the MIT Artificial Intelligence Laboratory to run Lisp very efficiently. The Lisp

dialect used in this book, called Scheme (Steele 1975), was invented in 1975 by Guy Lewis Steele Jr.

and Gerald Jay Sussman of the MIT Artificial Intelligence Laboratory and later reimplemented for

instructional use at MIT. Scheme became an IEEE standard in 1990 (IEEE 1990). The Common Lisp

dialect (Steele 1982, Steele 1990) was developed by the Lisp community to combine features from the

earlier Lisp dialects to make an industrial standard for Lisp. Common Lisp became an ANSI standard

in 1994 (ANSI 1994). 

3

 One such special application was a breakthrough computation of scientific importance -- an



integration of the motion of the Solar System that extended previous results by nearly two orders of

magnitude, and demonstrated that the dynamics of the Solar System is chaotic. This computation was

made possible by new integration algorithms, a special-purpose compiler, and a special-purpose

computer all implemented with the aid of software tools written in Lisp (Abelson et al. 1992; Sussman

and Wisdom 1992). 

[Go to first, previous, next page;   contents;   index]




Yüklə 2,71 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   10   ...   222




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə