Added P Pareit.
[bpt/guile.git] / doc / ref / scheme-ideas.texi
CommitLineData
a0e07ba4
NJ
1@page
2@node Basic Ideas
3@chapter Basic Ideas in Scheme
4
5In this chapter, we introduce the basic concepts that underpin the
6elegance and power of the Scheme language.
7
8Readers who already possess a background knowledge of Scheme may happily
9skip this chapter. For the reader who is new to the language, however,
10the following discussions on data, procedures, expressions and closure
11are designed to provide a minimum level of Scheme understanding that is
12more or less assumed by the reference chapters that follow.
13
14The style of this introductory material aims about halfway between the
15terse precision of R5RS and the discursive randomness of a Scheme
16tutorial.
17
18@menu
19* About Data:: Latent typing, types, values and variables.
20* About Procedures:: The representation and use of procedures.
21* About Expressions:: All kinds of expressions and their meaning.
22* About Closure:: Closure, scoping and environments.
23@end menu
24
25
26@node About Data
27@section Data Types, Values and Variables
28
29This section discusses the representation of data types and values, what
30it means for Scheme to be a @dfn{latently typed} language, and the role
31of variables. We conclude by introducing the Scheme syntaxes for
32defining a new variable, and for changing the value of an existing
33variable.
34
35@menu
36* Latent Typing:: Scheme as a "latently typed" language.
37* Values and Variables:: About data types, values and variables.
38* Definition:: Defining variables and setting their values.
39@end menu
40
41
42@node Latent Typing
43@subsection Latent Typing
44
85a9b4ed 45The term @dfn{latent typing} is used to describe a computer language,
a0e07ba4
NJ
46such as Scheme, for which you cannot, @emph{in general}, simply look at
47a program's source code and determine what type of data will be
48associated with a particular variable, or with the result of a
49particular expression.
50
51Sometimes, of course, you @emph{can} tell from the code what the type of
52an expression will be. If you have a line in your program that sets the
53variable @code{x} to the numeric value 1, you can be certain that,
54immediately after that line has executed (and in the absence of multiple
55threads), @code{x} has the numeric value 1. Or if you write a procedure
56that is designed to concatenate two strings, it is likely that the rest
57of your application will always invoke this procedure with two string
58parameters, and quite probable that the procedure would go wrong in some
59way if it was ever invoked with parameters that were not both strings.
60
61Nevertheless, the point is that there is nothing in Scheme which
62requires the procedure parameters always to be strings, or @code{x}
63always to hold a numeric value, and there is no way of declaring in your
64program that such constraints should always be obeyed. In the same
65vein, there is no way to declare the expected type of a procedure's
66return value.
67
68Instead, the types of variables and expressions are only known -- in
69general -- at run time. If you @emph{need} to check at some point that
70a value has the expected type, Scheme provides run time procedures that
71you can invoke to do so. But equally, it can be perfectly valid for two
72separate invocations of the same procedure to specify arguments with
73different types, and to return values with different types.
74
75The next subsection explains what this means in practice, for the ways
76that Scheme programs use data types, values and variables.
77
78
79@node Values and Variables
80@subsection Values and Variables
81
82Scheme provides many data types that you can use to represent your data.
83Primitive types include characters, strings, numbers and procedures.
84Compound types, which allow a group of primitive and compound values to
85be stored together, include lists, pairs, vectors and multi-dimensional
86arrays. In addition, Guile allows applications to define their own data
87types, with the same status as the built-in standard Scheme types.
88
89As a Scheme program runs, values of all types pop in and out of
90existence. Sometimes values are stored in variables, but more commonly
91they pass seamlessly from being the result of one computation to being
92one of the parameters for the next.
93
94Consider an example. A string value is created because the interpreter
95reads in a literal string from your program's source code. Then a
96numeric value is created as the result of calculating the length of the
97string. A second numeric value is created by doubling the calculated
98length. Finally the program creates a list with two elements -- the
99doubled length and the original string itself -- and stores this list in
100a program variable.
101
102All of the values involved here -- in fact, all values in Scheme --
103carry their type with them. In other words, every value ``knows,'' at
104runtime, what kind of value it is. A number, a string, a list,
105whatever.
106
107A variable, on the other hand, has no fixed type. A variable --
108@code{x}, say -- is simply the name of a location -- a box -- in which
109you can store any kind of Scheme value. So the same variable in a
110program may hold a number at one moment, a list of procedures the next,
111and later a pair of strings. The ``type'' of a variable -- insofar as
112the idea is meaningful at all -- is simply the type of whatever value
113the variable happens to be storing at a particular moment.
114
115
116@node Definition
117@subsection Defining and Setting Variables
118
119To define a new variable, you use Scheme's @code{define} syntax like
120this:
121
122@lisp
123(define @var{variable-name} @var{value})
124@end lisp
125
126This makes a new variable called @var{variable-name} and stores
127@var{value} in it as the variable's initial value. For example:
128
129@lisp
130;; Make a variable `x' with initial numeric value 1.
131(define x 1)
132
133;; Make a variable `organization' with an initial string value.
134(define organization "Free Software Foundation")
135@end lisp
136
137(In Scheme, a semicolon marks the beginning of a comment that continues
138until the end of the line. So the lines beginning @code{;;} are
139comments.)
140
141Changing the value of an already existing variable is very similar,
142except that @code{define} is replaced by the Scheme syntax @code{set!},
143like this:
144
145@lisp
146(set! @var{variable-name} @var{new-value})
147@end lisp
148
149Remember that variables do not have fixed types, so @var{new-value} may
150have a completely different type from whatever was previously stored in
151the location named by @var{variable-name}. Both of the following
152examples are therefore correct.
153
154@lisp
155;; Change the value of `x' to 5.
156(set! x 5)
157
158;; Change the value of `organization' to the FSF's street number.
159(set! organization 545)
160@end lisp
161
162In these examples, @var{value} and @var{new-value} are literal numeric
163or string values. In general, however, @var{value} and @var{new-value}
164can be any Scheme expression. Even though we have not yet covered the
165forms that Scheme expressions can take (@pxref{About Expressions}), you
166can probably guess what the following @code{set!} example does@dots{}
167
168@lisp
169(set! x (+ x 1))
170@end lisp
171
172(Note: this is not a complete description of @code{define} and
173@code{set!}, because we need to introduce some other aspects of Scheme
174before the missing pieces can be filled in. If, however, you are
175already familiar with the structure of Scheme, you may like to read
176about those missing pieces immediately by jumping ahead to the following
177references.
178
179@itemize @bullet
a0e07ba4
NJ
180@item
181@ref{Lambda Alternatives}, to read about an alternative form of the
182@code{define} syntax that can be used when defining new procedures.
183
184@item
6c997de2
NJ
185@ref{Procedures with Setters}, to read about an alternative form of the
186@code{set!} syntax that helps with changing a single value in the depths
187of a compound data structure.)
a7a7bb95
NJ
188
189@item
190@xref{Internal Definitions}, to read about using @code{define} other
191than at top level in a Scheme program, including a discussion of when it
192works to use @code{define} rather than @code{set!} to change the value
193of an existing variable.
a0e07ba4
NJ
194@end itemize
195
196
197@node About Procedures
198@section The Representation and Use of Procedures
199
200This section introduces the basics of using and creating Scheme
201procedures. It discusses the representation of procedures as just
202another kind of Scheme value, and shows how procedure invocation
203expressions are constructed. We then explain how @code{lambda} is used
204to create new procedures, and conclude by presenting the various
205shorthand forms of @code{define} that can be used instead of writing an
206explicit @code{lambda} expression.
207
208@menu
209* Procedures as Values:: Procedures are values like everything else.
210* Simple Invocation:: How to write a simple procedure invocation.
211* Creating a Procedure:: How to create your own procedures.
212* Lambda Alternatives:: Other ways of writing procedure definitions.
213@end menu
214
215
216@node Procedures as Values
217@subsection Procedures as Values
218
219One of the great simplifications of Scheme is that a procedure is just
220another type of value, and that procedure values can be passed around
221and stored in variables in exactly the same way as, for example, strings
222and lists. When we talk about a built-in standard Scheme procedure such
223as @code{open-input-file}, what we actually mean is that there is a
224pre-defined top level variable called @code{open-input-file}, whose
225value is a procedure that implements what R5RS says that
226@code{open-input-file} should do.
227
228Note that this is quite different from many dialects of Lisp ---
229including Emacs Lisp --- in which a program can use the same name with
230two quite separate meanings: one meaning identifies a Lisp function,
231while the other meaning identifies a Lisp variable, whose value need
232have nothing to do with the function that is associated with the first
233meaning. In these dialects, functions and variables are said to live in
234different @dfn{namespaces}.
235
236In Scheme, on the other hand, all names belong to a single unified
237namespace, and the variables that these names identify can hold any kind
238of Scheme value, including procedure values.
239
240One consequence of the ``procedures as values'' idea is that, if you
241don't happen to like the standard name for a Scheme procedure, you can
242change it.
243
244For example, @code{call-with-current-continuation} is a very important
245standard Scheme procedure, but it also has a very long name! So, many
246programmers use the following definition to assign the same procedure
247value to the more convenient name @code{call/cc}.
248
249@lisp
250(define call/cc call-with-current-continuation)
251@end lisp
252
253Let's understand exactly how this works. The definition creates a new
254variable @code{call/cc}, and then sets its value to the value of the
255variable @code{call-with-current-continuation}; the latter value is a
256procedure that implements the behaviour that R5RS specifies under the
257name ``call-with-current-continuation''. So @code{call/cc} ends up
258holding this value as well.
259
260Now that @code{call/cc} holds the required procedure value, you could
261choose to use @code{call-with-current-continuation} for a completely
262different purpose, or just change its value so that you will get an
263error if you accidentally use @code{call-with-current-continuation} as a
264procedure in your program rather than @code{call/cc}. For example:
265
266@lisp
267(set! call-with-current-continuation "Not a procedure any more!")
268@end lisp
269
270Or you could just leave @code{call-with-current-continuation} as it was.
271It's perfectly fine for more than one variable to hold the same
272procedure value.
273
274
275@node Simple Invocation
276@subsection Simple Procedure Invocation
277
278A procedure invocation in Scheme is written like this:
279
280@lisp
281(@var{procedure} [@var{arg1} [@var{arg2} @dots{}]])
282@end lisp
283
284In this expression, @var{procedure} can be any Scheme expression whose
285value is a procedure. Most commonly, however, @var{procedure} is simply
286the name of a variable whose value is a procedure.
287
288For example, @code{string-append} is a standard Scheme procedure whose
289behaviour is to concatenate together all the arguments, which are
290expected to be strings, that it is given. So the expression
291
292@lisp
293(string-append "/home" "/" "andrew")
294@end lisp
295
296@noindent
297is a procedure invocation whose result is the string value
298@code{"/home/andrew"}.
299
300Similarly, @code{string-length} is a standard Scheme procedure that
301returns the length of a single string argument, so
302
303@lisp
304(string-length "abc")
305@end lisp
306
307@noindent
308is a procedure invocation whose result is the numeric value 3.
309
310Each of the parameters in a procedure invocation can itself be any
311Scheme expression. Since a procedure invocation is itself a type of
312expression, we can put these two examples together to get
313
314@lisp
315(string-length (string-append "/home" "/" "andrew"))
316@end lisp
317
318@noindent
319--- a procedure invocation whose result is the numeric value 12.
320
321(You may be wondering what happens if the two examples are combined the
322other way round. If we do this, we can make a procedure invocation
323expression that is @emph{syntactically} correct:
324
325@lisp
326(string-append "/home" (string-length "abc"))
327@end lisp
328
329@noindent
330but when this expression is executed, it will cause an error, because
331the result of @code{(string-length "abc")} is a numeric value, and
332@code{string-append} is not designed to accept a numeric value as one of
333its arguments.)
334
335
336@node Creating a Procedure
337@subsection Creating and Using a New Procedure
338
339Scheme has lots of standard procedures, and Guile provides all of these
340via predefined top level variables. All of these standard procedures
341are documented in the later chapters of this reference manual.
342
343Before very long, though, you will want to create new procedures that
344encapsulate aspects of your own applications' functionality. To do
345this, you can use the famous @code{lambda} syntax.
346
347For example, the value of the following Scheme expression
348
349@lisp
350(lambda (name address) @var{expression} @dots{})
351@end lisp
352
353@noindent
354is a newly created procedure that takes two arguments:
355@code{name} and @code{address}. The behaviour of the
356new procedure is determined by the sequence of @var{expression}s in the
357@dfn{body} of the procedure definition. (Typically, these
358@var{expression}s would use the arguments in some way, or else there
359wouldn't be any point in giving them to the procedure.) When invoked,
360the new procedure returns a value that is the value of the last
361@var{expression} in the procedure body.
362
363To make things more concrete, let's suppose that the two arguments are
364both strings, and that the purpose of this procedure is to form a
365combined string that includes these arguments. Then the full lambda
366expression might look like this:
367
368@lisp
369(lambda (name address)
370 (string-append "Name=" name ":Address=" address))
371@end lisp
372
373We noted in the previous subsection that the @var{procedure} part of a
374procedure invocation expression can be any Scheme expression whose value
375is a procedure. But that's exactly what a lambda expression is! So we
376can use a lambda expression directly in a procedure invocation, like
377this:
378
379@lisp
380((lambda (name address)
381 (string-append "Name=" name ":Address=" address))
382 "FSF"
383 "Cambridge")
384@end lisp
385
386@noindent
a7a7bb95 387This is a valid procedure invocation expression, and its result is the
a0e07ba4
NJ
388string @code{"Name=FSF:Address=Cambridge"}.
389
390It it more common, though, to store the procedure value in a variable ---
391
392@lisp
393(define make-combined-string
394 (lambda (name address)
395 (string-append "Name=" name ":Address=" address)))
396@end lisp
397
398@noindent
399--- and then to use the variable name in the procedure invocation:
400
401@lisp
402(make-combined-string "FSF" "Cambridge")
403@end lisp
404
405@noindent
406Which has exactly the same result.
407
408It's important to note that procedures created using @code{lambda} have
409exactly the same status as the standard built in Scheme procedures, and
410can be invoked, passed around, and stored in variables in exactly the
411same ways.
412
413
414@node Lambda Alternatives
415@subsection Lambda Alternatives
416
417Since it is so common in Scheme programs to want to create a procedure
418and then store it in a variable, there is an alternative form of the
419@code{define} syntax that allows you to do just that.
420
421A @code{define} expression of the form
422
423@lisp
424(define (@var{name} [@var{arg1} [@var{arg2} @dots{}]])
425 @var{expression} @dots{})
426@end lisp
427
428@noindent
429is exactly equivalent to the longer form
430
431@lisp
432(define @var{name}
433 (lambda ([@var{arg1} [@var{arg2} @dots{}]])
434 @var{expression} @dots{}))
435@end lisp
436
437So, for example, the definition of @code{make-combined-string} in the
438previous subsection could equally be written:
439
440@lisp
441(define (make-combined-string name address)
442 (string-append "Name=" name ":Address=" address))
443@end lisp
444
445This kind of procedure definition creates a procedure that requires
446exactly the expected number of arguments. There are two further forms
447of the @code{lambda} expression, which create a procedure that can
448accept a variable number of arguments:
449
450@lisp
451(lambda (@var{arg1} @dots{} . @var{args}) @var{expression} @dots{})
452
453(lambda @var{args} @var{expression} @dots{})
454@end lisp
455
456@noindent
457The corresponding forms of the alternative @code{define} syntax are:
458
459@lisp
460(define (@var{name} @var{arg1} @dots{} . @var{args}) @var{expression} @dots{})
461
462(define (@var{name} . @var{args}) @var{expression} @dots{})
463@end lisp
464
465@noindent
466For details on how these forms work, see @xref{Lambda}.
467
468(It could be argued that the alternative @code{define} forms are rather
469confusing, especially for newcomers to the Scheme language, as they hide
470both the role of @code{lambda} and the fact that procedures are values
471that are stored in variables in the some way as any other kind of value.
472On the other hand, they are very convenient, and they are also a good
473example of another of Scheme's powerful features: the ability to specify
474arbitrary syntactic transformations at run time, which can be applied to
475subsequently read input.)
476
477
478@node About Expressions
479@section Expressions and Evaluation
480
481So far, we have met expressions that @emph{do} things, such as the
482@code{define} expressions that create and initialize new variables, and
483we have also talked about expressions that have @emph{values}, for
484example the value of the procedure invocation expression:
485
486@lisp
487(string-append "/home" "/" "andrew")
488@end lisp
489
490@noindent
491but we haven't yet been precise about what causes an expression like
492this procedure invocation to be reduced to its ``value'', or how the
493processing of such expressions relates to the execution of a Scheme
494program as a whole.
495
496This section clarifies what we mean by an expression's value, by
497introducing the idea of @dfn{evaluation}. It discusses the side effects
498that evaluation can have, explains how each of the various types of
499Scheme expression is evaluated, and describes the behaviour and use of
500the Guile REPL as a mechanism for exploring evaluation. The section
501concludes with a very brief summary of Scheme's common syntactic
502expressions.
503
504@menu
505* Evaluating:: How a Scheme program is executed.
506* The REPL:: Interacting with the Guile interpreter.
507* Syntax Summary:: Common syntactic expressions -- in brief.
508@end menu
509
510
511@node Evaluating
512@subsection Evaluating Expressions and Executing Programs
513
514In Scheme, the process of executing an expression is known as
515@dfn{evaluation}. Evaluation has two kinds of result:
516
517@itemize @bullet
518@item
519the @dfn{value} of the evaluated expression
520
521@item
522the @dfn{side effects} of the evaluation, which consist of any effects of
523evaluating the expression that are not represented by the value.
524@end itemize
525
526Of the expressions that we have met so far, @code{define} and
527@code{set!} expressions have side effects --- the creation or
528modification of a variable --- but no value; @code{lambda} expressions
529have values --- the newly constructed procedures --- but no side
530effects; and procedure invocation expressions, in general, have either
531values, or side effects, or both.
532
533It is tempting to try to define more intuitively what we mean by
534``value'' and ``side effects'', and what the difference between them is.
535In general, though, this is extremely difficult. It is also
536unnecessary; instead, we can quite happily define the behaviour of a
537Scheme program by specifying how Scheme executes a program as a whole,
538and then by describing the value and side effects of evaluation for each
539type of expression individually.
540
541@noindent
542So, some@footnote{These definitions are approximate. For the whole and
543detailed truth, see @xref{Formal syntax and semantics,R5RS
544syntax,,r5rs}.} definitions@dots{}
545
546@itemize @bullet
547
548@item
549A Scheme program consists of a sequence of expressions.
550
551@item
552A Scheme interpreter executes the program by evaluating these
553expressions in order, one by one.
554
555@item
556An expression can be
557
558@itemize @bullet
559@item
560a piece of literal data, such as a number @code{2.3} or a string
561@code{"Hello world!"}
562@item
563a variable name
564@item
565a procedure invocation expression
566@item
567one of Scheme's special syntactic expressions.
568@end itemize
569@end itemize
570
571@noindent
572The following subsections describe how each of these types of expression
573is evaluated.
574
575@menu
576* Eval Literal:: Evaluating literal data.
577* Eval Variable:: Evaluating variable references.
578* Eval Procedure:: Evaluating procedure invocation expressions.
579* Eval Special:: Evaluating special syntactic expressions.
580@end menu
581
582@node Eval Literal
583@subsubsection Evaluating Literal Data
584
585When a literal data expression is evaluated, the value of the expression
586is simply the value that the expression describes. The evaluation of a
587literal data expression has no side effects.
588
589@noindent
590So, for example,
591
592@itemize @bullet
593@item
594the value of the expression @code{"abc"} is the string value
595@code{"abc"}
596
597@item
598the value of the expression @code{3+4i} is the complex number 3 + 4i
599
600@item
601the value of the expression @code{#(1 2 3)} is a three-element vector
602containing the numeric values 1, 2 and 3.
603@end itemize
604
605For any data type which can be expressed literally like this, the syntax
606of the literal data expression for that data type --- in other words,
607what you need to write in your code to indicate a literal value of that
608type --- is known as the data type's @dfn{read syntax}. This manual
609specifies the read syntax for each such data type in the section that
610describes that data type.
611
612Some data types do not have a read syntax. Procedures, for example,
613cannot be expressed as literal data; they must be created using a
614@code{lambda} expression (@pxref{Creating a Procedure}) or implicitly
615using the shorthand form of @code{define} (@pxref{Lambda Alternatives}).
616
617
618@node Eval Variable
619@subsubsection Evaluating a Variable Reference
620
621When an expression that consists simply of a variable name is evaluated,
622the value of the expression is the value of the named variable. The
623evaluation of a variable reference expression has no side effects.
624
625So, after
626
627@lisp
628(define key "Paul Evans")
629@end lisp
630
631@noindent
632the value of the expression @code{key} is the string value @code{"Paul
633Evans"}. If @var{key} is then modified by
634
635@lisp
636(set! key 3.74)
637@end lisp
638
639@noindent
640the value of the expression @code{key} is the numeric value 3.74.
641
642If there is no variable with the specified name, evaluation of the
643variable reference expression signals an error.
644
645
646@node Eval Procedure
647@subsubsection Evaluating a Procedure Invocation Expression
648
649This is where evaluation starts getting interesting! As already noted,
650a procedure invocation expression has the form
651
652@lisp
653(@var{procedure} [@var{arg1} [@var{arg2} @dots{}]])
654@end lisp
655
656@noindent
657where @var{procedure} must be an expression whose value, when evaluated,
658is a procedure.
659
660The evaluation of a procedure invocation expression like this proceeds
661by
662
663@itemize @bullet
664@item
665evaluating individually the expressions @var{procedure}, @var{arg1},
666@var{arg2}, and so on
667
668@item
669calling the procedure that is the value of the @var{procedure}
670expression with the list of values obtained from the evaluations of
671@var{arg1}, @var{arg2} etc. as its parameters.
672@end itemize
673
674For a procedure defined in Scheme, ``calling the procedure with the list
675of values as its parameters'' means binding the values to the
676procedure's formal parameters and then evaluating the sequence of
677expressions that make up the body of the procedure definition. The
678value of the procedure invocation expression is the value of the last
679evaluated expression in the procedure body. The side effects of calling
680the procedure are the combination of the side effects of the sequence of
681evaluations of expressions in the procedure body.
682
683For a built-in procedure, the value and side-effects of calling the
684procedure are best described by that procedure's documentation.
685
686Note that the complete side effects of evaluating a procedure invocation
687expression consist not only of the side effects of the procedure call,
688but also of any side effects of the preceding evaluation of the
689expressions @var{procedure}, @var{arg1}, @var{arg2}, and so on.
690
691To illustrate this, let's look again at the procedure invocation
692expression:
693
694@lisp
695(string-length (string-append "/home" "/" "andrew"))
696@end lisp
697
698In the outermost expression, @var{procedure} is @code{string-length} and
699@var{arg1} is @code{(string-append "/home" "/" "andrew")}.
700
701@itemize @bullet
702@item
703Evaluation of @code{string-length}, which is a variable, gives a
704procedure value that implements the expected behaviour for
705``string-length''.
706
707@item
708Evaluation of @code{(string-append "/home" "/" "andrew")}, which is
709another procedure invocation expression, means evaluating each of
710
711@itemize @bullet
712@item
713@code{string-append}, which gives a procedure value that implements the
714expected behaviour for ``string-append''
715
716@item
717@code{"/home"}, which gives the string value @code{"/home"}
718
719@item
720@code{"/"}, which gives the string value @code{"/"}
721
722@item
723@code{"andrew"}, which gives the string value @code{"andrew"}
724@end itemize
725
726and then invoking the procedure value with this list of string values as
727its arguments. The resulting value is a single string value that is the
728concatenation of all the arguments, namely @code{"/home/andrew"}.
729@end itemize
730
731In the evaluation of the outermost expression, the interpreter can now
732invoke the procedure value obtained from @var{procedure} with the value
733obtained from @var{arg1} as its arguments. The resulting value is a
734numeric value that is the length of the argument string, which is 12.
735
736
737@node Eval Special
738@subsubsection Evaluating Special Syntactic Expressions
739
740When a procedure invocation expression is evaluated, the procedure and
741@emph{all} the argument expressions must be evaluated before the
742procedure can be invoked. Special syntactic expressions are special
743because they are able to manipulate their arguments in an unevaluated
744form, and can choose whether to evaluate any or all of the argument
745expressions.
746
747Why is this needed? Consider a program fragment that asks the user
748whether or not to delete a file, and then deletes the file if the user
749answers yes.
750
751@lisp
752(if (string=? (read-answer "Should I delete this file?")
753 "yes")
754 (delete-file file))
755@end lisp
756
757If the outermost @code{(if @dots{})} expression here was a procedure
758invocation expression, the expression @code{(delete-file file)}, whose
a7a7bb95
NJ
759side effect is to actually delete a file, would already have been
760evaluated before the @code{if} procedure even got invoked! Clearly this
761is no use --- the whole point of an @code{if} expression is that the
a0e07ba4
NJ
762@dfn{consequent} expression is only evaluated if the condition of the
763@code{if} expression is ``true''.
764
765Therefore @code{if} must be special syntax, not a procedure. Other
766special syntaxes that we have already met are @code{define}, @code{set!}
767and @code{lambda}. @code{define} and @code{set!} are syntax because
768they need to know the variable @emph{name} that is given as the first
769argument in a @code{define} or @code{set!} expression, not that
770variable's value. @code{lambda} is syntax because it does not
771immediately evaluate the expressions that define the procedure body;
772instead it creates a procedure object that incorporates these
773expressions so that they can be evaluated in the future, when that
774procedure is invoked.
775
776The rules for evaluating each special syntactic expression are specified
777individually for each special syntax. For a summary of standard special
778syntax, see @xref{Syntax Summary}.
779
780
781@node The REPL
782@subsection Using the Guile REPL
783
784If you start Guile without specifying a particular program for it to
785execute, Guile enters its standard Read Evaluate Print Loop --- or
786@dfn{REPL} for short. In this mode, Guile repeatedly reads in the next
787Scheme expression that the user types, evaluates it, and prints the
788resulting value.
789
790The REPL is a useful mechanism for exploring the evaluation behaviour
791described in the previous subsection. If you type @code{string-append},
792for example, the REPL replies @code{#<primitive-procedure
793string-append>}, illustrating the relationship between the variable
794@code{string-append} and the procedure value stored in that variable.
795
796In this manual, the notation @result{} is used to mean ``evaluates
797to''. Wherever you see an example of the form
798
799@lisp
800@var{expression}
801@result{}
802@var{result}
803@end lisp
804
805@noindent
806feel free to try it out yourself by typing @var{expression} into the
807REPL and checking that it gives the expected @var{result}.
808
809
810@node Syntax Summary
811@subsection Summary of Common Syntax
812
813This subsection lists the most commonly used Scheme syntactic
814expressions, simply so that you will recognize common special syntax
815when you see it. For a full description of each of these syntaxes,
816follow the appropriate reference.
817
a7a7bb95 818@code{lambda} (@pxref{Lambda}) is used to construct procedure objects.
a0e07ba4 819
a7a7bb95
NJ
820@code{define} (@pxref{Top Level}) is used to create a new variable and
821set its initial value.
a0e07ba4 822
a7a7bb95
NJ
823@code{set!} (@pxref{Top Level}) is used to modify an existing variable's
824value.
a0e07ba4
NJ
825
826@code{let}, @code{let*} and @code{letrec} (@pxref{Local Bindings})
827create an inner lexical environment for the evaluation of a sequence of
828expressions, in which a specified set of local variables is bound to the
829values of a corresponding set of expressions. For an introduction to
830environments, see @xref{About Closure}.
831
832@code{begin} (@pxref{begin}) executes a sequence of expressions in order
833and returns the value of the last expression. Note that this is not the
834same as a procedure which returns its last argument, because the
835evaluation of a procedure invocation expression does not guarantee to
836evaluate the arguments in order.
837
a7a7bb95
NJ
838@code{if} and @code{cond} (@pxref{if cond case}) provide conditional
839evaluation of argument expressions depending on whether one or more
840conditions evaluate to ``true'' or ``false''.
841
842@code{case} (@pxref{if cond case}) provides conditional evaluation of
843argument expressions depending on whether a variable has one of a
844specified group of values.
845
a0e07ba4
NJ
846@code{and} (@pxref{and or}) executes a sequence of expressions in order
847until either there are no expressions left, or one of them evaluates to
848``false''.
849
850@code{or} (@pxref{and or}) executes a sequence of expressions in order
851until either there are no expressions left, or one of them evaluates to
852``true''.
853
854
855@node About Closure
856@section The Concept of Closure
857
858@cindex closure
859
860The concept of @dfn{closure} is the idea that a lambda expression
861``captures'' the variable bindings that are in lexical scope at the
862point where the lambda expression occurs. The procedure created by the
863lambda expression can refer to and mutate the captured bindings, and the
864values of those bindings persist between procedure calls.
865
866This section explains and explores the various parts of this idea in
867more detail.
868
869@menu
870* About Environments:: Names, locations, values and environments.
871* Local Variables:: Local variables and local environments.
872* Chaining:: Environment chaining.
873* Lexical Scope:: The meaning of lexical scoping.
874* Closure:: Explaining the concept of closure.
875* Serial Number:: Example 1: a serial number generator.
876* Shared Variable:: Example 2: a shared persistent variable.
877* Callback Closure:: Example 3: the callback closure problem.
878* OO Closure:: Example 4: object orientation.
879@end menu
880
881@node About Environments
882@subsection Names, Locations, Values and Environments
883
884@cindex location
885@cindex environment
886@cindex vcell
887@cindex top level environment
888@cindex environment, top level
889
890We said earlier that a variable name in a Scheme program is associated
891with a location in which any kind of Scheme value may be stored.
892(Incidentally, the term ``vcell'' is often used in Lisp and Scheme
893circles as an alternative to ``location''.) Thus part of what we mean
894when we talk about ``creating a variable'' is in fact establishing an
895association between a name, or identifier, that is used by the Scheme
896program code, and the variable location to which that name refers.
897Although the value that is stored in that location may change, the
898location to which a given name refers is always the same.
899
900We can illustrate this by breaking down the operation of the
901@code{define} syntax into three parts: @code{define}
902
903@itemize @bullet
904@item
905creates a new location
906
907@item
908establishes an association between that location and the name specified
909as the first argument of the @code{define} expression
910
911@item
912stores in that location the value obtained by evaluating the second
913argument of the @code{define} expression.
914@end itemize
915
916A collection of associations between names and locations is called an
917@dfn{environment}. When you create a top level variable in a program
918using @code{define}, the name-location association for that variable is
919added to the ``top level'' environment. The ``top level'' environment
920also includes name-location associations for all the procedures that are
921supplied by standard Scheme.
922
923It is also possible to create environments other than the top level one,
924and to create variable bindings, or name-location associations, in those
925environments. This ability is a key ingredient in the concept of
926closure; the next subsection shows how it is done.
927
928
929@node Local Variables
930@subsection Local Variables and Environments
931
932@cindex local variable
933@cindex variable, local
934@cindex local environment
935@cindex environment, local
936
937We have seen how to create top level variables using the @code{define}
938syntax (@pxref{Definition}). It is often useful to create variables
939that are more limited in their scope, typically as part of a procedure
940body. In Scheme, this is done using the @code{let} syntax, or one of
941its modified forms @code{let*} and @code{letrec}. These syntaxes are
942described in full later in the manual (@pxref{Local Bindings}). Here
943our purpose is to illustrate their use just enough that we can see how
944local variables work.
945
946For example, the following code uses a local variable @code{s} to
947simplify the computation of the area of a triangle given the lengths of
948its three sides.
949
950@lisp
951(define a 5.3)
952(define b 4.7)
953(define c 2.8)
954
955(define area
956 (let ((s (/ (+ a b c) 2)))
957 (sqrt (* s (- s a) (- s b) (- s c)))))
958@end lisp
959
960The effect of the @code{let} expression is to create a new environment
961and, within this environment, an association between the name @code{s}
962and a new location whose initial value is obtained by evaluating
963@code{(/ (+ a b c) 2)}. The expressions in the body of the @code{let},
964namely @code{(sqrt (* s (- s a) (- s b) (- s c)))}, are then evaluated
965in the context of the new environment, and the value of the last
966expression evaluated becomes the value of the whole @code{let}
967expression, and therefore the value of the variable @code{area}.
968
969
970@node Chaining
971@subsection Environment Chaining
972
973@cindex shadowing an imported variable binding
974@cindex chaining environments
975
976In the example of the previous subsection, we glossed over an important
977point. The body of the @code{let} expression in that example refers not
978only to the local variable @code{s}, but also to the top level variables
979@code{a}, @code{b}, @code{c} and @code{sqrt}. (@code{sqrt} is the
980standard Scheme procedure for calculating a square root.) If the body
981of the @code{let} expression is evaluated in the context of the
982@emph{local} @code{let} environment, how does the evaluation get at the
983values of these top level variables?
984
985The answer is that the local environment created by a @code{let}
986expression automatically has a reference to its containing environment
987--- in this case the top level environment --- and that the Scheme
988interpreter automatically looks for a variable binding in the containing
989environment if it doesn't find one in the local environment. More
990generally, every environment except for the top level one has a
991reference to its containing environment, and the interpreter keeps
992searching back up the chain of environments --- from most local to top
993level --- until it either finds a variable binding for the required
994identifier or exhausts the chain.
995
996This description also determines what happens when there is more than
997one variable binding with the same name. Suppose, continuing the
998example of the previous subsection, that there was also a pre-existing
999top level variable @code{s} created by the expression:
1000
1001@lisp
1002(define s "Some beans, my lord!")
1003@end lisp
1004
1005Then both the top level environment and the local @code{let} environment
1006would contain bindings for the name @code{s}. When evaluating code
1007within the @code{let} body, the interpreter looks first in the local
1008@code{let} environment, and so finds the binding for @code{s} created by
1009the @code{let} syntax. Even though this environment has a reference to
1010the top level environment, which also has a binding for @code{s}, the
1011interpreter doesn't get as far as looking there. When evaluating code
1012outside the @code{let} body, the interpreter looks up variable names in
1013the top level environment, so the name @code{s} refers to the top level
1014variable.
1015
1016Within the @code{let} body, the binding for @code{s} in the local
1017environment is said to @dfn{shadow} the binding for @code{s} in the top
1018level environment.
1019
1020
1021@node Lexical Scope
1022@subsection Lexical Scope
1023
1024The rules that we have just been describing are the details of how
1025Scheme implements ``lexical scoping''. This subsection takes a brief
1026diversion to explain what lexical scope means in general and to present
1027an example of non-lexical scoping.
1028
1029``Lexical scope'' in general is the idea that
1030
1031@itemize @bullet
1032@item
1033an identifier at a particular place in a program always refers to the
1034same variable location --- where ``always'' means ``every time that the
1035containing expression is executed'', and that
1036
1037@item
1038the variable location to which it refers can be determined by static
1039examination of the source code context in which that identifier appears,
1040without having to consider the flow of execution through the program as
1041a whole.
1042@end itemize
1043
1044In practice, lexical scoping is the norm for most programming languages,
1045and probably corresponds to what you would intuitively consider to be
1046``normal''. You may even be wondering how the situation could possibly
1047--- and usefully --- be otherwise. To demonstrate that another kind of
1048scoping is possible, therefore, and to compare it against lexical
1049scoping, the following subsection presents an example of non-lexical
1050scoping and examines in detail how its behavior differs from the
1051corresponding lexically scoped code.
1052
1053@menu
1054* Scoping Example:: An example of non-lexical scoping.
1055@end menu
1056
1057
1058@node Scoping Example
1059@subsubsection An Example of Non-Lexical Scoping
1060
1061To demonstrate that non-lexical scoping does exist and can be useful, we
1062present the following example from Emacs Lisp, which is a ``dynamically
1063scoped'' language.
1064
1065@lisp
1066(defvar currency-abbreviation "USD")
1067
1068(defun currency-string (units hundredths)
1069 (concat currency-abbreviation
1070 (number-to-string units)
1071 "."
1072 (number-to-string hundredths)))
1073
1074(defun french-currency-string (units hundredths)
1075 (let ((currency-abbreviation "FRF"))
1076 (currency-string units hundredths)))
1077@end lisp
1078
1079The question to focus on here is: what does the identifier
1080@code{currency-abbreviation} refer to in the @code{currency-string}
1081function? The answer, in Emacs Lisp, is that all variable bindings go
1082onto a single stack, and that @code{currency-abbreviation} refers to the
1083topmost binding from that stack which has the name
1084``currency-abbreviation''. The binding that is created by the
1085@code{defvar} form, to the value @code{"USD"}, is only relevant if none
1086of the code that calls @code{currency-string} rebinds the name
1087``currency-abbreviation'' in the meanwhile.
1088
1089The second function @code{french-currency-string} works precisely by
1090taking advantage of this behaviour. It creates a new binding for the
1091name ``currency-abbreviation'' which overrides the one established by
1092the @code{defvar} form.
1093
1094@lisp
1095;; Note! This is Emacs Lisp evaluation, not Scheme!
1096(french-currency-string 33 44)
1097@result{}
1098"FRF33.44"
1099@end lisp
1100
1101Now let's look at the corresponding, @emph{lexically scoped} Scheme
1102code:
1103
1104@lisp
1105(define currency-abbreviation "USD")
1106
1107(define (currency-string units hundredths)
1108 (string-append currency-abbreviation
1109 (number->string units)
1110 "."
1111 (number->string hundredths)))
1112
1113(define (french-currency-string units hundredths)
1114 (let ((currency-abbreviation "FRF"))
1115 (currency-string units hundredths)))
1116@end lisp
1117
1118According to the rules of lexical scoping, the
1119@code{currency-abbreviation} in @code{currency-string} refers to the
1120variable location in the innermost environment at that point in the code
1121which has a binding for @code{currency-abbreviation}, which is the
1122variable location in the top level environment created by the preceding
1123@code{(define currency-abbreviation @dots{})} expression.
1124
1125In Scheme, therefore, the @code{french-currency-string} procedure does
1126not work as intended. The variable binding that it creates for
1127``currency-abbreviation'' is purely local to the code that forms the
1128body of the @code{let} expression. Since this code doesn't directly use
1129the name ``currency-abbreviation'' at all, the binding is pointless.
1130
1131@lisp
1132(french-currency-string 33 44)
1133@result{}
1134"USD33.44"
1135@end lisp
1136
1137This begs the question of how the Emacs Lisp behaviour can be
1138implemented in Scheme. In general, this is a design question whose
1139answer depends upon the problem that is being addressed. In this case,
1140the best answer may be that @code{currency-string} should be
1141redesigned so that it can take an optional third argument. This third
1142argument, if supplied, is interpreted as a currency abbreviation that
1143overrides the default.
1144
1145It is possible to change @code{french-currency-string} so that it mostly
1146works without changing @code{currency-string}, but the fix is inelegant,
1147and susceptible to interrupts that could leave the
1148@code{currency-abbreviation} variable in the wrong state:
1149
1150@lisp
1151(define (french-currency-string units hundredths)
1152 (set! currency-abbreviation "FRF")
1153 (let ((result (currency-string units hundredths)))
1154 (set! currency-abbreviation "USD")
1155 result))
1156@end lisp
1157
1158The key point here is that the code does not create any local binding
85a9b4ed 1159for the identifier @code{currency-abbreviation}, so all occurrences of
a0e07ba4
NJ
1160this identifier refer to the top level variable.
1161
1162
1163@node Closure
1164@subsection Closure
1165
1166Consider a @code{let} expression that doesn't contain any
1167@code{lambda}s:
1168
1169@lisp
1170(let ((s (/ (+ a b c) 2)))
1171 (sqrt (* s (- s a) (- s b) (- s c))))
1172@end lisp
1173
1174@noindent
1175When the Scheme interpreter evaluates this, it
1176
1177@itemize @bullet
1178@item
1179creates a new environment with a reference to the environment that was
1180current when it encountered the @code{let}
1181
1182@item
1183creates a variable binding for @code{s} in the new environment, with
1184value given by @code{(/ (+ a b c) 2)}
1185
1186@item
1187evaluates the expression in the body of the @code{let} in the context of
1188the new local environment, and remembers the value @code{V}
1189
1190@item
1191forgets the local environment
1192
1193@item
1194continues evaluating the expression that contained the @code{let}, using
1195the value @code{V} as the value of the @code{let} expression, in the
1196context of the containing environment.
1197@end itemize
1198
1199After the @code{let} expression has been evaluated, the local
1200environment that was created is simply forgotten, and there is no longer
1201any way to access the binding that was created in this environment. If
1202the same code is evaluated again, it will follow the same steps again,
1203creating a second new local environment that has no connection with the
1204first, and then forgetting this one as well.
1205
1206If the @code{let} body contains a @code{lambda} expression, however, the
1207local environment is @emph{not} forgotten. Instead, it becomes
1208associated with the procedure that is created by the @code{lambda}
1209expression, and is reinstated every time that that procedure is called.
1210In detail, this works as follows.
1211
1212@itemize @bullet
1213@item
1214When the Scheme interpreter evaluates a @code{lambda} expression, to
1215create a procedure object, it stores the current environment as part of
1216the procedure definition.
1217
1218@item
1219Then, whenever that procedure is called, the interpreter reinstates the
1220environment that is stored in the procedure definition and evaluates the
1221procedure body within the context of that environment.
1222@end itemize
1223
1224The result is that the procedure body is always evaluated in the context
1225of the environment that was current when the procedure was created.
1226
1227This is what is meant by @dfn{closure}. The next few subsections
1228present examples that explore the usefulness of this concept.
1229
1230
1231@node Serial Number
1232@subsection Example 1: A Serial Number Generator
1233
1234This example uses closure to create a procedure with a variable binding
1235that is private to the procedure, like a local variable, but whose value
1236persists between procedure calls.
1237
1238@lisp
1239(define (make-serial-number-generator)
1240 (let ((current-serial-number 0))
1241 (lambda ()
1242 (set! current-serial-number (+ current-serial-number 1))
1243 current-serial-number)))
1244
1245(define entry-sn-generator (make-serial-number-generator))
1246
1247(entry-sn-generator)
1248@result{}
12491
1250
1251(entry-sn-generator)
1252@result{}
12532
1254@end lisp
1255
1256When @code{make-serial-number-generator} is called, it creates a local
1257environment with a binding for @code{current-serial-number} whose
1258initial value is 0, then, within this environment, creates a procedure.
1259The local environment is stored within the created procedure object and
1260so persists for the lifetime of the created procedure.
1261
1262Every time the created procedure is invoked, it increments the value of
1263the @code{current-serial-number} binding in the captured environment and
1264then returns the current value.
1265
1266Note that @code{make-serial-number-generator} can be called again to
1267create a second serial number generator that is independent of the
1268first. Every new invocation of @code{make-serial-number-generator}
1269creates a new local @code{let} environment and returns a new procedure
1270object with an association to this environment.
1271
1272
1273@node Shared Variable
1274@subsection Example 2: A Shared Persistent Variable
1275
1276This example uses closure to create two procedures, @code{get-balance}
1277and @code{deposit}, that both refer to the same captured local
1278environment so that they can both access the @code{balance} variable
1279binding inside that environment. The value of this variable binding
1280persists between calls to either procedure.
1281
1282Note that the captured @code{balance} variable binding is private to
1283these two procedures: it is not directly accessible to any other code.
1284It can only be accessed indirectly via @code{get-balance} or
1285@code{deposit}, as illustrated by the @code{withdraw} procedure.
1286
1287@lisp
1288(define get-balance #f)
1289(define deposit #f)
1290
1291(let ((balance 0))
1292 (set! get-balance
1293 (lambda ()
1294 balance))
1295 (set! deposit
1296 (lambda (amount)
1297 (set! balance (+ balance amount))
1298 balance)))
1299
1300(define (withdraw amount)
1301 (deposit (- amount)))
1302
1303(get-balance)
1304@result{}
13050
1306
1307(deposit 50)
1308@result{}
130950
1310
1311(withdraw 75)
1312@result{}
1313-25
1314@end lisp
1315
a7a7bb95
NJ
1316An important detail here is that the @code{get-balance} and
1317@code{deposit} variables must be set up by @code{define}ing them at top
1318level and then @code{set!}ing their values inside the @code{let} body.
1319Using @code{define} within the @code{let} body would not work: this
1320would create variable bindings within the local @code{let} environment
1321that would not be accessible at top level.
a0e07ba4
NJ
1322
1323
1324@node Callback Closure
1325@subsection Example 3: The Callback Closure Problem
1326
1327A frequently used programming model for library code is to allow an
1328application to register a callback function for the library to call when
1329some particular event occurs. It is often useful for the application to
1330make several such registrations using the same callback function, for
1331example if several similar library events can be handled using the same
1332application code, but the need then arises to distinguish the callback
1333function calls that are associated with one callback registration from
1334those that are associated with different callback registrations.
1335
1336In languages without the ability to create functions dynamically, this
1337problem is usually solved by passing a @code{user_data} parameter on the
1338registration call, and including the value of this parameter as one of
1339the parameters on the callback function. Here is an example of
1340declarations using this solution in C:
1341
1342@example
1343typedef void (event_handler_t) (int event_type,
1344 void *user_data);
1345
1346void register_callback (int event_type,
1347 event_handler_t *handler,
1348 void *user_data);
1349@end example
1350
1351In Scheme, closure can be used to achieve the same functionality without
1352requiring the library code to store a @code{user-data} for each callback
1353registration.
1354
1355@lisp
1356;; In the library:
1357
1358(define (register-callback event-type handler-proc)
1359 @dots{})
1360
1361;; In the application:
1362
1363(define (make-handler event-type user-data)
1364 (lambda ()
1365 @dots{}
1366 <code referencing event-type and user-data>
1367 @dots{}))
1368
1369(register-callback event-type
1370 (make-handler event-type @dots{}))
1371@end lisp
1372
1373As far as the library is concerned, @code{handler-proc} is a procedure
1374with no arguments, and all the library has to do is call it when the
1375appropriate event occurs. From the application's point of view, though,
1376the handler procedure has used closure to capture an environment that
1377includes all the context that the handler code needs ---
1378@code{event-type} and @code{user-data} --- to handle the event
1379correctly.
1380
1381
1382@node OO Closure
1383@subsection Example 4: Object Orientation
1384
1385Closure is the capture of an environment, containing persistent variable
1386bindings, within the definition of a procedure or a set of related
1387procedures. This is rather similar to the idea in some object oriented
1388languages of encapsulating a set of related data variables inside an
1389``object'', together with a set of ``methods'' that operate on the
1390encapsulated data. The following example shows how closure can be used
1391to emulate the ideas of objects, methods and encapsulation in Scheme.
1392
1393@lisp
1394(define (make-account)
1395 (let ((balance 0))
1396 (define (get-balance)
1397 balance)
1398 (define (deposit amount)
1399 (set! balance (+ balance amount))
1400 balance)
1401 (define (withdraw amount)
1402 (deposit (- amount)))
1403
1404 (lambda args
1405 (apply
1406 (case (car args)
1407 ((get-balance) get-balance)
1408 ((deposit) deposit)
1409 ((withdraw) withdraw)
1410 (else (error "Invalid method!")))
1411 (cdr args)))))
1412@end lisp
1413
1414Each call to @code{make-account} creates and returns a new procedure,
1415created by the expression in the example code that begins ``(lambda
1416args''.
1417
1418@lisp
1419(define my-account (make-account))
1420
1421my-account
1422@result{}
1423#<procedure args>
1424@end lisp
1425
1426This procedure acts as an account object with methods
1427@code{get-balance}, @code{deposit} and @code{withdraw}. To apply one of
1428the methods to the account, you call the procedure with a symbol
1429indicating the required method as the first parameter, followed by any
1430other parameters that are required by that method.
1431
1432@lisp
1433(my-account 'get-balance)
1434@result{}
14350
1436
1437(my-account 'withdraw 5)
1438@result{}
1439-5
1440
1441(my-account 'deposit 396)
1442@result{}
1443391
1444
1445(my-account 'get-balance)
1446@result{}
1447391
1448@end lisp
1449
1450Note how, in this example, both the current balance and the helper
1451procedures @code{get-balance}, @code{deposit} and @code{withdraw}, used
1452to implement the guts of the account object's methods, are all stored in
1453variable bindings within the private local environment captured by the
1454@code{lambda} expression that creates the account object procedure.
1455
1456
1457@c Local Variables:
1458@c TeX-master: "guile.texi"
1459@c End: