>
endobj
668 0 obj<>
endobj
669 0 obj<>]/P 9 0 R/S/Article/T()/Pg 670 0 R>>
endobj
670 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
671 0 obj[669 0 R]
endobj
672 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
673 0 obj[672 0 R 674 0 R 675 0 R 676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R]
endobj
674 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
675 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
676 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
677 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
678 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
679 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
680 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
681 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
682 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
683 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
684 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
685 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
686 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
687 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
688 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
689 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
690 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
691 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
692 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
693 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
694 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
695 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
696 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
697 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
698 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
699 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
700 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
701 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
702 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
703 0 obj[669 0 R]
endobj
704 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
705 0 obj[704 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R]
endobj
706 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
707 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
708 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
709 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
710 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
711 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
712 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Hobbyist Track)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Hobbyist Track Suggested Chapter List)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Learn how to find your way:)Tj
/T1_2 1 Tf
7 0 0 7 35.713 643.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
50 641.874 m
342.796 641.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 643.9909 Tm
(Chapter 10 - How to Find Your Way Around, Part 1)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 625.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 623.074 m
342.796 623.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 625.1909 Tm
(Chapter 16 - How to Find Your Way Around, Part 2)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 606.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 604.274 m
342.796 604.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 606.3909 Tm
(Chapter 22 - How to Find Your Way Around, Part 3)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 587.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 585.474 m
340.836 585.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 587.5909 Tm
(Chapter 28 - Practical Techniques for Programming)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 568.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 566.674 m
420.538 566.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 568.7909 Tm
(Chapter 29 - I Thought it was Your Turn to Take Out the Garbage)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 549.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 547.874 m
389.85 547.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 549.9909 Tm
(Chapter 30 - Helpful Hints for Debugging and Bug-Proofing)Tj
0 0 0 rg
( )Tj
/T1_1 1 Tf
19.3846 0 0 19.3846 10 507.2303 Tm
(Read as interested:)Tj
/T1_2 1 Tf
7 0 0 7 35.713 469.9294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 467.813 m
303.918 467.813 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 469.9294 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 451.1294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 449.013 m
253.364 449.013 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 451.1294 Tm
(Chapter 4 - Mastering the Essentials)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 432.3294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 430.213 m
232.742 430.213 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 432.3294 Tm
(Chapter 5 - Introducing Iteration)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 413.5294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 411.413 m
242.458 411.413 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 413.5294 Tm
(Chapter 6 - Deeper into Structures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 394.7294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 392.613 m
361.85 392.613 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 394.7294 Tm
(Chapter 7 - A First Look at Objects as Fancy Structures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 375.9294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 373.813 m
244.824 373.813 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 375.9294 Tm
(Chapter 8 - Lifetime and Visibility)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 357.1294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 355.013 m
390.606 355.013 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 357.1294 Tm
(Chapter 9 - Introducing Error Handling and Non-Local Exits)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 338.3294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 336.213 m
264.634 336.213 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 338.3294 Tm
(Chapter 11 - Destructive Modification)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 319.5294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 317.413 m
284.066 317.413 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 319.5294 Tm
(Chapter 12 - Mapping Instead of Iteration)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 300.7294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 298.613 m
388.31 298.613 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 300.7294 Tm
(Chapter 13 - Still More Things You Can Do with Sequences)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 281.9294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 279.813 m
354.444 279.813 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 281.9294 Tm
(Chapter 14 - Can Objects Really Behave Themselves?)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 263.1294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 261.013 m
172.486 261.013 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 263.1294 Tm
(Chapter 15 - Closures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 244.3294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 242.213 m
300.026 242.213 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 244.3294 Tm
(Chapter 17 - Not All Comparisons are Equal)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 225.5294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 223.413 m
250.62 223.413 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 225.5294 Tm
(Chapter 18 - Very Logical, Indeed\212)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 206.7294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 204.613 m
168.594 204.613 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 206.7294 Tm
(Chapter 19 - Streams)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 187.9294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 185.813 m
214.08 185.813 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 187.9294 Tm
(Chapter 20 - Macro Etiquette)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 169.1294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 167.013 m
408.12 167.013 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 169.1294 Tm
(Chapter 21 - Fancy Tricks with Function and Macro Arguments)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 150.3294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 148.213 m
347.052 148.213 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 150.3294 Tm
(Chapter 23 - To Err is Expected; To Recover, Divine)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 131.5294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 129.413 m
348.214 129.413 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 131.5294 Tm
(Chapter 24 - FORMAT Speaks a Different Language)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 112.7294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 110.613 m
319.864 110.613 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 112.7294 Tm
(Chapter 25 - Connecting Lisp to the Real World)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 93.9294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 91.813 m
348.214 91.813 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 93.9294 Tm
(Chapter 26 - Put on a Happy Face: Interface Builders)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 75.1294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 73.013 m
393.728 73.013 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 75.1294 Tm
(Chapter 27 - A Good Editor is Worth a Thousand Keystrokes)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 56.3294 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 54.213 m
303.134 54.213 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 56.3294 Tm
(Chapter 31 - Handling Large Projects in Lisp)Tj
0 0 0 rg
( )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/track3.html \(1 of 2\)11/3/2006 5:49:37 PM)Tj
ET
EMC
endstream
endobj
713 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Hobbyist Track)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
7 0 0 7 35.713 753.9756 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
50 751.859 m
287.188 751.859 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 753.9756 Tm
(Chapter 32 - Dark Corners and Curiosities)Tj
0 0 0 rg
( )Tj
/T1_1 1 Tf
7 0 0 7 35.713 735.1756 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 733.059 m
226.512 733.059 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 735.1756 Tm
(Chapter 33 - Where to Go Next)Tj
0 0 0 rg
( )Tj
/T1_1 1 Tf
7 0 0 7 35.713 716.3755 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 714.259 m
387.148 714.259 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 716.3755 Tm
(Chapter 34 - Lisp History, or: Origins of Misunderstandings)Tj
0 0 0 rg
( )Tj
/T1_1 1 Tf
7 0 0 7 35.713 697.5756 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 695.459 m
293.81 695.459 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 697.5756 Tm
(Appendix A - Successful Lisp Applications)Tj
0 0 0 rg
( )Tj
ET
0.5 0.5 0.5 rg
10 662.8 m
10 664.8 l
602 664.8 l
601 663.8 l
11 663.8 l
11 663.8 l
h
f
0.875 0.875 0.875 rg
602 664.8 m
602 662.8 l
10 662.8 l
11 663.8 l
601 663.8 l
601 663.8 l
h
f
259.1 641.659 m
308.884 641.659 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 643.7756 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 641.659 m
352.9 641.659 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 643.7756 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
278.588 622.859 m
333.412 622.859 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 278.588 624.9756 Tm
(Chapter 2)Tj
0 0 0 rg
( )Tj
ET
0.5 0.5 0.5 rg
10 609.2 m
10 611.2 l
602 611.2 l
601 610.2 l
11 610.2 l
11 610.2 l
h
f
0.875 0.875 0.875 rg
602 611.2 m
602 609.2 l
10 609.2 l
11 610.2 l
601 610.2 l
601 610.2 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 590.1756 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
0 -1.2 TD
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/track3.html \(2 of 2\)11/3/2006 5:49:37 PM)Tj
ET
EMC
endstream
endobj
714 0 obj(Successful Lisp - Hobbyist Track)
endobj
715 0 obj<>
endobj
716 0 obj(http://psg.com/~dlamkins/sl/track3.html)
endobj
717 0 obj([E5T)
endobj
718 0 obj<>
endobj
719 0 obj<>
endobj
720 0 obj(d:LB)
endobj
721 0 obj<>
endobj
722 0 obj<>
endobj
723 0 obj<>]/P 9 0 R/S/Article/T()/Pg 724 0 R>>
endobj
724 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
725 0 obj[723 0 R]
endobj
726 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
727 0 obj[726 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R]
endobj
728 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
729 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
730 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
731 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
732 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
733 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
734 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
735 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
736 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
737 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
738 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
739 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
740 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
741 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
742 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
743 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
744 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
745 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
746 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
747 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
748 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
749 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
750 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
751 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
752 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
753 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
754 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
755 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
756 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
757 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
758 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
759 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
760 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
761 0 obj[723 0 R]
endobj
762 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
763 0 obj[762 0 R 764 0 R 765 0 R 766 0 R]
endobj
764 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
765 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
766 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
767 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Former User Track)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Former User Track Suggested Chapter List)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Read as needed:)Tj
/T1_2 1 Tf
7 0 0 7 35.713 643.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
50 641.874 m
303.918 641.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 643.9909 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 625.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 623.074 m
253.364 623.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 625.1909 Tm
(Chapter 4 - Mastering the Essentials)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 606.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 604.274 m
232.742 604.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 606.3909 Tm
(Chapter 5 - Introducing Iteration)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 587.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 585.474 m
242.458 585.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 587.5909 Tm
(Chapter 6 - Deeper into Structures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 568.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 566.674 m
361.85 566.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 568.7909 Tm
(Chapter 7 - A First Look at Objects as Fancy Structures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 549.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 547.874 m
244.824 547.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 549.9909 Tm
(Chapter 8 - Lifetime and Visibility)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 531.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 529.074 m
390.606 529.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 531.1909 Tm
(Chapter 9 - Introducing Error Handling and Non-Local Exits)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 512.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 510.274 m
342.796 510.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 512.3909 Tm
(Chapter 10 - How to Find Your Way Around, Part 1)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 493.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 491.474 m
264.634 491.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 493.5909 Tm
(Chapter 11 - Destructive Modification)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 474.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 472.674 m
284.066 472.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 474.7909 Tm
(Chapter 12 - Mapping Instead of Iteration)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 455.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 453.874 m
388.31 453.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 455.9909 Tm
(Chapter 13 - Still More Things You Can Do with Sequences)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 437.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 435.074 m
354.444 435.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 437.1909 Tm
(Chapter 14 - Can Objects Really Behave Themselves?)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 418.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 416.274 m
172.486 416.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 418.3909 Tm
(Chapter 15 - Closures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 399.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 397.474 m
342.796 397.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 399.5909 Tm
(Chapter 16 - How to Find Your Way Around, Part 2)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 380.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 378.674 m
300.026 378.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 380.7909 Tm
(Chapter 17 - Not All Comparisons are Equal)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 361.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 359.874 m
250.62 359.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 361.9909 Tm
(Chapter 18 - Very Logical, Indeed\212)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 343.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 341.074 m
168.594 341.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 343.1909 Tm
(Chapter 19 - Streams)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 324.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 322.274 m
214.08 322.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 324.3909 Tm
(Chapter 20 - Macro Etiquette)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 305.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 303.474 m
408.12 303.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 305.5909 Tm
(Chapter 21 - Fancy Tricks with Function and Macro Arguments)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 286.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 284.674 m
342.796 284.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 286.7909 Tm
(Chapter 22 - How to Find Your Way Around, Part 3)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 267.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 265.874 m
347.052 265.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 267.9909 Tm
(Chapter 23 - To Err is Expected; To Recover, Divine)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 249.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 247.074 m
348.214 247.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 249.1909 Tm
(Chapter 24 - FORMAT Speaks a Different Language)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 230.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 228.274 m
319.864 228.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 230.3909 Tm
(Chapter 25 - Connecting Lisp to the Real World)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 211.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 209.474 m
348.214 209.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 211.5909 Tm
(Chapter 26 - Put on a Happy Face: Interface Builders)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 192.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 190.674 m
393.728 190.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 192.7909 Tm
(Chapter 27 - A Good Editor is Worth a Thousand Keystrokes)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 173.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 171.874 m
340.836 171.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 173.9909 Tm
(Chapter 28 - Practical Techniques for Programming)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 155.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 153.074 m
420.538 153.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 155.1909 Tm
(Chapter 29 - I Thought it was Your Turn to Take Out the Garbage)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 136.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 134.274 m
389.85 134.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 136.3909 Tm
(Chapter 30 - Helpful Hints for Debugging and Bug-Proofing)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 117.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 115.474 m
303.134 115.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 117.5909 Tm
(Chapter 31 - Handling Large Projects in Lisp)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 98.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 96.674 m
287.188 96.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 98.7909 Tm
(Chapter 32 - Dark Corners and Curiosities)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 79.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 77.874 m
226.512 77.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 79.9909 Tm
(Chapter 33 - Where to Go Next)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 61.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 59.074 m
387.148 59.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 61.1909 Tm
(Chapter 34 - Lisp History, or: Origins of Misunderstandings)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 42.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 40.274 m
293.81 40.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 42.3909 Tm
(Appendix A - Successful Lisp Applications)Tj
0 0 0 rg
( )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/track4.html \(1 of 2\)11/3/2006 5:49:45 PM)Tj
ET
EMC
endstream
endobj
768 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Former User Track)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 734.5909 Tm
(Also see detailed )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
109.148 732.474 m
209.472 732.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 109.148 734.5909 Tm
(Table of Contents)Tj
0 0 0 rg
(.)Tj
ET
0.5 0.5 0.5 rg
10 699.815 m
10 701.815 l
602 701.815 l
601 700.815 l
11 700.815 l
11 700.815 l
h
f
0.875 0.875 0.875 rg
602 701.815 m
602 699.815 l
10 699.815 l
11 700.815 l
601 700.815 l
601 700.815 l
h
f
259.1 678.674 m
308.884 678.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 680.7909 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 678.674 m
352.9 678.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 680.7909 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
278.588 659.874 m
333.412 659.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 278.588 661.9909 Tm
(Chapter 2)Tj
0 0 0 rg
( )Tj
ET
0.5 0.5 0.5 rg
10 646.215 m
10 648.215 l
602 648.215 l
601 647.215 l
11 647.215 l
11 647.215 l
h
f
0.875 0.875 0.875 rg
602 648.215 m
602 646.215 l
10 646.215 l
11 647.215 l
601 647.215 l
601 647.215 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 627.1909 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
0 -1.2 TD
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/track4.html \(2 of 2\)11/3/2006 5:49:45 PM)Tj
ET
EMC
endstream
endobj
769 0 obj(Successful Lisp - Former User Track)
endobj
770 0 obj<>
endobj
771 0 obj(http://psg.com/~dlamkins/sl/track4.html)
endobj
772 0 obj(]N>\\7sX)
endobj
773 0 obj<>
endobj
774 0 obj<>
endobj
775 0 obj(c+_raD[)
endobj
776 0 obj<>
endobj
777 0 obj<>
endobj
778 0 obj<>]/P 9 0 R/S/Article/T()/Pg 779 0 R>>
endobj
779 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
780 0 obj<>
endobj
781 0 obj[778 0 R]
endobj
782 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
783 0 obj[782 0 R 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R]
endobj
784 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
785 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
786 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
787 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
788 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
789 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
790 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
791 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
792 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
793 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
794 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
795 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
796 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
797 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
798 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
799 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
800 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
801 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
802 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
803 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
804 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
805 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
806 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
807 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
808 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
809 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
810 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
811 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
812 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
813 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
814 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
815 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
816 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
817 0 obj[778 0 R]
endobj
818 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
819 0 obj[818 0 R 820 0 R 821 0 R]
endobj
820 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
821 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
822 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Curious Reader Track)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Curious Reader Track Suggested Chapter List)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Read in order, skimming as desired:)Tj
/T1_2 1 Tf
7 0 0 7 35.713 643.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
50 641.874 m
303.918 641.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 643.9909 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 625.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 623.074 m
253.364 623.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 625.1909 Tm
(Chapter 4 - Mastering the Essentials)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 606.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 604.274 m
232.742 604.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 606.3909 Tm
(Chapter 5 - Introducing Iteration)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 587.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 585.474 m
242.458 585.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 587.5909 Tm
(Chapter 6 - Deeper into Structures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 568.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 566.674 m
361.85 566.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 568.7909 Tm
(Chapter 7 - A First Look at Objects as Fancy Structures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 549.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 547.874 m
244.824 547.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 549.9909 Tm
(Chapter 8 - Lifetime and Visibility)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 531.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 529.074 m
390.606 529.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 531.1909 Tm
(Chapter 9 - Introducing Error Handling and Non-Local Exits)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 512.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 510.274 m
342.796 510.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 512.3909 Tm
(Chapter 10 - How to Find Your Way Around, Part 1)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 493.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 491.474 m
264.634 491.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 493.5909 Tm
(Chapter 11 - Destructive Modification)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 474.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 472.674 m
284.066 472.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 474.7909 Tm
(Chapter 12 - Mapping Instead of Iteration)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 455.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 453.874 m
388.31 453.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 455.9909 Tm
(Chapter 13 - Still More Things You Can Do with Sequences)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 437.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 435.074 m
354.444 435.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 437.1909 Tm
(Chapter 14 - Can Objects Really Behave Themselves?)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 418.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 416.274 m
172.486 416.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 418.3909 Tm
(Chapter 15 - Closures)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 399.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 397.474 m
342.796 397.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 399.5909 Tm
(Chapter 16 - How to Find Your Way Around, Part 2)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 380.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 378.674 m
300.026 378.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 380.7909 Tm
(Chapter 17 - Not All Comparisons are Equal)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 361.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 359.874 m
250.62 359.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 361.9909 Tm
(Chapter 18 - Very Logical, Indeed\212)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 343.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 341.074 m
168.594 341.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 343.1909 Tm
(Chapter 19 - Streams)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 324.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 322.274 m
214.08 322.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 324.3909 Tm
(Chapter 20 - Macro Etiquette)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 305.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 303.474 m
408.12 303.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 305.5909 Tm
(Chapter 21 - Fancy Tricks with Function and Macro Arguments)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 286.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 284.674 m
342.796 284.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 286.7909 Tm
(Chapter 22 - How to Find Your Way Around, Part 3)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 267.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 265.874 m
347.052 265.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 267.9909 Tm
(Chapter 23 - To Err is Expected; To Recover, Divine)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 249.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 247.074 m
348.214 247.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 249.1909 Tm
(Chapter 24 - FORMAT Speaks a Different Language)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 230.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 228.274 m
319.864 228.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 230.3909 Tm
(Chapter 25 - Connecting Lisp to the Real World)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 211.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 209.474 m
348.214 209.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 211.5909 Tm
(Chapter 26 - Put on a Happy Face: Interface Builders)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 192.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 190.674 m
393.728 190.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 192.7909 Tm
(Chapter 27 - A Good Editor is Worth a Thousand Keystrokes)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 173.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 171.874 m
340.836 171.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 173.9909 Tm
(Chapter 28 - Practical Techniques for Programming)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 155.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 153.074 m
420.538 153.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 155.1909 Tm
(Chapter 29 - I Thought it was Your Turn to Take Out the Garbage)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 136.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 134.274 m
389.85 134.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 136.3909 Tm
(Chapter 30 - Helpful Hints for Debugging and Bug-Proofing)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 117.5909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 115.474 m
303.134 115.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 117.5909 Tm
(Chapter 31 - Handling Large Projects in Lisp)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 98.7909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 96.674 m
287.188 96.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 98.7909 Tm
(Chapter 32 - Dark Corners and Curiosities)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 79.9909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 77.874 m
226.512 77.874 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 79.9909 Tm
(Chapter 33 - Where to Go Next)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 61.1909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 59.074 m
387.148 59.074 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 61.1909 Tm
(Chapter 34 - Lisp History, or: Origins of Misunderstandings)Tj
0 0 0 rg
( )Tj
/T1_2 1 Tf
7 0 0 7 35.713 42.3909 Tm
(l)Tj
/T1_0 1 Tf
( )Tj
ET
50 40.274 m
293.81 40.274 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 50 42.3909 Tm
(Appendix A - Successful Lisp Applications)Tj
0 0 0 rg
( )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/track5.html \(1 of 2\)11/3/2006 5:49:52 PM)Tj
ET
EMC
endstream
endobj
823 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Curious Reader Track)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
0.5 0.5 0.5 rg
10 737.615 m
10 739.615 l
602 739.615 l
601 738.615 l
11 738.615 l
11 738.615 l
h
f
0.875 0.875 0.875 rg
602 739.615 m
602 737.615 l
10 737.615 l
11 738.615 l
601 738.615 l
601 738.615 l
h
f
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
259.1 716.474 m
308.884 716.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 718.5909 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 716.474 m
352.9 716.474 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 718.5909 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
278.588 697.674 m
333.412 697.674 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 278.588 699.7909 Tm
(Chapter 2)Tj
0 0 0 rg
( )Tj
ET
0.5 0.5 0.5 rg
10 684.015 m
10 686.015 l
602 686.015 l
601 685.015 l
11 685.015 l
11 685.015 l
h
f
0.875 0.875 0.875 rg
602 686.015 m
602 684.015 l
10 684.015 l
11 685.015 l
601 685.015 l
601 685.015 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 664.9909 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
0 -1.2 TD
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/track5.html \(2 of 2\)11/3/2006 5:49:52 PM)Tj
ET
EMC
endstream
endobj
824 0 obj(Successful Lisp - Curious Reader Track)
endobj
825 0 obj<>
endobj
826 0 obj(http://psg.com/~dlamkins/sl/track5.html)
endobj
827 0 obj(Kiwcx\\LZ)
endobj
828 0 obj<>
endobj
829 0 obj<>
endobj
830 0 obj(ѠHur4y)
endobj
831 0 obj<>
endobj
832 0 obj<>
endobj
833 0 obj[/Indexed/DeviceRGB 255 834 0 R]
endobj
834 0 obj<>stream
f3 ̙f3 f3 ffffff3f 3333f333 f 3 f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333 f 3 ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333 ̙ f 3 ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f 3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33 f 3 ̙ f 3 f 3 f f f ff f3 f 3 3 3 3f 33 3 f 3 w U D " w U D " w U D " ݻwwwUUUDDD"""
endstream
endobj
835 0 obj<>stream
Hb`?H ,`0
endstream
endobj
836 0 obj(http://psg.com/~dlamkins/sl/gifs/circle-dot.gif)
endobj
837 0 obj(O{6 5D\(`ײ)
endobj
838 0 obj<>
endobj
839 0 obj<>
endobj
840 0 obj[/Indexed/DeviceRGB 255 841 0 R]
endobj
841 0 obj<>stream
f3 ̙f3 f3 ffffff3f 3333f333 f 3 f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333 f 3 ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333 ̙ f 3 ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f 3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33 f 3 ̙ f 3 f 3 f f f ff f3 f 3 3 3 3f 33 3 f 3 w U D " w U D " w U D " ݻwwwUUUDDD"""
endstream
endobj
842 0 obj<>stream
Hb` p( ';
endstream
endobj
843 0 obj(http://psg.com/~dlamkins/sl/gifs/right-arrow.gif)
endobj
844 0 obj(jeC/}dOe[\))
endobj
845 0 obj<>
endobj
846 0 obj<>
endobj
847 0 obj[/Indexed/DeviceRGB 255 848 0 R]
endobj
848 0 obj<>stream
f3 ̙f3 f3 ffffff3f 3333f333 f 3 f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333 f 3 ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333 ̙ f 3 ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f 3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33 f 3 ̙ f 3 f 3 f f f ff f3 f 3 3 3 3f 33 3 f 3 w U D " w U D " w U D " ݻwwwUUUDDD"""
endstream
endobj
849 0 obj<>stream
Hb`?B?B?@Pl `
endstream
endobj
850 0 obj(http://psg.com/~dlamkins/sl/gifs/right-arrow-bar.gif)
endobj
851 0 obj(]\n !ngw\()
endobj
852 0 obj<>
endobj
853 0 obj<>
endobj
854 0 obj<><><><>]/P 9 0 R/S/Article/T()/Pg 855 0 R>>
endobj
855 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
856 0 obj[854 0 R]
endobj
857 0 obj[855 0 R/XYZ 0 698.277 null]
endobj
858 0 obj[855 0 R/XYZ 0 605.606 null]
endobj
859 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
860 0 obj[859 0 R 861 0 R 863 0 R 864 0 R 865 0 R 866 0 R 867 0 R]
endobj
861 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
862 0 obj[855 0 R/XYZ 0 605.606 null]
endobj
863 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
864 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
865 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
866 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
867 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
868 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
869 0 obj[854 0 R]
endobj
870 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
871 0 obj[854 0 R]
endobj
872 0 obj[870 0 R/XYZ 0 627.133 null]
endobj
873 0 obj[870 0 R/XYZ 0 627.133 null]
endobj
874 0 obj[870 0 R/XYZ 0 627.133 null]
endobj
875 0 obj[870 0 R/XYZ 0 615.108 null]
endobj
876 0 obj[870 0 R/XYZ 0 610.333 null]
endobj
877 0 obj[870 0 R/XYZ 0 598.308 null]
endobj
878 0 obj[870 0 R/XYZ 0 593.533 null]
endobj
879 0 obj[870 0 R/XYZ 0 581.508 null]
endobj
880 0 obj[870 0 R/XYZ 0 576.733 null]
endobj
881 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
882 0 obj<>
endobj
883 0 obj[854 0 R]
endobj
884 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
885 0 obj[884 0 R 886 0 R 887 0 R 888 0 R 889 0 R]
endobj
886 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
887 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
888 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
889 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
890 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
891 0 obj<>
endobj
892 0 obj<>
endobj
893 0 obj[854 0 R]
endobj
894 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
895 0 obj[894 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R]
endobj
896 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
897 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
898 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
899 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
900 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
901 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
902 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
903 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
904 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 2)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Lesson 2 - Essential Evaluation)Tj
16.1538 0 0 16.1538 10 641.8611 Tm
(A form is meant to be evaluated)Tj
/T1_0 1 Tf
14 0 0 14 10 605.6063 Tm
(A form can be either an )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
146.066 603.49 m
174.066 603.49 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 146.066 605.6063 Tm
(atom)Tj
0 0 0 rg
( or a )Tj
ET
202.444 603.49 m
219.566 603.49 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 202.444 605.6063 Tm
(list)Tj
0 0 0 rg
(. The important thing is that the form is meant to be evaluated. )Tj
-13.746 -1.343 Td
(Evaluation has a fairly technical definition that we'll gradually expose\
in this section.)Tj
0 -2.557 TD
(Evaluation is simple if the form is an atom. Lisp treats the atom as a n\
ame, and retrieves the value for )Tj
0 -1.2 TD
(the name \(if a value exists\). You probably wonder why I'm avoiding the\
more direct explanation of )Tj
T*
(calling the atom a variable. The reason is that the atom can have either\
a variable value or a constant )Tj
T*
(value. And the atom's value can be constant for a couple of reasons.)Tj
0 -2.557 TD
(A number is an atom. \(Its value is constant for obvious reasons.\) Lisp\
does not )Tj
/T1_2 1 Tf
(store)Tj
/T1_0 1 Tf
( a value for a )Tj
0 -1.2 TD
(number -- the number is said to be self-evaluating.)Tj
2.857 -2.557 Td
(We're going to introduce a new term without a complete definition. For n\
ow, think of a )Tj
/T1_2 1 Tf
T*
(symbol)Tj
/T1_0 1 Tf
( as an atom that can have a value. We'll look at symbols in greater deta\
il when we )Tj
T*
(get to )Tj
ET
85 376.49 m
135.162 376.49 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 85 378.6063 Tm
(Lesson 5)Tj
0 0 0 rg
(. )Tj
-5.357 -2.705 Td
(A symbol defined in a )Tj
/T1_3 1 Tf
(defconstant)Tj
/T1_0 1 Tf
( form has a constant value. Lisp will store the value as if the )Tj
T*
(atom had a variable value, and add a note to the effect that the value i\
s not allowed to change.)Tj
0 -2.562 TD
(A symbol in the )Tj
/T1_3 1 Tf
(KEYWORD)Tj
/T1_0 1 Tf
( package is self-evaluating. We'll look at packages in detail in )Tj
ET
511.48 285.955 m
573.304 285.955 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 511.48 288.0715 Tm
(Chapter 31)Tj
0 0 0 rg
(. )Tj
-35.82 -1.348 Td
(For now, all you need to know is that a symbol beginning with the )Tj
/T1_3 1 Tf
(:)Tj
/T1_0 1 Tf
( character \(called the package )Tj
0 -1.2 TD
(prefix\) is a keyword symbol. Keyword symbols have themselves as their v\
alues.)Tj
0 -2.557 TD
(A symbol can get a variable value in many different ways. Lisp actually \
keeps several different values )Tj
0 -1.2 TD
(for a symbol. One has the traditional meaning as the value of the symbol\
taken as a variable. Another )Tj
T*
(has meaning as the symbol's function. Still others keep track of the sym\
bol's documentation, its printed )Tj
T*
(representation, and properties that the programmer chooses to associate \
with the symbol. We'll explore )Tj
T*
(some of these in more detail in )Tj
ET
186.148 147.287 m
236.31 147.287 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 186.148 149.4041 Tm
(Lesson 5)Tj
0 0 0 rg
(, )Tj
ET
243.31 147.287 m
293.472 147.287 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 243.31 149.4041 Tm
(Lesson 6)Tj
0 0 0 rg
(, and )Tj
ET
324.188 147.287 m
374.35 147.287 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 324.188 149.4041 Tm
(Lesson 7)Tj
0 0 0 rg
(.)Tj
-22.442 -2.7 Td
(If a form is a list, then the first element must be either a symbol or a\
special form called a lambda )Tj
T*
(expression. \(We won't look at lambda expressions for a while.\) The sym\
bol must name a function. In )Tj
0 -1.205 TD
(Lisp, the )Tj
/T1_2 1 Tf
(symbols)Tj
/T1_0 1 Tf
( )Tj
/T1_3 1 Tf
(+)Tj
/T1_0 1 Tf
(, )Tj
/T1_3 1 Tf
(-)Tj
/T1_0 1 Tf
(, )Tj
/T1_3 1 Tf
(*)Tj
/T1_0 1 Tf
(, and )Tj
/T1_3 1 Tf
(/)Tj
/T1_0 1 Tf
( name the four common arithmetic operations: addition, subtraction, )Tj
0 -1.2 TD
(multiplication, and division. Each of these symbols has an associated fu\
nction that performs the )Tj
T*
(arithmetic operation.)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-02.html \(1 of 5\)11/3/2006 5:50:0\
3 PM)Tj
ET
EMC
endstream
endobj
905 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 2)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 738.4693 Tm
(So when Lisp evaluates the form )Tj
/T1_1 1 Tf
(\(+ 2 3\))Tj
/T1_0 1 Tf
(, it applies the function for addition to the arguments )Tj
/T1_1 1 Tf
(2)Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
0 -1.205 TD
(3)Tj
/T1_0 1 Tf
(, giving the expected result )Tj
/T1_1 1 Tf
(5)Tj
/T1_0 1 Tf
(. Notice how the function symbol, )Tj
/T1_1 1 Tf
(+)Tj
/T1_0 1 Tf
(, precedes its arguments. This is )Tj
/T1_2 1 Tf
0 -1.2 TD
(prefix)Tj
/T1_0 1 Tf
( notation. Any time you see a list, look to its first element to find ou\
t what Lisp will do to evaluate )Tj
T*
(the list as a form.)Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 650.0721 Tm
(A function is applied to its arguments)Tj
/T1_0 1 Tf
14 0 0 14 10 613.8173 Tm
(Lisp, when given a list to evaluate, treats the form as a function call.\
We'll be looking a lot at Lisp )Tj
T*
(evaluation from now on, so we'll use some visual aids to identify the in\
put to Lisp and its responses:)Tj
ET
q
7 0 0 8 10 561.1499481 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 561.1499 Tm
( the Lisp prompt precedes input to Lisp )Tj
ET
q
10 0 0 7 10 544.3499451 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 544.3499 Tm
( result of Lisp evaluation)Tj
/T1_0 1 Tf
-0.714 -2.552 Td
(For example:)Tj
ET
q
7 0 0 8 10 472.749939 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 472.7499 Tm
( \(+ 4 9\) )Tj
ET
q
10 0 0 7 10 455.9499512 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 455.95 Tm
( 13 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 439.1499481 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 439.1499 Tm
( \(- 5 7\) )Tj
ET
q
10 0 0 7 10 422.3499451 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 422.3499 Tm
( -2 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 405.549942 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 405.5499 Tm
( \(* 3 9\) )Tj
ET
q
10 0 0 7 10 388.749939 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 388.7499 Tm
( 27 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 371.9499512 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 371.95 Tm
( \(/ 15.0 2\) )Tj
ET
q
10 0 0 7 10 355.1499481 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 355.1499 Tm
( 7.5)Tj
/T1_0 1 Tf
-0.714 -2.552 Td
(In each case above, the evaluated form is a list. Its first element is a\
symbol, which names a function. )Tj
T*
(The remaining elements are )Tj
/T1_2 1 Tf
(arguments)Tj
/T1_0 1 Tf
( of the function. Here, the arguments are all numbers, and we )Tj
T*
(know that numbers are self-evaluating.)Tj
0 -2.557 TD
(Here are a few more examples:)Tj
ET
q
7 0 0 8 10 214.1499481 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 214.1499 Tm
( \(atom 123\) )Tj
ET
q
10 0 0 7 10 197.3499451 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 197.3499 Tm
( T )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 180.549942 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 180.5499 Tm
( \(numberp 123\) )Tj
ET
q
10 0 0 7 10 163.749939 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 163.7499 Tm
( T )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 146.9499512 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 146.95 Tm
( \(atom :foo\) )Tj
ET
q
10 0 0 7 10 130.1499481 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 130.1499 Tm
( T )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 113.3499451 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 113.3499 Tm
( \(numberp :foo\) )Tj
ET
q
10 0 0 7 10 96.549942 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 96.5499 Tm
( NIL)Tj
-0.714 -2.557 Td
(ATOM)Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
(NUMBERP)Tj
/T1_0 1 Tf
( are predicates. Predicates return a true or false value. )Tj
/T1_1 1 Tf
(NIL)Tj
/T1_0 1 Tf
( is the only false value in )Tj
0 -1.2 TD
(Lisp -- everything else is true. Unless a predicate has a more useful va\
lue to return, it conventionally )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-02.html \(2 of 5\)11/3/2006 5:50:0\
3 PM)Tj
ET
EMC
endstream
endobj
906 0 obj<>
endobj
907 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 2)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9082 Tm
(returns )Tj
/T1_1 1 Tf
(T)Tj
/T1_0 1 Tf
( to mean true. )Tj
/T1_1 1 Tf
(ATOM)Tj
/T1_0 1 Tf
( returns )Tj
/T1_1 1 Tf
(T)Tj
/T1_0 1 Tf
( if its one argument is a Lisp atom. )Tj
/T1_1 1 Tf
(NUMBERP)Tj
/T1_0 1 Tf
( returns )Tj
/T1_1 1 Tf
(T)Tj
/T1_0 1 Tf
( if its )Tj
0 -1.2 TD
(argument is a number.)Tj
0 -2.557 TD
(To evaluate each of the above forms, Lisp first evaluates the arguments \
\(from left to right\), then )Tj
0 -1.2 TD
(evaluates the first element to get its function, then applies the functi\
on to the arguments. With only a )Tj
T*
(handful of exceptions, which we'll learn about at the end of this lesson\
, Lisp always does the same thing )Tj
T*
(to evaluate a list form:)Tj
1.607 -2.557 Td
(1. )Tj
(Evaluate the arguments, from left to right.)Tj
T*
(2. )Tj
(Get the function associated with the first element.)Tj
T*
(3. )Tj
(Apply the function to the arguments.)Tj
-1.607 -2.557 Td
(Remember that an atom can also be a Lisp form. When given an atom to eva\
luate, Lisp simply returns )Tj
T*
(its value:)Tj
ET
q
7 0 0 8 10 493.0407715 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 493.0408 Tm
( 17.95 )Tj
ET
q
10 0 0 7 10 476.2407684 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 476.2408 Tm
( 17.95 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 459.4407654 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 459.4408 Tm
( :A-KEYWORD )Tj
ET
q
10 0 0 7 10 442.6407623 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 442.6408 Tm
( :A-KEYWORD )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 425.8407593 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 425.8408 Tm
( *FEATURES* )Tj
ET
q
10 0 0 7 10 409.0407715 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 409.0408 Tm
( \(:ANSI-CL :CLOS :COMMON-LISP\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 392.2407684 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 392.2408 Tm
( "Hello, world!" )Tj
ET
q
10 0 0 7 10 375.4407654 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 375.4408 Tm
( "Hello, world!" )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 358.6407623 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 358.6408 Tm
( WHAT-IS-THIS? )Tj
ET
q
11 0 0 9 10 341.8407593 cm
/Im2 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 21 341.8408 Tm
( Error: Unbound variable)Tj
/T1_0 1 Tf
-0.786 -2.557 Td
(Numbers and keywords are self-evaluating. So are strings. The )Tj
/T1_1 1 Tf
(*FEATURES*)Tj
/T1_0 1 Tf
( variable is predefined by )Tj
T*
(Lisp -- your system will probably return a different value.)Tj
0 -2.562 TD
(The symbol )Tj
/T1_1 1 Tf
(WHAT-IS-THIS?)Tj
/T1_0 1 Tf
( doesn't have a value, because it's not predefined by Lisp, and I haven'\
t )Tj
0 -1.2 TD
(given it a value. The system responds with an error message, rather than\
a value. We mark the message )Tj
T*
(with )Tj
ET
q
11 0 0 9 38.3919983 219.7733765 cm
/Im2 Do
Q
BT
/T1_0 1 Tf
14 0 0 14 49.392 219.7734 Tm
( rather than the )Tj
ET
q
10 0 0 7 137.2559967 219.7733765 cm
/Im1 Do
Q
BT
/T1_0 1 Tf
14 0 0 14 147.256 219.7734 Tm
( marker we use for successful evaluations. Your system will probably pri\
nt a )Tj
-9.804 -1.2 Td
(different message.)Tj
/T1_2 1 Tf
16.1538 0 0 16.1538 10 165.0435 Tm
(A function can return any number of values)Tj
/T1_0 1 Tf
14 0 0 14 10 128.7888 Tm
(Sometimes you'd like to have a function return several values. For examp\
le, a function which looks up a )Tj
T*
(database entry might return both the desired result and a completion sta\
tus code. One way to do this is to )Tj
T*
(pass to the function a location for one of the results; this is possible\
, but )Tj
/T1_3 1 Tf
(very)Tj
/T1_0 1 Tf
( uncommon for a Lisp )Tj
T*
(program.)Tj
0 -2.557 TD
(Another approach creates a single return value to combine both the resul\
t and the status code. Lisp gives )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-02.html \(3 of 5\)11/3/2006 5:50:0\
3 PM)Tj
ET
EMC
endstream
endobj
908 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 2)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9756 Tm
(you several different ways to do this, including )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
277.134 751.859 m
331.566 751.859 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 277.134 753.9756 Tm
(structures)Tj
0 0 0 rg
(. Experienced Lisp programmers don't do this )Tj
-19.081 -1.343 Td
(when the created value will just be taken apart into its components and \
then forgotten, since the )Tj
0 -1.2 TD
(composite value then becomes garbage \(see )Tj
ET
258.822 716.259 m
320.646 716.259 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 258.822 718.3755 Tm
(Chapter 29)Tj
0 0 0 rg
(\) that eventually slows down the operation of the )Tj
-17.773 -1.343 Td
(program.)Tj
0 -2.562 TD
(The right way to return multiple values from a function is to use the )Tj
/T1_1 1 Tf
(VALUES)Tj
/T1_0 1 Tf
( form. We'll see )Tj
ET
0.428 w
536.134 662.423 m
586.534 662.423 l
S
0.706 w
586.534 661.591 m
590.034 661.591 l
S
0 0 1 rg
BT
/T1_1 1 Tf
14 0 0 14 536.134 663.7082 Tm
(VALUES)Tj
/T1_0 1 Tf
( )Tj
ET
10 642.791 m
190.418 642.791 l
S
BT
/T1_0 1 Tf
14 0 0 14 10 644.9082 Tm
(used in the context of a function)Tj
0 0 0 rg
( in a little while. For now, let's see what happens when Lisp evaluates \
a )Tj
/T1_1 1 Tf
0 -1.348 TD
(VALUES)Tj
/T1_0 1 Tf
( form:)Tj
ET
q
7 0 0 8 10 590.1733704 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 590.1734 Tm
( \(values 1 2 3 :hi "Hello"\) )Tj
ET
q
10 0 0 7 10 573.3733673 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 573.3734 Tm
( 1 )Tj
ET
q
10 0 0 7 10 556.5733643 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 556.5734 Tm
( 2 )Tj
ET
q
10 0 0 7 10 539.7733765 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 539.7734 Tm
( 3 )Tj
ET
q
10 0 0 7 10 522.9733734 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 522.9734 Tm
( :HI)Tj
ET
q
10 0 0 7 10 506.1733704 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 506.1734 Tm
( "Hello")Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(Notice how Lisp returned a value \(following the )Tj
ET
q
10 0 0 7 283.7279968 470.3733673 cm
/Im1 Do
Q
BT
/T1_0 1 Tf
14 0 0 14 293.728 470.3734 Tm
( indicator\) for )Tj
/T1_2 1 Tf
(each)Tj
/T1_0 1 Tf
( argument to the )Tj
/T1_1 1 Tf
(VALUES)Tj
/T1_0 1 Tf
( form. )Tj
-20.266 -1.2 Td
(My Lisp system represents this by printing each value on a new line; you\
rs may separate the values )Tj
0 -1.2 TD
(some other way.)Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 398.8436 Tm
(Arguments are usually not modified by a function)Tj
/T1_0 1 Tf
14 0 0 14 10 362.5888 Tm
(I mentioned earlier that you can pass a location to a function, and have\
the function change the location's )Tj
T*
(value. This is a )Tj
/T1_2 1 Tf
(very)Tj
/T1_0 1 Tf
( uncommon practice for a Lisp program, even though other languages make \
it part )Tj
T*
(of their standard repertoire.)Tj
0 -2.557 TD
(You could specify the location to be modified as either a non-keyword sy\
mbol or a composite value -- )Tj
0 -1.2 TD
(obviously, you can't modify a constant. If you provide a symbol, then yo\
ur function must execute code )Tj
T*
(to give the symbol a new value. If you provide a composite data structur\
e, your function must execute )Tj
T*
(code to change the correct piece of the composite value. It's harder to \
write Lisp code to do this, and it's )Tj
T*
(harder to understand programs written this way. So Lisp programmers usua\
lly write functions that get )Tj
T*
(their inputs from parameters, and produce their outputs as the function \
result.)Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 171.2589 Tm
(Arguments are usually evaluated before function application)Tj
/T1_0 1 Tf
14 0 0 14 10 135.0041 Tm
(When Lisp evaluates a function, it always evaluates all the arguments fi\
rst, as we saw )Tj
ET
493.294 132.887 m
529.05 132.887 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 493.294 135.0041 Tm
(earlier)Tj
0 0 0 rg
(. )Tj
-34.521 -1.343 Td
(Unfortunately, every rule has exceptions, and this rule is no exception \
\(as we'll soon see\)... The problem )Tj
T*
(is not that Lisp doesn't always evaluate a function's arguments, but tha\
t not every list form is a function )Tj
T*
(call.)Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 44.6743 Tm
(Arguments are evaluated in left-to-right order)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-02.html \(4 of 5\)11/3/2006 5:50:0\
3 PM)Tj
ET
EMC
endstream
endobj
909 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 2)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 738.4195 Tm
(When a list form )Tj
/T1_1 1 Tf
(is)Tj
/T1_0 1 Tf
( a function call, its arguments are always evaluated in order, from left\
to right. As in )Tj
0 -1.2 TD
(other programming languages, it's in poor taste to rely on this, but if \
you absolutely have to rely on the )Tj
T*
(order, it's good to know that Lisp defines it for you.)Tj
/T1_2 1 Tf
16.1538 0 0 16.1538 10 666.8897 Tm
(Special forms and macros change argument evaluation)Tj
/T1_0 1 Tf
14 0 0 14 10 630.6349 Tm
(So if a list form isn't always a function call, what else can it be? The\
re are two cases, but the result is the )Tj
T*
(same: some arguments are evaluated, and some aren't. Which is which depe\
nds upon the form and )Tj
T*
(nothing else. You'll just have to learn the exceptions. Fortunately, mos\
t Lisp systems will show you the )Tj
T*
(online documentation for any form with just a keystroke or two.)Tj
0 -2.557 TD
(There are two kinds of forms that don't evaluate all of their arguments:\
special forms and macros. Lisp )Tj
0 -1.2 TD
(predefines a small number of special forms. You can't add your own speci\
al forms -- they're primitive )Tj
T*
(features of the language itself. Lisp also defines quite a few macros. Y\
ou can also define your own )Tj
T*
(macros. Macros in Lisp let you use the full power of the language to add\
your own features. Later in this )Tj
T*
(chapter we'll look briefly at )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
167.654 475.118 m
329.41 475.118 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 167.654 477.2349 Tm
(how to define simple macros)Tj
0 0 0 rg
(. In )Tj
ET
351.572 475.118 m
413.396 475.118 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 351.572 477.2349 Tm
(Chapter 20)Tj
0 0 0 rg
( we'll cover topics surrounding )Tj
-24.398 -1.343 Td
(the creation of more complex macros.)Tj
ET
0.5 0.5 0.5 rg
10 425.659 m
10 427.659 l
602 427.659 l
601 426.659 l
11 426.659 l
11 426.659 l
h
f
0.875 0.875 0.875 rg
602 427.659 m
602 425.659 l
10 425.659 l
11 426.659 l
601 426.659 l
601 426.659 l
h
f
259.1 404.518 m
308.884 404.518 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 406.6349 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 404.518 m
352.9 404.518 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 406.6349 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
20.589 385.718 m
75.413 385.718 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 20.589 387.8349 Tm
(Chapter 2)Tj
0 0 0 rg
( | )Tj
ET
85.213 385.718 m
216.253 385.718 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 85.213 387.8349 Tm
(Chapter 3, Introduction)Tj
0 0 0 rg
( | )Tj
ET
226.053 385.718 m
338.039 385.718 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 226.053 387.8349 Tm
(Chapter 3, Lesson 1)Tj
0 0 0 rg
( | Chapter 3, Lesson 2 | )Tj
ET
469.625 385.718 m
581.611 385.718 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 469.625 387.8349 Tm
(Chapter 3, Lesson 3)Tj
0 0 0 rg
( | )Tj
ET
278.588 366.918 m
333.412 366.918 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 278.588 369.0349 Tm
(Chapter 4)Tj
0 0 0 rg
( )Tj
ET
0.5 0.5 0.5 rg
10 353.259 m
10 355.259 l
602 355.259 l
601 354.259 l
11 354.259 l
11 354.259 l
h
f
0.875 0.875 0.875 rg
602 355.259 m
602 353.259 l
10 353.259 l
11 354.259 l
601 354.259 l
601 354.259 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 334.2349 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
T*
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-02.html \(5 of 5\)11/3/2006 5:50:0\
3 PM)Tj
ET
EMC
endstream
endobj
910 0 obj(Successful Lisp - Chapter 3, Lesson 2)
endobj
911 0 obj<>
endobj
912 0 obj(http://psg.com/~dlamkins/sl/chapter03-02.html)
endobj
913 0 obj(կKG\)"J-y)
endobj
914 0 obj<>
endobj
915 0 obj<>
endobj
916 0 obj(`PL/V)
endobj
917 0 obj 1
endobj
918 0 obj 1
endobj
919 0 obj 2
endobj
920 0 obj 2
endobj
921 0 obj 1
endobj
922 0 obj 3
endobj
923 0 obj 3
endobj
924 0 obj<>
endobj
925 0 obj<>
endobj
926 0 obj[/Indexed/DeviceRGB 255 927 0 R]
endobj
927 0 obj<>stream
f3 ̙f3 f3 ffffff3f 3333f333 f 3 f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333 f 3 ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333 ̙ f 3 ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f 3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33 f 3 ̙ f 3 f 3 f f f ff f3 f 3 3 3 3f 33 3 f 3 w U D " w U D " w U D " ݻwwwUUUDDD"""
endstream
endobj
928 0 obj<>stream
H?
endstream
endobj
929 0 obj(http://psg.com/~dlamkins/sl/gifs/equivalent.gif)
endobj
930 0 obj(SWTV&{r8)
endobj
931 0 obj<>
endobj
932 0 obj<>
endobj
933 0 obj<><><><><>]/P 9 0 R/S/Article/T()/Pg 934 0 R>>
endobj
934 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
935 0 obj[933 0 R]
endobj
936 0 obj[934 0 R/XYZ 0 698.277 null]
endobj
937 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
938 0 obj[933 0 R]
endobj
939 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
940 0 obj[939 0 R]
endobj
941 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
942 0 obj[933 0 R]
endobj
943 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
944 0 obj<>
endobj
945 0 obj[933 0 R]
endobj
946 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
947 0 obj[933 0 R]
endobj
948 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
949 0 obj[948 0 R]
endobj
950 0 obj[946 0 R/XYZ 0 315.593 null]
endobj
951 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
952 0 obj[933 0 R]
endobj
953 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
954 0 obj[953 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R]
endobj
955 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
956 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
957 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
958 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
959 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
960 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
961 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
962 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 3)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Lesson 3 - Some Examples of Special Forms and Macros)Tj
/T1_0 1 Tf
14 0 0 14 10 643.9909 Tm
(Now we'll look at several special forms and macros. Over the next four l\
essons, we'll build up a )Tj
0 -1.2 TD
(repertoire that will let you write simple functions using the most eleme\
ntary Lisp data type, the list. )Tj
T*
(Later chapters will cover more complex program structures and data types\
.)Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 572.4611 Tm
(SETQ)Tj
/T1_0 1 Tf
14 0 0 14 10 536.1389 Tm
(Earlier, I told you that Lisp evaluates a symbol form by retrieving its \
variable value. )Tj
/T1_2 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( gives you a )Tj
T*
(way to set that value:)Tj
ET
q
7 0 0 8 10 483.4715424 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 483.4715 Tm
( \(setq my-name "David"\) )Tj
ET
q
10 0 0 7 10 466.6715393 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 466.6715 Tm
( "David" )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 449.8715363 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 449.8715 Tm
( my-name )Tj
ET
q
10 0 0 7 10 433.0715332 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 433.0715 Tm
( "David" )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 416.2715302 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 416.2715 Tm
( \(setq a-variable 57\) )Tj
ET
q
10 0 0 7 10 399.4715424 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 399.4715 Tm
( 57 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 382.6715393 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 382.6715 Tm
( a-variable )Tj
ET
q
10 0 0 7 10 365.8715363 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 365.8715 Tm
( 57 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 349.0715332 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 349.0715 Tm
( \(setq a-variable :a-keyword\) )Tj
ET
q
10 0 0 7 10 332.2715302 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 332.2715 Tm
( :A-KEYWORD)Tj
-0.714 -2.557 Td
(SETQ)Tj
/T1_0 1 Tf
('s first argument is a symbol. This is not evaluated. The second argumen\
t is assigned as the )Tj
0 -1.205 TD
(variable's value. )Tj
/T1_2 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( returns the value of its last argument.)Tj
/T1_2 1 Tf
2.857 -2.562 Td
(SETQ)Tj
/T1_0 1 Tf
( doesn't evaluate its first argument because you want to assign a value \
to the symbol )Tj
T*
(itself. If )Tj
/T1_2 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( evaluated its first argument, the )Tj
/T1_3 1 Tf
(value)Tj
/T1_0 1 Tf
( of that argument would have to be a )Tj
0 -1.205 TD
(symbol. The )Tj
/T1_2 1 Tf
(SET)Tj
/T1_0 1 Tf
( form does this. Pay particular attention to the difference between the \
)Tj
/T1_2 1 Tf
T*
(SET)Tj
/T1_0 1 Tf
( and )Tj
/T1_2 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( forms in the following example, and make sure you understand what's )Tj
0 -1.205 TD
(happening with the )Tj
/T1_2 1 Tf
(\(set var-1 99\))Tj
/T1_0 1 Tf
( form: )Tj
ET
q
7 0 0 8 50 140.399765 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 57 140.3998 Tm
( \(setq var-1 'var-2\) )Tj
ET
q
10 0 0 7 50 123.5997772 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 60 123.5998 Tm
( VAR-2 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 50 106.7997742 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 57 106.7998 Tm
( var-1 )Tj
ET
q
10 0 0 7 50 89.9997711 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 60 89.9998 Tm
( VAR-2 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 50 73.1997681 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 57 73.1998 Tm
( var-2 )Tj
ET
q
11 0 0 9 50 56.399765 cm
/Im2 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 61 56.3998 Tm
( Error: Unbound variable )Tj
-0.786 -0.336 Td
( )Tj
ET
q
7 0 0 8 50 39.5997772 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 57 39.5998 Tm
( \(set var-1 99\) )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-03.html \(1 of 6\)11/3/2006 5:50:2\
3 PM)Tj
ET
EMC
endstream
endobj
963 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 3)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
q
10 0 0 7 50 752.7997742 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 60 752.7998 Tm
( 99 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 50 735.9997711 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 57 735.9998 Tm
( var-1 )Tj
ET
q
10 0 0 7 50 719.1997681 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 60 719.1998 Tm
( VAR-2 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 50 702.399765 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 57 702.3998 Tm
( VAR-2 )Tj
ET
q
10 0 0 7 50 685.5997772 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 60 685.5998 Tm
( 99)Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(Did you notice the )Tj
/T1_1 1 Tf
(')Tj
/T1_0 1 Tf
( in the first form? This keeps the following form, )Tj
/T1_1 1 Tf
(var-2)Tj
/T1_0 1 Tf
(, from being )Tj
0 -1.205 TD
(evaluated. Later in this lesson, when we look at )Tj
ET
0 0 1 RG
0.428 w 10 M 0 j 0 J []0 d
319.458 631.647 m
361.458 631.647 l
S
0 0 1 rg
BT
/T1_1 1 Tf
14 0 0 14 319.458 632.9324 Tm
(QUOTE)Tj
0 0 0 rg
/T1_0 1 Tf
(, I'll explain this in greater detail.)Tj
-19.247 -2.7 Td
(In the example, we first make the value of )Tj
/T1_1 1 Tf
(VAR-1)Tj
/T1_0 1 Tf
( be the )Tj
/T1_2 1 Tf
(symbol)Tj
/T1_0 1 Tf
( )Tj
/T1_1 1 Tf
(VAR-2)Tj
/T1_0 1 Tf
(. Checking the )Tj
0 -1.205 TD
(value of )Tj
/T1_1 1 Tf
(VAR-2)Tj
/T1_0 1 Tf
(, we find that it has none. Next, we use )Tj
/T1_1 1 Tf
(SET)Tj
/T1_0 1 Tf
( \(not )Tj
/T1_1 1 Tf
(SETQ)Tj
/T1_0 1 Tf
(\) to assign the )Tj
0 -1.205 TD
(value )Tj
/T1_1 1 Tf
(99)Tj
/T1_0 1 Tf
( to the symbol, )Tj
/T1_1 1 Tf
(VAR-2)Tj
/T1_0 1 Tf
(, which is the )Tj
/T1_2 1 Tf
(value)Tj
/T1_0 1 Tf
( of )Tj
/T1_1 1 Tf
(VAR-1)Tj
/T1_0 1 Tf
(.)Tj
-2.857 -2.562 Td
(The )Tj
/T1_1 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( form can actually take any even number of arguments, which should be al\
ternating symbols )Tj
0 -1.2 TD
(and values:)Tj
ET
q
7 0 0 8 10 472.862793 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 472.8628 Tm
( \(setq month "June" day 8 year 1954\) )Tj
ET
q
10 0 0 7 10 456.0628052 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 456.0628 Tm
( 1954 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 439.2628021 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 439.2628 Tm
( month )Tj
ET
q
10 0 0 7 10 422.4627991 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 422.4628 Tm
( "June" )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 405.662796 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 405.6628 Tm
( day )Tj
ET
q
10 0 0 7 10 388.862793 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 388.8628 Tm
( 8 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 372.0628052 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 372.0628 Tm
( year )Tj
ET
q
10 0 0 7 10 355.2628021 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 355.2628 Tm
( 1954)Tj
-0.714 -2.557 Td
(SETQ)Tj
/T1_0 1 Tf
( performs the assignments from left to right, and returns the rightmost \
value.)Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 281.533 Tm
(LET)Tj
/T1_0 1 Tf
14 0 0 14 10 245.2108 Tm
(The )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form looks a little more complicated than what we've seen so far. The )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form uses nested )Tj
T*
(lists, but because it's a special form, only certain elements get evalua\
ted.)Tj
ET
q
7 0 0 8 10 192.543396 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 192.5434 Tm
( \(let \(\(a 3\) )Tj
-0.5 -1.2 Td
( \(b 4\) )Tj
T*
( \(c 5\)\) )Tj
T*
( \(* \(+ a b\) c\)\) )Tj
ET
q
10 0 0 7 10 125.343399 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 125.3434 Tm
( 35 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 108.543396 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 108.5434 Tm
( a )Tj
ET
q
11 0 0 9 10 91.7433929 cm
/Im2 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 21 91.7434 Tm
( Error: Unbound variable )Tj
-0.786 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 74.9433899 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 74.9434 Tm
( b )Tj
ET
q
11 0 0 9 10 58.1433868 cm
/Im2 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 21 58.1434 Tm
( Error: Unbound variable )Tj
-0.786 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 41.343399 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 41.3434 Tm
( c )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-03.html \(2 of 6\)11/3/2006 5:50:2\
3 PM)Tj
ET
EMC
endstream
endobj
964 0 obj<>
endobj
965 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 3)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
q
11 0 0 9 10 753.9081573 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 21 753.9082 Tm
( Error: Unbound variable)Tj
/T1_0 1 Tf
-0.786 -2.557 Td
(The above )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form defines values for the symbols )Tj
/T1_1 1 Tf
(A)Tj
/T1_0 1 Tf
(, )Tj
/T1_1 1 Tf
(B)Tj
/T1_0 1 Tf
(, and )Tj
/T1_1 1 Tf
(C)Tj
/T1_0 1 Tf
(, then uses these as variables in an )Tj
0 -1.205 TD
(arithmetic calculation. The calculation's result is also the result of t\
he )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form. Note that none of the )Tj
0 -1.205 TD
(variables defined in the )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( have a value after Lisp has finished evaluating the form.)Tj
0 -2.562 TD
(In general, )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( looks like this:)Tj
/T1_1 1 Tf
0 -2.562 TD
(\(let \()Tj
/T1_2 1 Tf
(bindings)Tj
/T1_1 1 Tf
(\) )Tj
/T1_2 1 Tf
(forms)Tj
/T1_1 1 Tf
(\))Tj
/T1_0 1 Tf
0 -2.552 TD
(where )Tj
/T1_3 1 Tf
(bindings)Tj
/T1_0 1 Tf
( is any number of two-element lists -- each list containing a symbol and\
a value -- and )Tj
/T1_3 1 Tf
0 -1.2 TD
(forms)Tj
/T1_0 1 Tf
( is any number of Lisp forms. The forms are evaluated, in order, using t\
he values established by )Tj
0 -1.205 TD
(the bindings. )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( returns the value\(s\) returned by the last form.)Tj
0 -2.562 TD
(Indentation doesn't affect the operation of )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
(, but proper indentation does improve readability. )Tj
0 -1.2 TD
(Consider these equivalent forms:)Tj
/T1_1 1 Tf
0 -2.562 TD
(\(let \(\(p 52.8\))Tj
0 -1.2 TD
( \(q 35.9\))Tj
T*
( \(r \(f 12.07\)\)\))Tj
T*
( \(g 18.3\))Tj
T*
( \(f p\) )Tj
T*
( \(f q\) )Tj
T*
( \(g r t\)\))Tj
0 -2.4 TD
(\(let \(\(p 52.8\) \(q 35.9\) \(r \(f 12.07\)\)\) \(g 18.3\) \(f p\) \(f\
q\) \(g r t\)\))Tj
/T1_0 1 Tf
0 -2.552 TD
(In the first case, indentation makes clear which are the bindings and wh\
ich are the forms. Even if the )Tj
0 -1.205 TD
(reader doesn't know about the different roles played by the two parts of\
the )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form, the indentation )Tj
0 -1.2 TD
(suggests a difference.)Tj
0 -2.557 TD
(In the second case, you'll have to count parentheses to know where the b\
indings end and the forms )Tj
0 -1.2 TD
(begin. Even worse, the absence of indentation destroys visual cues about\
the different roles played by )Tj
0 -1.205 TD
(the two parts of the )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form.)Tj
0 -2.562 TD
(If you define a variable using )Tj
/T1_1 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( and then name the same variable in a )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form, the value defined )Tj
0 -1.205 TD
(by )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( supersedes the other value during evaluation of the )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
(:)Tj
ET
q
7 0 0 8 10 92.8342133 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 92.8342 Tm
( \(setq a 89\) )Tj
ET
q
10 0 0 7 10 76.0342102 cm
/Im2 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 76.0342 Tm
( 89 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 59.2342072 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 59.2342 Tm
( a )Tj
ET
q
10 0 0 7 10 42.4342194 cm
/Im2 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 42.4342 Tm
( 89 )Tj
-0.714 -0.336 Td
( )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-03.html \(3 of 6\)11/3/2006 5:50:2\
3 PM)Tj
ET
EMC
endstream
endobj
966 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 3)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
q
7 0 0 8 10 753.9081573 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 753.9082 Tm
( \(let \(\(a 3\)\) )Tj
-0.5 -1.2 Td
( \(+ a 2\)\) )Tj
ET
q
10 0 0 7 10 720.3081665 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 720.3082 Tm
( 5 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 703.5081635 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 703.5082 Tm
( a )Tj
ET
q
10 0 0 7 10 686.7081604 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 686.7082 Tm
( 89)Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(Unlike )Tj
/T1_1 1 Tf
(SETQ)Tj
/T1_0 1 Tf
(, which assigns values in left-to-right order, )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( binds variables all at the same time:)Tj
ET
q
7 0 0 8 10 615.0407715 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 615.0408 Tm
( \(setq w 77\) )Tj
ET
q
10 0 0 7 10 598.2407684 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 598.2408 Tm
( 77 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 581.4407654 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 581.4408 Tm
( \(let \(\(w 8\) )Tj
-0.5 -1.2 Td
( \(x w\)\) )Tj
0 -1.2 TD
( \(+ w x\)\) )Tj
ET
q
10 0 0 7 10 531.0407715 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 531.0408 Tm
( 85)Tj
-0.714 -2.557 Td
(LET)Tj
/T1_0 1 Tf
( bound )Tj
/T1_1 1 Tf
(W)Tj
/T1_0 1 Tf
( to )Tj
/T1_1 1 Tf
(8)Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
(X)Tj
/T1_0 1 Tf
( to )Tj
/T1_1 1 Tf
(W)Tj
/T1_0 1 Tf
(. Because these bindings happened at the same time, )Tj
/T1_1 1 Tf
(W)Tj
/T1_0 1 Tf
( still had its value of )Tj
/T1_1 1 Tf
0 -1.205 TD
(77)Tj
/T1_0 1 Tf
(.)Tj
2.857 -2.562 Td
(Lisp has a variation of )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
(, called )Tj
/T1_1 1 Tf
(LET*)Tj
/T1_0 1 Tf
(, that )Tj
/T1_2 1 Tf
(does)Tj
/T1_0 1 Tf
( perform bindings in order: )Tj
ET
q
7 0 0 8 50 406.6385803 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 57 406.6386 Tm
( \(setq u 37\) )Tj
ET
q
10 0 0 7 50 389.8385773 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 60 389.8386 Tm
( 37 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 50 373.0385742 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 57 373.0386 Tm
( \(let* \(\(v 4\) )Tj
-0.5 -1.2 Td
( \(u v\)\) )Tj
0 -1.2 TD
( \(+ u v\)\) )Tj
ET
q
10 0 0 7 50 322.6385803 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 60 322.6386 Tm
( 8)Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 284.7762 Tm
(COND)Tj
/T1_0 1 Tf
14 0 0 14 10 248.454 Tm
(The )Tj
/T1_1 1 Tf
(COND)Tj
/T1_0 1 Tf
( macro lets you evaluate Lisp forms conditionally. Like )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
(, )Tj
/T1_1 1 Tf
(COND)Tj
/T1_0 1 Tf
( uses parentheses to )Tj
T*
(delimit different parts of the form. Consider these examples:)Tj
ET
q
7 0 0 8 10 195.7865753 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 195.7866 Tm
( \(let \(\(a 1\) )Tj
-0.5 -1.2 Td
( \(b 2\) )Tj
T*
( \(c 1\) )Tj
T*
( \(d 1\)\) )Tj
T*
( \(cond \(\(eql a b\) 1\) )Tj
T*
( \(\(eql a c\) "First form" 2\) )Tj
T*
( \(\(eql a d\) 3\)\)\) )Tj
ET
q
10 0 0 7 10 78.1865692 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 78.1866 Tm
( 2)Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(In the above )Tj
/T1_1 1 Tf
(COND)Tj
/T1_0 1 Tf
( form we defined three clauses. Each clause is a list beginning with a t\
est form and )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-03.html \(4 of 6\)11/3/2006 5:50:2\
3 PM)Tj
ET
EMC
endstream
endobj
967 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 3)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9756 Tm
(followed by as many body forms as desired. The body forms are simply cod\
e that you want to execute if )Tj
0 -1.2 TD
(the test succeeds. The clauses are selected in order -- as soon as one t\
est succeeds, the corresponding )Tj
0 -1.205 TD
(body forms are evaluated and the value of the last body form becomes the\
value of the )Tj
/T1_1 1 Tf
(COND)Tj
/T1_0 1 Tf
( form.)Tj
/T1_1 1 Tf
2.857 -2.562 Td
(COND)Tj
/T1_0 1 Tf
( is more general than the special form, )Tj
/T1_1 1 Tf
(IF)Tj
/T1_0 1 Tf
(, which only allows one test and one form )Tj
0 -1.2 TD
(each for the )Tj
/T1_2 1 Tf
(then)Tj
/T1_0 1 Tf
( and )Tj
/T1_2 1 Tf
(else)Tj
/T1_0 1 Tf
( parts. )Tj
-2.857 -2.562 Td
(Let's look at what happened in the example. )Tj
/T1_1 1 Tf
(EQL)Tj
/T1_0 1 Tf
( returns )Tj
/T1_1 1 Tf
(T)Tj
/T1_0 1 Tf
( if its two arguments are identical, or the same )Tj
T*
(number \(there's a subtle difference that we'll cover in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
310.902 612.857 m
372.726 612.857 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 310.902 614.9734 Tm
(Chapter 17)Tj
0 0 0 rg
(\). Only two of the three tests executed. )Tj
-21.493 -1.348 Td
(The first, )Tj
/T1_1 1 Tf
(\(EQL A B\))Tj
/T1_0 1 Tf
(, returned NIL. Therefore, the rest of that clause \(containing the numb\
er )Tj
/T1_1 1 Tf
(1)Tj
/T1_0 1 Tf
( as its )Tj
0 -1.205 TD
(only form\) was skipped. The second clause tested )Tj
/T1_1 1 Tf
(\(EQL A C\))Tj
/T1_0 1 Tf
(, which was true. Because this test )Tj
0 -1.205 TD
(returned a non-)Tj
/T1_1 1 Tf
(NIL)Tj
/T1_0 1 Tf
( value, the remainder of the clause \(the two atomic forms, )Tj
/T1_1 1 Tf
("First form")Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
(2)Tj
/T1_0 1 Tf
(\) )Tj
0 -1.205 TD
(was evaluated, and the value of the last form was returned as the value \
of the )Tj
/T1_1 1 Tf
(COND)Tj
/T1_0 1 Tf
(, which was then )Tj
0 -1.205 TD
(returned as the value of the enclosing )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
(. The third clause was never tested, since an earlier clause had )Tj
0 -1.2 TD
(already been chosen -- clauses are tested in order.)Tj
0 -2.562 TD
(Conventional use of )Tj
/T1_1 1 Tf
(COND)Tj
/T1_0 1 Tf
( uses )Tj
/T1_1 1 Tf
(T)Tj
/T1_0 1 Tf
( as the test form in the final clause. This guarantees that the body )Tj
0 -1.2 TD
(forms of the final clause get evaluated if the tests fail in all of the \
other clauses. You can use the last )Tj
T*
(clause to return a default value or perform some appropriate operation. \
Here's an example:)Tj
ET
q
7 0 0 8 10 406.5016022 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 406.5016 Tm
( \(let \(\(a 32\)\) )Tj
-0.5 -1.2 Td
( \(cond \(\(eql a 13\) "An unlucky number"\) )Tj
T*
( \(\(eql a 99\) "A lucky number"\) )Tj
T*
( \(t "Nothing special about this number"\)\)\) )Tj
ET
q
10 0 0 7 10 339.3016052 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 339.3016 Tm
( "Nothing special about this number")Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 301.4392 Tm
(QUOTE)Tj
/T1_0 1 Tf
14 0 0 14 10 265.1844 Tm
(Sometimes we'd like to suppress Lisp's normal evaluation rules. One such\
case is when we'd like a )Tj
T*
(symbol to stand for itself, rather than its value, when it appears as an\
argument of a function call:)Tj
ET
q
7 0 0 8 10 212.5169983 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 212.517 Tm
( \(setq a 97\) )Tj
ET
q
10 0 0 7 10 195.7169952 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 195.717 Tm
( 97 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 178.9169922 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 178.917 Tm
( a )Tj
ET
q
10 0 0 7 10 162.1169891 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 162.117 Tm
( 97 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 145.3169861 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 145.317 Tm
( \(setq b 23\) )Tj
ET
q
10 0 0 7 10 128.5169983 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 128.517 Tm
( 23 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 111.7169952 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 111.717 Tm
( \(setq a b\) )Tj
ET
q
10 0 0 7 10 94.9169922 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 94.917 Tm
( 23 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 78.1169891 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 78.117 Tm
( a )Tj
ET
q
10 0 0 7 10 61.3169861 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 61.317 Tm
( 23 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 44.5169983 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 44.517 Tm
( \(setq a \(quote b\)\) )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-03.html \(5 of 6\)11/3/2006 5:50:2\
3 PM)Tj
ET
EMC
endstream
endobj
968 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 3)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
q
10 0 0 7 10 753.9081573 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 753.9082 Tm
( B )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 737.1081543 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 737.1082 Tm
( a )Tj
ET
q
10 0 0 7 10 720.3081665 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 720.3082 Tm
( B)Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(The difference is that )Tj
/T1_1 1 Tf
(B)Tj
/T1_0 1 Tf
('s )Tj
/T1_2 1 Tf
(value)Tj
/T1_0 1 Tf
( is used in )Tj
/T1_1 1 Tf
(\(SETQ A B\))Tj
/T1_0 1 Tf
(, whereas )Tj
/T1_1 1 Tf
(B)Tj
/T1_0 1 Tf
( )Tj
/T1_2 1 Tf
(stands for itself)Tj
/T1_0 1 Tf
( in )Tj
/T1_1 1 Tf
(\(SETQ A )Tj
0 -1.205 TD
(\(QUOTE B\)\))Tj
/T1_0 1 Tf
(.)Tj
0 -2.562 TD
(The )Tj
/T1_1 1 Tf
(QUOTE)Tj
/T1_0 1 Tf
( form is so commonly used that Lisp provides a shorthand notation:)Tj
/T1_1 1 Tf
0 -2.562 TD
(\(QUOTE )Tj
/T1_3 1 Tf
(form)Tj
/T1_1 1 Tf
(\) )Tj
ET
q
6 0 0 5 119.1999969 595.9059753 cm
/Im2 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 125.2 595.906 Tm
( ')Tj
/T1_3 1 Tf
(form)Tj
/T1_0 1 Tf
-8.229 -2.557 Td
(The )Tj
ET
q
6 0 0 5 35.2700043 560.1059723 cm
/Im2 Do
Q
BT
/T1_0 1 Tf
14 0 0 14 41.27 560.106 Tm
( symbol means that the two Lisp forms are equivalent. Lisp arranges the \
equivalence of )Tj
/T1_1 1 Tf
(')Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
-2.234 -1.205 Td
(QUOTE)Tj
/T1_0 1 Tf
( through a reader macro. We'll take a brief look at how you can define y\
our own reader macros in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
10 524.322 m
67.162 524.322 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 10 526.4386 Tm
(Lesson 12)Tj
0 0 0 rg
(.)Tj
ET
0.5 0.5 0.5 rg
10 491.663 m
10 493.663 l
602 493.663 l
601 492.663 l
11 492.663 l
11 492.663 l
h
f
0.875 0.875 0.875 rg
602 493.663 m
602 491.663 l
10 491.663 l
11 492.663 l
601 492.663 l
601 492.663 l
h
f
259.1 470.522 m
308.884 470.522 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 472.6386 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 470.522 m
352.9 470.522 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 472.6386 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
20.589 451.722 m
75.413 451.722 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 20.589 453.8386 Tm
(Chapter 2)Tj
0 0 0 rg
( | )Tj
ET
85.213 451.722 m
216.253 451.722 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 85.213 453.8386 Tm
(Chapter 3, Introduction)Tj
0 0 0 rg
( | )Tj
ET
226.053 451.722 m
338.039 451.722 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 226.053 453.8386 Tm
(Chapter 3, Lesson 2)Tj
0 0 0 rg
( | Chapter 3, Lesson 3 | )Tj
ET
469.625 451.722 m
581.611 451.722 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 469.625 453.8386 Tm
(Chapter 3, Lesson 4)Tj
0 0 0 rg
( | )Tj
ET
278.588 432.922 m
333.412 432.922 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 278.588 435.0386 Tm
(Chapter 4)Tj
0 0 0 rg
( )Tj
ET
0.5 0.5 0.5 rg
10 419.263 m
10 421.263 l
602 421.263 l
601 420.263 l
11 420.263 l
11 420.263 l
h
f
0.875 0.875 0.875 rg
602 421.263 m
602 419.263 l
10 419.263 l
11 420.263 l
601 420.263 l
601 420.263 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 400.2386 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
0 -1.2 TD
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-03.html \(6 of 6\)11/3/2006 5:50:2\
3 PM)Tj
ET
EMC
endstream
endobj
969 0 obj(Successful Lisp - Chapter 3, Lesson 3)
endobj
970 0 obj<>
endobj
971 0 obj(http://psg.com/~dlamkins/sl/chapter03-03.html)
endobj
972 0 obj(y#\\`|0)
endobj
973 0 obj<>
endobj
974 0 obj<>
endobj
975 0 obj(I60EЭ)
endobj
976 0 obj 4
endobj
977 0 obj 4
endobj
978 0 obj 2
endobj
979 0 obj 5
endobj
980 0 obj 5
endobj
981 0 obj 3
endobj
982 0 obj 4
endobj
983 0 obj 6
endobj
984 0 obj 6
endobj
985 0 obj 7
endobj
986 0 obj 7
endobj
987 0 obj 8
endobj
988 0 obj 8
endobj
989 0 obj 9
endobj
990 0 obj 9
endobj
991 0 obj 1
endobj
992 0 obj<>
endobj
993 0 obj<>
endobj
994 0 obj<><>]/P 9 0 R/S/Article/T()/Pg 995 0 R>>
endobj
995 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
996 0 obj[994 0 R]
endobj
997 0 obj[995 0 R/XYZ 0 698.277 null]
endobj
998 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
999 0 obj[994 0 R]
endobj
1000 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1001 0 obj[1000 0 R 1002 0 R]
endobj
1002 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1003 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
1004 0 obj<>
endobj
1005 0 obj[994 0 R]
endobj
1006 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1007 0 obj[1006 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R]
endobj
1008 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1009 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1010 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1011 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1012 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1013 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1014 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 4)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Lesson 4 - Putting things together, and taking them apart)Tj
16.1538 0 0 16.1538 10 641.8611 Tm
(CONS)Tj
/T1_2 1 Tf
14 0 0 14 10 605.5389 Tm
(CONS)Tj
/T1_0 1 Tf
( is the most basic )Tj
/T1_3 1 Tf
(cons)Tj
/T1_0 1 Tf
(tructor of lists. It is a function, so it evaluates both of its argument\
s. The )Tj
0 -1.205 TD
(second argument must be a list or )Tj
/T1_2 1 Tf
(NIL)Tj
/T1_0 1 Tf
(.)Tj
ET
q
7 0 0 8 10 552.8041382 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 552.8041 Tm
( \(cons 1 nil\) )Tj
ET
q
10 0 0 7 10 536.0041351 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 536.0041 Tm
( \(1\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 519.2041473 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 519.2041 Tm
( \(cons 2 \(cons 1 nil\)\) )Tj
ET
q
10 0 0 7 10 502.4041443 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 502.4041 Tm
( \(2 1\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 485.6041412 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 485.6041 Tm
( \(cons 3 \(cons 2 \(cons 1 nil\)\)\) )Tj
ET
q
10 0 0 7 10 468.8041382 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 468.8041 Tm
( \(3 2 1\))Tj
-0.714 -2.557 Td
(CONS)Tj
/T1_0 1 Tf
( adds a new item to the beginning of a list. The empty list is equivalen\
t to )Tj
/T1_2 1 Tf
(NIL)Tj
/T1_0 1 Tf
(,)Tj
/T1_2 1 Tf
0 -2.562 TD
(\(\) )Tj
ET
q
6 0 0 5 35.1999969 397.1367493 cm
/Im2 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 41.2 397.1367 Tm
( NIL)Tj
/T1_0 1 Tf
-2.229 -2.552 Td
(so we could also have written:)Tj
ET
q
7 0 0 8 10 325.5367432 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 325.5367 Tm
( \(cons 1 \(\)\) )Tj
ET
q
10 0 0 7 10 308.7367401 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 308.7367 Tm
( \(1\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 291.9367523 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 291.9368 Tm
( \(cons 2 \(cons 1 \(\)\)\) )Tj
ET
q
10 0 0 7 10 275.1367493 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 275.1367 Tm
( \(2 1\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 258.3367462 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 258.3367 Tm
( \(cons 3 \(cons 2 \(cons 1 \(\)\)\)\) )Tj
ET
q
10 0 0 7 10 241.5367432 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 241.5367 Tm
( \(3 2 1\))Tj
/T1_0 1 Tf
2.143 -2.557 Td
(In case you're wondering, yes, there's something special about )Tj
/T1_2 1 Tf
(NIL)Tj
/T1_0 1 Tf
(. )Tj
/T1_2 1 Tf
(NIL)Tj
/T1_0 1 Tf
( is one of two )Tj
0 -1.205 TD
(symbols in Lisp that isn't a keyword but still has itself as its constan\
t value. )Tj
/T1_2 1 Tf
(T)Tj
/T1_0 1 Tf
( is the other )Tj
0 -1.2 TD
(symbol that works like this.)Tj
0 -2.562 TD
(The fact that )Tj
/T1_2 1 Tf
(NIL)Tj
/T1_0 1 Tf
( evaluates to itself, combined with )Tj
/T1_2 1 Tf
(\(\))Tj
/T1_0 1 Tf
( )Tj
ET
q
6 0 0 5 365.3500061 136.2019501 cm
/Im2 Do
Q
BT
/T1_0 1 Tf
14 0 0 14 371.35 136.202 Tm
( )Tj
/T1_2 1 Tf
(NIL)Tj
/T1_0 1 Tf
(, means that you can write )Tj
/T1_2 1 Tf
-22.954 -1.205 Td
(\(\))Tj
/T1_0 1 Tf
( rather than )Tj
/T1_2 1 Tf
(\(QUOTE \(\)\))Tj
/T1_0 1 Tf
(. Otherwise, Lisp would have to make an exception to its )Tj
0 -1.2 TD
(evaluation rule to handle the empty list.)Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 64.6047 Tm
(LIST)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-04.html \(1 of 3\)11/3/2006 5:51:0\
2 PM)Tj
ET
EMC
endstream
endobj
1015 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 4)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9082 Tm
(As you may have noticed, building a list out of nested )Tj
/T1_1 1 Tf
(CONS)Tj
/T1_0 1 Tf
( forms can be a bit tedious. The )Tj
/T1_1 1 Tf
(LIST)Tj
/T1_0 1 Tf
( form )Tj
0 -1.2 TD
(does the same thing in a more perspicuous manner:)Tj
ET
q
7 0 0 8 10 701.2407684 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 701.2408 Tm
( \(list 1 2 3\) )Tj
ET
q
10 0 0 7 10 684.4407654 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 684.4408 Tm
( \(1 2 3\))Tj
-0.714 -2.557 Td
(LIST)Tj
/T1_0 1 Tf
( can take any number of arguments. Because )Tj
/T1_1 1 Tf
(LIST)Tj
/T1_0 1 Tf
( is a function, it evaluates its arguments:)Tj
ET
q
7 0 0 8 10 612.7733765 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 612.7734 Tm
( \(list 1 2 :hello "there" 3\) )Tj
ET
q
10 0 0 7 10 595.9733734 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 595.9734 Tm
( \(1 2 :HELLO "there" 3\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 579.1733704 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 579.1734 Tm
( \(let \(\(a :this\) )Tj
-0.5 -1.2 Td
( \(b :and\) )Tj
T*
( \(c :that\)\) )Tj
T*
( \(list a 1 b c 2\)\) )Tj
ET
q
10 0 0 7 10 511.9733734 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 511.9734 Tm
( \(:THIS 1 :AND :THAT 2\))Tj
/T1_2 1 Tf
16.1538 0 0 16.1538 10 474.1109 Tm
(FIRST and REST)Tj
/T1_0 1 Tf
14 0 0 14 10 437.8562 Tm
(If you think of a list as being made up of two parts -- the first elemen\
t and everything else -- then you )Tj
0 -1.205 TD
(can retrieve any individual element of a list using the two operations, \
)Tj
/T1_1 1 Tf
(FIRST)Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
(REST)Tj
/T1_0 1 Tf
(.)Tj
ET
q
7 0 0 8 10 385.1213684 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 385.1214 Tm
( \(setq my-list \(quote \(1 2 3 4 5\)\)\) )Tj
ET
q
10 0 0 7 10 368.3213654 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 368.3214 Tm
( \(1 2 3 4 5\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 351.5213623 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 351.5214 Tm
( \(first my-list\) )Tj
ET
q
10 0 0 7 10 334.7213593 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 334.7214 Tm
( 1 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 317.9213562 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 317.9214 Tm
( \(rest my-list\) )Tj
ET
q
10 0 0 7 10 301.1213684 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 301.1214 Tm
( \(2 3 4 5\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 284.3213654 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 284.3214 Tm
( \(first \(rest my-list\)\) )Tj
ET
q
10 0 0 7 10 267.5213623 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 267.5214 Tm
( 2 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 250.7213593 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 250.7214 Tm
( \(rest \(rest my-list\)\) )Tj
ET
q
10 0 0 7 10 233.9213562 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 233.9214 Tm
( \(3 4 5\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 217.1213684 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 217.1214 Tm
( \(first \(rest \(rest my-list\)\)\) )Tj
ET
q
10 0 0 7 10 200.3213654 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 200.3214 Tm
( 3 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 183.5213623 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 183.5214 Tm
( \(rest \(rest \(rest my-list\)\)\) )Tj
ET
q
10 0 0 7 10 166.7213593 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 166.7214 Tm
( \(4 5\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 149.9213562 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 149.9214 Tm
( \(first \(rest \(rest \(rest my-list\)\)\)\) )Tj
ET
q
10 0 0 7 10 133.1213684 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 133.1214 Tm
( 4)Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(Clearly, chaining together )Tj
/T1_1 1 Tf
(FIRST)Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
(REST)Tj
/T1_0 1 Tf
( functions could become tedious. Also, the approach can't )Tj
0 -1.2 TD
(work when you need to select a particular element when the program runs,\
or when the list is of )Tj
T*
(indeterminate length. We'll look at how to solve these problems in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
385.046 61.605 m
439.87 61.605 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 385.046 63.7214 Tm
(Chapter 4)Tj
0 0 0 rg
( by defining recursive )Tj
-26.789 -1.343 Td
(functions. Later, in )Tj
ET
120.04 42.805 m
181.864 42.805 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 120.04 44.9214 Tm
(Chapter 13)Tj
0 0 0 rg
(, we'll see the functions that Lisp provides to perform selection on the\
)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-04.html \(2 of 3\)11/3/2006 5:51:0\
2 PM)Tj
ET
EMC
endstream
endobj
1016 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 4)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9756 Tm
(elements of lists and other sequences.)Tj
/T1_1 1 Tf
2.857 -2.562 Td
(FIRST)Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
(REST)Tj
/T1_0 1 Tf
( are fairly recent additions to Lisp, renaming the equivalent functions \
)Tj
/T1_1 1 Tf
0 -1.205 TD
(CAR)Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
(CDR)Tj
/T1_0 1 Tf
(, respectively. )Tj
/T1_1 1 Tf
(CAR)Tj
/T1_0 1 Tf
( and )Tj
/T1_1 1 Tf
(CDR)Tj
/T1_0 1 Tf
( got their names from an implementation detail )Tj
0 -1.2 TD
(of one of the earliest Lisp implementations, and the names persisted for\
decades despite )Tj
T*
(the fact that the underlying implementation had long since changed. )Tj
ET
0.5 0.5 0.5 rg
10 634.865 m
10 636.865 l
602 636.865 l
601 635.865 l
11 635.865 l
11 635.865 l
h
f
0.875 0.875 0.875 rg
602 636.865 m
602 634.865 l
10 634.865 l
11 635.865 l
601 635.865 l
601 635.865 l
h
f
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
259.1 613.724 m
308.884 613.724 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 615.8408 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 613.724 m
352.9 613.724 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 615.8408 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
22.339 594.924 m
77.163 594.924 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 22.339 597.0408 Tm
(Chapter 2)Tj
0 0 0 rg
( | )Tj
ET
86.963 594.924 m
218.003 594.924 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 86.963 597.0408 Tm
(Chapter 3, Introduction)Tj
0 0 0 rg
( |)Tj
ET
224.303 594.924 m
336.289 594.924 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 224.303 597.0408 Tm
(Chapter 3, Lesson 3)Tj
0 0 0 rg
( | Chapter 3, Lesson 4 | )Tj
ET
467.875 594.924 m
579.861 594.924 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 467.875 597.0408 Tm
(Chapter 3, Lesson 5)Tj
0 0 0 rg
( | )Tj
ET
275.438 576.124 m
330.262 576.124 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 275.438 578.2408 Tm
(Chapter 4)Tj
0 0 0 rg
( | )Tj
ET
0.5 0.5 0.5 rg
10 562.465 m
10 564.465 l
602 564.465 l
601 563.465 l
11 563.465 l
11 563.465 l
h
f
0.875 0.875 0.875 rg
602 564.465 m
602 562.465 l
10 562.465 l
11 563.465 l
601 563.465 l
601 563.465 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 543.4408 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
T*
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-04.html \(3 of 3\)11/3/2006 5:51:0\
2 PM)Tj
ET
EMC
endstream
endobj
1017 0 obj(Successful Lisp - Chapter 3, Lesson 4)
endobj
1018 0 obj<>
endobj
1019 0 obj(http://psg.com/~dlamkins/sl/chapter03-04.html)
endobj
1020 0 obj(T}u.o)
endobj
1021 0 obj<>
endobj
1022 0 obj<>
endobj
1023 0 obj(]^V'!)
endobj
1024 0 obj 10
endobj
1025 0 obj 10
endobj
1026 0 obj 2
endobj
1027 0 obj 11
endobj
1028 0 obj 11
endobj
1029 0 obj<>
endobj
1030 0 obj<>
endobj
1031 0 obj<><>]/P 9 0 R/S/Article/T()/Pg 1032 0 R>>
endobj
1032 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1033 0 obj[1031 0 R]
endobj
1034 0 obj[1032 0 R/XYZ 0 698.277 null]
endobj
1035 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1036 0 obj[1031 0 R]
endobj
1037 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1038 0 obj[1037 0 R 1039 0 R 1040 0 R]
endobj
1039 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1040 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1041 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1042 0 obj[1031 0 R]
endobj
1043 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1044 0 obj[1043 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R]
endobj
1045 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1046 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1047 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1048 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1049 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1050 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1051 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 5)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Lesson 5 - Naming and Identity)Tj
16.1538 0 0 16.1538 10 641.8611 Tm
(A symbol is just a name)Tj
/T1_0 1 Tf
14 0 0 14 10 605.6063 Tm
(A symbol is just a name. It can stand for itself. This makes it easy to \
write certain kinds of programs in )Tj
0 -1.2 TD
(Lisp. For example, if you want your program to represent relationships i\
n your family tree, you can )Tj
T*
(make a database that keeps relationships like this:)Tj
/T1_2 1 Tf
0 -2.562 TD
(\(father John Barry\))Tj
0 -1.2 TD
(\(son John Harold\))Tj
T*
(\(father John Susan\))Tj
T*
(\(mother Edith Barry\))Tj
T*
(\(mother Edith Susan\))Tj
T*
(...)Tj
/T1_0 1 Tf
0 -2.557 TD
(Each relationship is a list. )Tj
/T1_2 1 Tf
(\(father John Barry\))Tj
/T1_0 1 Tf
( means that John is Barry's father. Every element )Tj
0 -1.2 TD
(of every list in our database is a symbol. Your Lisp program can compare\
symbols in this database to )Tj
T*
(determine, for example, that Harold is Barry's grandfather. If you tried\
to write a program like this in )Tj
T*
(another language -- a language without symbols -- you'd have to decide h\
ow to represent the names of )Tj
T*
(family members and relationships, and then create code to perform all th\
e needed operations -- reading, )Tj
T*
(printing, comparison, assignment, etc. This is all built into Lisp, beca\
use symbols are a data type distinct )Tj
T*
(from the objects they might be used to name.)Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 277.6091 Tm
(A symbol is always unique)Tj
/T1_0 1 Tf
14 0 0 14 10 241.3543 Tm
(Every time your program uses a symbol, that symbol is )Tj
/T1_3 1 Tf
(identical)Tj
/T1_0 1 Tf
( to every other symbol with the same )Tj
0 -1.205 TD
(name. You can use the )Tj
/T1_2 1 Tf
(EQ)Tj
/T1_0 1 Tf
( test to compare symbols:)Tj
ET
q
7 0 0 8 10 188.6195221 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 188.6195 Tm
( \(eq 'a 'a\) )Tj
ET
q
10 0 0 7 10 171.819519 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 171.8195 Tm
( T )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 155.0195313 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 155.0195 Tm
( \(eq 'david 'a\) )Tj
ET
q
10 0 0 7 10 138.2195282 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 138.2195 Tm
( NIL )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 121.4195251 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 121.4195 Tm
( \(eq 'David 'DAVID\) )Tj
ET
q
10 0 0 7 10 104.6195221 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 104.6195 Tm
( T )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 87.819519 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 87.8195 Tm
( \(setq zzz 'sleeper\) )Tj
ET
q
10 0 0 7 10 71.0195312 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 71.0195 Tm
( SLEEPER )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 54.2195282 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 54.2195 Tm
( \(eq zzz 'sleeper\) )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-05.html \(1 of 3\)11/3/2006 5:51:2\
7 PM)Tj
ET
EMC
endstream
endobj
1052 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 5)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
q
10 0 0 7 10 753.9081573 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 753.9082 Tm
( T)Tj
/T1_0 1 Tf
-0.714 -2.552 Td
(Notice that it doesn't matter whether you use uppercase or lowercase let\
ters in your symbol names. )Tj
0 -1.2 TD
(Internally, Lisp translates every alphabetic character in a symbol name \
to a common case -- usually )Tj
T*
(upper, but you can control this by setting a flag in the Lisp reader.)Tj
2.857 -2.557 Td
(When you learn about packages in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
246.728 646.659 m
303.89 646.659 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 246.728 648.7756 Tm
(Lesson 10)Tj
0 0 0 rg
( \(also see )Tj
ET
359.484 646.659 m
421.308 646.659 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 359.484 648.7756 Tm
(Chapter 31)Tj
0 0 0 rg
(\), you can create )Tj
-22.106 -1.343 Td
(symbol names that are not identical given the same spelling. For now, al\
l you need to )Tj
0 -1.205 TD
(know is that any symbol spelled with a )Tj
/T1_1 1 Tf
(:)Tj
/T1_0 1 Tf
( gets special treatment. )Tj
/T1_2 1 Tf
16.1538 0 0 16.1538 10 575.1783 Tm
(A symbol can name a value)Tj
/T1_0 1 Tf
14 0 0 14 10 538.9235 Tm
(Although the ability for a Lisp symbol to stand for itself is sometimes \
useful, a more common use is for )Tj
0 -1.2 TD
(the symbol to name a value. This is the role played by variable and func\
tion names in other )Tj
T*
(programming languages. A Lisp symbol most commonly names a value or -- w\
hen used as the first )Tj
T*
(element of a function call form -- a function.)Tj
0 -2.557 TD
(What's unusual about Lisp is that a symbol can have a value as a functio\
n and a variable at the same )Tj
0 -1.2 TD
(time:)Tj
ET
q
7 0 0 8 10 400.0561523 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 400.0562 Tm
( \(setq first 'number-one\) )Tj
ET
q
10 0 0 7 10 383.2561493 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 383.2561 Tm
( NUMBER-ONE )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 366.4561462 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 366.4561 Tm
( \(first \(list 3 2 1\)\) )Tj
ET
q
10 0 0 7 10 349.6561432 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 349.6561 Tm
( 3 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 332.8561554 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 332.8562 Tm
( first )Tj
ET
q
10 0 0 7 10 316.0561523 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 316.0562 Tm
( NUMBER-ONE)Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(Note how )Tj
/T1_1 1 Tf
(FIRST)Tj
/T1_0 1 Tf
( is used as a variable in the first and last case, and as a function \(p\
redefined by Lisp, in )Tj
T*
(this example\) in the second case. Lisp decides which of these values to\
use based on where the symbol )Tj
T*
(appears. When the evaluation rule requires a value, Lisp looks for the v\
ariable value of the symbol. )Tj
T*
(When a function is called for, Lisp looks for the symbol's function.)Tj
0 -2.557 TD
(A symbol can have other values besides those it has as a variable or fun\
ction. A symbol can also have )Tj
0 -1.2 TD
(values for its documentation, property list, and print name. A symbol's \
documentation is text that you )Tj
0 -1.205 TD
(create to describe a symbol. You can create this using the )Tj
/T1_1 1 Tf
(DOCUMENTATION)Tj
/T1_0 1 Tf
( form or as part of certain )Tj
0 -1.2 TD
(forms which define a symbol's value. Because a symbol can have multiple \
meanings, you can assign )Tj
T*
(documentation to each of several meanings, for example as a function and\
as a variable.)Tj
0 -2.557 TD
(A property list is like a small database with a single key per entry. We\
'll look at this use of symbols in )Tj
ET
10 72.072 m
67.162 72.072 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 10 74.1888 Tm
(Lesson 10)Tj
0 0 0 rg
(.)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-05.html \(2 of 3\)11/3/2006 5:51:2\
7 PM)Tj
ET
EMC
endstream
endobj
1053 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 5)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9756 Tm
(The print name is what Lisp uses to print the symbol. You normally don't\
want to change this; if you do, )Tj
0 -1.2 TD
(Lisp will print the symbol with a different name than it originally used\
to read the symbol, which will )Tj
T*
(create a different symbol when later read by Lisp.)Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 682.4457 Tm
(A value can have more than one name)Tj
/T1_0 1 Tf
14 0 0 14 10 646.1909 Tm
(A value can have more than one name. That is, more than one symbol can s\
hare a value. Other )Tj
T*
(languages have pointers that work this way. Lisp does not expose pointer\
s to the programmer, but does )Tj
0 -1.205 TD
(have shared objects. An object is considered identical when it passes th\
e )Tj
/T1_2 1 Tf
(EQ)Tj
/T1_0 1 Tf
( test. Consider the following:)Tj
ET
q
7 0 0 8 10 576.6561432 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 576.6561 Tm
( \(setq L1 \(list 'a 'b 'c\)\) )Tj
ET
q
10 0 0 7 10 559.8561554 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 559.8562 Tm
( \(A B C\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 543.0561523 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 543.0562 Tm
( \(setq L2 L1\) )Tj
ET
q
10 0 0 7 10 526.2561493 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 526.2561 Tm
( \(A B C\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 509.4561462 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 509.4561 Tm
( \(eq L1 L2\) )Tj
ET
q
10 0 0 7 10 492.6561432 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 492.6561 Tm
( T )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 475.8561554 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 475.8562 Tm
( \(setq L3 \(list 'a 'b 'c\)\) )Tj
ET
q
10 0 0 7 10 459.0561523 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 459.0562 Tm
( \(A B C\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 442.2561493 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 442.2561 Tm
( \(eq L3 L1\) )Tj
ET
q
10 0 0 7 10 425.4561462 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 425.4561 Tm
( NIL)Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(Here, )Tj
/T1_2 1 Tf
(L1)Tj
/T1_0 1 Tf
( is )Tj
/T1_2 1 Tf
(EQ)Tj
/T1_0 1 Tf
( to )Tj
/T1_2 1 Tf
(L2)Tj
/T1_0 1 Tf
( because )Tj
/T1_2 1 Tf
(L1)Tj
/T1_0 1 Tf
( names the )Tj
/T1_3 1 Tf
(same value)Tj
/T1_0 1 Tf
( as )Tj
/T1_2 1 Tf
(L2)Tj
/T1_0 1 Tf
(. In other words, the value created by the )Tj
/T1_2 1 Tf
0 -1.205 TD
(\(LIST 'A 'B 'C\))Tj
/T1_0 1 Tf
( form has two names, )Tj
/T1_2 1 Tf
(L1)Tj
/T1_0 1 Tf
( and )Tj
/T1_2 1 Tf
(L2)Tj
/T1_0 1 Tf
(. The )Tj
/T1_2 1 Tf
(\(SETQ L2 L1\))Tj
/T1_0 1 Tf
( form says, "Make the )Tj
0 -1.205 TD
(value of )Tj
/T1_2 1 Tf
(L2)Tj
/T1_0 1 Tf
( be the value of )Tj
/T1_2 1 Tf
(L1)Tj
/T1_0 1 Tf
(." Not a copy of the the value, but the value. So )Tj
/T1_2 1 Tf
(L1)Tj
/T1_0 1 Tf
( and )Tj
/T1_2 1 Tf
(L2)Tj
/T1_0 1 Tf
( )Tj
/T1_3 1 Tf
(share)Tj
/T1_0 1 Tf
( the )Tj
T*
(same value -- the list )Tj
/T1_2 1 Tf
(\(A B C\))Tj
/T1_0 1 Tf
( which was first assigned as the value of )Tj
/T1_2 1 Tf
(L1)Tj
/T1_0 1 Tf
(.)Tj
/T1_2 1 Tf
0 -2.562 TD
(L3)Tj
/T1_0 1 Tf
( also has a list )Tj
/T1_2 1 Tf
(\(A B C\))Tj
/T1_0 1 Tf
( as its value, but it is a )Tj
/T1_3 1 Tf
(different)Tj
/T1_0 1 Tf
( list than the one shared by )Tj
/T1_2 1 Tf
(L1)Tj
/T1_0 1 Tf
( and )Tj
/T1_2 1 Tf
(L2)Tj
/T1_0 1 Tf
(. Even )Tj
0 -1.205 TD
(though the value of )Tj
/T1_2 1 Tf
(L3)Tj
/T1_0 1 Tf
( )Tj
/T1_3 1 Tf
(looks)Tj
/T1_0 1 Tf
( the same as the value of )Tj
/T1_2 1 Tf
(L1)Tj
/T1_0 1 Tf
( and )Tj
/T1_2 1 Tf
(L2)Tj
/T1_0 1 Tf
(, it is a different list because it was )Tj
0 -1.205 TD
(created by a different )Tj
/T1_2 1 Tf
(LIST)Tj
/T1_0 1 Tf
( form. So )Tj
/T1_2 1 Tf
(\(EQ L3 L1\))Tj
ET
q
10 0 0 7 306.4360046 269.4517822 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 316.436 269.4518 Tm
(NIL)Tj
/T1_0 1 Tf
( because their values are different lists, each )Tj
-21.888 -1.205 Td
(made of the symbols )Tj
/T1_2 1 Tf
(A)Tj
/T1_0 1 Tf
(, )Tj
/T1_2 1 Tf
(B)Tj
/T1_0 1 Tf
(, and )Tj
/T1_2 1 Tf
(C)Tj
/T1_0 1 Tf
(.)Tj
ET
0.5 0.5 0.5 rg
10 219.809 m
10 221.809 l
602 221.809 l
601 220.809 l
11 220.809 l
11 220.809 l
h
f
0.875 0.875 0.875 rg
602 221.809 m
602 219.809 l
10 219.809 l
11 220.809 l
601 220.809 l
601 220.809 l
h
f
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
259.1 198.668 m
308.884 198.668 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 200.7844 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 198.668 m
352.9 198.668 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 200.7844 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
20.589 179.868 m
75.413 179.868 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 20.589 181.9844 Tm
(Chapter 2)Tj
0 0 0 rg
( | )Tj
ET
85.213 179.868 m
216.253 179.868 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 85.213 181.9844 Tm
(Chapter 3, Introduction)Tj
0 0 0 rg
( | )Tj
ET
226.053 179.868 m
338.039 179.868 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 226.053 181.9844 Tm
(Chapter 3, Lesson 4)Tj
0 0 0 rg
( | Chapter 3, Lesson 5 | )Tj
ET
469.625 179.868 m
581.611 179.868 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 469.625 181.9844 Tm
(Chapter 3, Lesson 6)Tj
0 0 0 rg
( | )Tj
ET
275.438 161.068 m
330.262 161.068 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 275.438 163.1844 Tm
(Chapter 4)Tj
0 0 0 rg
( | )Tj
ET
0.5 0.5 0.5 rg
10 147.409 m
10 149.409 l
602 149.409 l
601 148.409 l
11 148.409 l
11 148.409 l
h
f
0.875 0.875 0.875 rg
602 149.409 m
602 147.409 l
10 147.409 l
11 148.409 l
601 148.409 l
601 148.409 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 128.3844 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
0 -1.2 TD
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-05.html \(3 of 3\)11/3/2006 5:51:2\
7 PM)Tj
ET
EMC
endstream
endobj
1054 0 obj(Successful Lisp - Chapter 3, Lesson 5)
endobj
1055 0 obj<>
endobj
1056 0 obj(http://psg.com/~dlamkins/sl/chapter03-05.html)
endobj
1057 0 obj(H2GJηz)
endobj
1058 0 obj<>
endobj
1059 0 obj<>
endobj
1060 0 obj(\n:X7A)
endobj
1061 0 obj 12
endobj
1062 0 obj 12
endobj
1063 0 obj 13
endobj
1064 0 obj 13
endobj
1065 0 obj 14
endobj
1066 0 obj 14
endobj
1067 0 obj<>
endobj
1068 0 obj<>
endobj
1069 0 obj<><><>]/P 9 0 R/S/Article/T()/Pg 1070 0 R>>
endobj
1070 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
1071 0 obj[1069 0 R]
endobj
1072 0 obj<>
endobj
1073 0 obj<>
endobj
1074 0 obj[1070 0 R/XYZ 0 698.277 null]
endobj
1075 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1076 0 obj[1075 0 R]
endobj
1077 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
1078 0 obj<>
endobj
1079 0 obj[1069 0 R]
endobj
1080 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
1081 0 obj[1069 0 R]
endobj
1082 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
1083 0 obj[1069 0 R]
endobj
1084 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1085 0 obj[1084 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R]
endobj
1086 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1087 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1088 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1089 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1090 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1091 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1092 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1093 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 6)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Lesson 6 - Binding versus Assignment)Tj
16.1538 0 0 16.1538 10 641.8611 Tm
(Binding creates a new place to hold a value)Tj
/T1_0 1 Tf
14 0 0 14 10 605.6063 Tm
(Lisp often "creates a binding" for a variable by allocating a piece of s\
torage to hold the variable's value )Tj
0 -1.2 TD
(and putting the value into the newly allocated memory. Binding is a very\
general mechanism for )Tj
T*
(implementing lexical scope for variables, but it has other uses dependin\
g upon the lifetime of the )Tj
T*
(binding. We'll revisit this in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
169.642 553.09 m
224.466 553.09 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 169.642 555.2063 Tm
(Chapter 8)Tj
0 0 0 rg
( when we study lifetime and visibility.)Tj
-8.546 -2.7 Td
(Yes, Lisp allocates storage for new bindings. While this sounds like it \
could be horribly )Tj
T*
(inefficient, we've said nothing yet about )Tj
/T1_2 1 Tf
(where)Tj
/T1_0 1 Tf
( Lisp allocated the storage. For example, )Tj
T*
(Lisp binds function parameters to actual values, but allocates the stora\
ge on the stack just )Tj
T*
(like any other programming language. Lisp creates bindings in the heap i\
f it can't )Tj
T*
(determine that the binding has a lifetime which ends when the binding fo\
rm finishes )Tj
T*
(executing. )Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 395.4765 Tm
(Bindings have names)Tj
/T1_0 1 Tf
14 0 0 14 10 359.2217 Tm
(Lisp gives each binding a name. Otherwise, how would your program refer \
to the binding? Simple, eh? )Tj
T*
(Hold on...)Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 304.4919 Tm
(A binding can have different values at the same time)Tj
/T1_0 1 Tf
14 0 0 14 10 268.2371 Tm
(It is quite common for multiple bindings to share the same name. For exa\
mple:)Tj
/T1_3 1 Tf
0 -2.562 TD
(\(let \(\(a 1\)\))Tj
0 -1.2 TD
( \(let \(\(a 2\)\))Tj
T*
( \(let \(\(a 3\)\))Tj
T*
( ...\)\)\))Tj
/T1_0 1 Tf
0 -2.557 TD
(Here, )Tj
/T1_3 1 Tf
(A)Tj
/T1_0 1 Tf
( has three distinct bindings by the time the body \(marked by )Tj
/T1_3 1 Tf
(...)Tj
/T1_0 1 Tf
(\) executes in the innermost )Tj
/T1_3 1 Tf
(LET)Tj
/T1_0 1 Tf
(.)Tj
2.857 -2.557 Td
(This is not to say that the above example is representative of typical L\
isp code, however. )Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 72.4399 Tm
(One binding is innermost)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-06.html \(1 of 4\)11/3/2006 5:51:3\
7 PM)Tj
ET
EMC
endstream
endobj
1094 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 6)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
14 0 0 14 10 753.9082 Tm
(;; Here, A has no binding.)Tj
/T1_2 1 Tf
0 -1.2 TD
(\(let \(\(a 1\)\))Tj
T*
( )Tj
/T1_1 1 Tf
(;; Here, the innermost binding of A has the value 1.)Tj
/T1_2 1 Tf
T*
( \(let \(\(a 2\)\))Tj
T*
( )Tj
/T1_1 1 Tf
(;; Here, the innermost binding of A has the value 2.)Tj
/T1_2 1 Tf
T*
( \(let \(\(a 3\)\))Tj
T*
( )Tj
/T1_1 1 Tf
(;; Here, the innermost binding of A has the value 3.)Tj
/T1_2 1 Tf
T*
( ...\)\)\))Tj
/T1_0 1 Tf
0 -2.552 TD
(As you can see, the notion of innermost binding depends on the relative \
position of your program's code )Tj
0 -1.2 TD
(to the form that established a particular binding. If you look at how bi\
nding forms are nested \(easy to do )Tj
T*
(if you indent your code as shown above\) then the program has access to \
bindings created around, or )Tj
T*
(enclosing, your program code.)Tj
0 -2.557 TD
(One more thing you should know is that an outer binding is still visible\
through inner binding forms, as )Tj
0 -1.2 TD
(long as the inner binding form does not bind the same symbol:)Tj
/T1_1 1 Tf
0 -2.562 TD
(;; Here, A and B have no binding.)Tj
/T1_2 1 Tf
0 -1.2 TD
(\(let \(\(a 1\))Tj
T*
( \(b 9\)\))Tj
T*
( )Tj
/T1_1 1 Tf
(;; Here, the innermost binding of A has the value 1,)Tj
T*
( ;; and the binding of B has the value 9.)Tj
/T1_2 1 Tf
T*
( \(let \(\(a 2\)\))Tj
T*
( )Tj
/T1_1 1 Tf
(;; Here, the innermost binding of A has the value 2.)Tj
T*
( ;; The binding of B still has the value 9.)Tj
/T1_2 1 Tf
T*
( \(let \(\(a 3\)\))Tj
T*
( )Tj
/T1_1 1 Tf
(;; Here, the innermost binding of A has the value 3.)Tj
T*
( ;; B still has the value 9 from the outermost LET form.)Tj
/T1_2 1 Tf
T*
( ...\)\)\))Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 239.0457 Tm
(The program can only access bindings it creates)Tj
/T1_0 1 Tf
14 0 0 14 10 202.7909 Tm
(When a binding form binds a new value to an existing symbol, the previou\
s value becomes shadowed. )Tj
T*
(The value of the outer binding is hidden \(but not forgotten\) while you\
r program code executes inside the )Tj
T*
(inner binding form. But as soon as your program leaves the inner binding\
form, the value of the outer )Tj
T*
(binding is restored. For example:)Tj
/T1_2 1 Tf
0 -2.562 TD
(\(let \(\(z 1\)\))Tj
0 -1.2 TD
( )Tj
/T1_1 1 Tf
(;; Here, the innermost binding of Z has the value 1.)Tj
/T1_2 1 Tf
T*
( \(let \(\(z 2\)\))Tj
T*
( )Tj
/T1_1 1 Tf
(;; Here, the innermost binding of Z has the value 2.)Tj
/T1_2 1 Tf
T*
( ...\))Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-06.html \(2 of 4\)11/3/2006 5:51:3\
7 PM)Tj
ET
EMC
endstream
endobj
1095 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 6)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
14 0 0 14 10 753.9082 Tm
( )Tj
/T1_2 1 Tf
(;; Now we're outside the inner binding form,)Tj
0 -1.2 TD
( ;; and we again see the binding with the value 1.)Tj
/T1_1 1 Tf
T*
( ...\))Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 682.4457 Tm
(Assignment gives an old place a new value)Tj
/T1_0 1 Tf
14 0 0 14 10 646.1236 Tm
(The )Tj
/T1_1 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( form changes the value of an existing binding:)Tj
/T1_1 1 Tf
0 -2.562 TD
(\(let \(\(z 1\)\))Tj
0 -1.2 TD
( )Tj
/T1_2 1 Tf
(;; Here, the innermost binding of Z has the value 1.)Tj
/T1_1 1 Tf
T*
( \(setq z 9\))Tj
T*
( )Tj
/T1_2 1 Tf
(;; Now the value of Z is 9.)Tj
/T1_1 1 Tf
T*
( \(let \(\(z 2\)\))Tj
T*
( )Tj
/T1_2 1 Tf
(;; Here, the innermost binding of Z has the value 2.)Tj
/T1_1 1 Tf
T*
( ...\))Tj
T*
( )Tj
/T1_2 1 Tf
(;; Now we're outside the inner binding form,)Tj
T*
( ;; and we again see the outer binding of Z with the value 9.)Tj
/T1_1 1 Tf
T*
( ...\))Tj
/T1_0 1 Tf
0 -2.557 TD
(The )Tj
/T1_1 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( form above changed the value of the outer binding of )Tj
/T1_1 1 Tf
(Z)Tj
/T1_0 1 Tf
( for the remainder of the outer )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( )Tj
0 -1.2 TD
(form. This is often the wrong thing to do. The problem is that you now h\
ave to look in two places to )Tj
0 -1.205 TD
(discover the value of )Tj
/T1_1 1 Tf
(Z)Tj
/T1_0 1 Tf
( -- first at the binding forms, then in the program code for assignments\
such as )Tj
/T1_1 1 Tf
0 -1.205 TD
(SETQ)Tj
/T1_0 1 Tf
(. While the binding forms are indented by convention \(many Lisp editors\
do this as you type\), the )Tj
0 -1.2 TD
(assignment form, as part of the body code of the program, gets no specia\
l indentation; this makes it )Tj
T*
(harder to spot when you read the program.)Tj
0 -2.557 TD
(We can quite easily avoid the assignment in the previous example by intr\
oducing a new binding:)Tj
/T1_1 1 Tf
0 -2.562 TD
(\(let \(\(z 1\)\))Tj
0 -1.2 TD
( )Tj
/T1_2 1 Tf
(;; Here, the innermost binding of Z has the value 1.)Tj
/T1_1 1 Tf
T*
( \(let \(\(z 9\)\))Tj
T*
( )Tj
/T1_2 1 Tf
(;; Now the value of Z is 9.)Tj
/T1_1 1 Tf
T*
( \(let \(\(z 2\)\))Tj
T*
( )Tj
/T1_2 1 Tf
(;; Here, the innermost binding of Z has the value 2.)Tj
/T1_1 1 Tf
T*
( ...\))Tj
T*
( )Tj
/T1_2 1 Tf
(;; Now we're outside the innermost binding form,)Tj
T*
( ;; and we again see the middle binding of Z with the value 9.)Tj
/T1_1 1 Tf
T*
( ...\))Tj
T*
( )Tj
/T1_2 1 Tf
(;; Here, we see the outermost binding of Z with the value 1.)Tj
/T1_1 1 Tf
T*
( ...\))Tj
/T1_0 1 Tf
0 -2.557 TD
(Now all of the bindings of )Tj
/T1_1 1 Tf
(Z)Tj
/T1_0 1 Tf
( are apparent from the relative indentation of the )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( forms. While reading )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-06.html \(3 of 4\)11/3/2006 5:51:3\
7 PM)Tj
ET
EMC
endstream
endobj
1096 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 6)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9082 Tm
(the program, all we have to do to find the right binding for )Tj
/T1_1 1 Tf
(Z)Tj
/T1_0 1 Tf
( at any point in our program code \(the )Tj
/T1_1 1 Tf
(...)Tj
/T1_0 1 Tf
( )Tj
0 -1.205 TD
(in the example\) is to scan vertically looking for a )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form at an outer level of indentation.)Tj
0 -2.562 TD
(When a )Tj
/T1_1 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( form refers to a variable that is not bound by an enclosing )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
( form, it assigns a value to )Tj
0 -1.2 TD
(the global or special value of the symbol. A global value is accessible \
anywhere it's not shadowed, and )Tj
T*
(stays available for as long as the Lisp system runs. We'll look at speci\
al variables in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
482.626 665.457 m
537.45 665.457 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 482.626 667.5734 Tm
(Chapter 8)Tj
0 0 0 rg
(. )Tj
/T1_1 1 Tf
-33.759 -2.705 Td
(\(setq a 987\))Tj
/T1_2 1 Tf
T*
(;; Here, A has the global value 987.)Tj
/T1_1 1 Tf
T*
(\(let \(\(a 1\)\))Tj
T*
( )Tj
/T1_2 1 Tf
(;; Here, the binding of A to the value 1 shadows the global value.)Tj
/T1_1 1 Tf
T*
( ...\))Tj
/T1_2 1 Tf
T*
(;; Now the global value of A is again visible.)Tj
/T1_1 1 Tf
T*
(...)Tj
ET
0.5 0.5 0.5 rg
10 496.198 m
10 498.198 l
602 498.198 l
601 497.198 l
11 497.198 l
11 497.198 l
h
f
0.875 0.875 0.875 rg
602 498.198 m
602 496.198 l
10 496.198 l
11 497.198 l
601 497.198 l
601 497.198 l
h
f
259.1 475.057 m
308.884 475.057 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 477.1734 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 475.057 m
352.9 475.057 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 477.1734 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
20.589 456.257 m
75.413 456.257 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 20.589 458.3734 Tm
(Chapter 2)Tj
0 0 0 rg
( | )Tj
ET
85.213 456.257 m
216.253 456.257 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 85.213 458.3734 Tm
(Chapter 3, Introduction)Tj
0 0 0 rg
( | )Tj
ET
226.053 456.257 m
338.039 456.257 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 226.053 458.3734 Tm
(Chapter 3, Lesson 5)Tj
0 0 0 rg
( | Chapter 3, Lesson 6 | )Tj
ET
469.625 456.257 m
581.611 456.257 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 469.625 458.3734 Tm
(Chapter 3, Lesson 7)Tj
0 0 0 rg
( | )Tj
ET
275.438 437.457 m
330.262 437.457 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 275.438 439.5734 Tm
(Chapter 4)Tj
0 0 0 rg
( | )Tj
ET
0.5 0.5 0.5 rg
10 423.798 m
10 425.798 l
602 425.798 l
601 424.798 l
11 424.798 l
11 424.798 l
h
f
0.875 0.875 0.875 rg
602 425.798 m
602 423.798 l
10 423.798 l
11 424.798 l
601 424.798 l
601 424.798 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 404.7734 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
T*
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-06.html \(4 of 4\)11/3/2006 5:51:3\
7 PM)Tj
ET
EMC
endstream
endobj
1097 0 obj(Successful Lisp - Chapter 3, Lesson 6)
endobj
1098 0 obj<>
endobj
1099 0 obj(http://psg.com/~dlamkins/sl/chapter03-06.html)
endobj
1100 0 obj(\\͏;@~)
endobj
1101 0 obj<>
endobj
1102 0 obj<>
endobj
1103 0 obj(+`ڡr63Bu)
endobj
1104 0 obj<>
endobj
1105 0 obj<>
endobj
1106 0 obj<><>]/P 9 0 R/S/Article/T()/Pg 1107 0 R>>
endobj
1107 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1108 0 obj[1106 0 R]
endobj
1109 0 obj[1107 0 R/XYZ 0 698.277 null]
endobj
1110 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1111 0 obj[1110 0 R]
endobj
1112 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1113 0 obj[1106 0 R]
endobj
1114 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1115 0 obj[1114 0 R]
endobj
1116 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
1117 0 obj<>
endobj
1118 0 obj[1106 0 R]
endobj
1119 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1120 0 obj[1119 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R]
endobj
1121 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1122 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1123 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1124 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1125 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1126 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1127 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 7)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Lesson 7 - Essential Function Definition)Tj
16.1538 0 0 16.1538 10 641.8611 Tm
(DEFUN defines named functions)Tj
/T1_0 1 Tf
14 0 0 14 10 605.5389 Tm
(You can define a named function using the )Tj
/T1_2 1 Tf
(DEFUN)Tj
/T1_0 1 Tf
( form:)Tj
ET
q
7 0 0 8 10 569.6715393 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 569.6715 Tm
( \(defun secret-number \(the-number\) )Tj
-0.5 -1.2 Td
( \(let \(\(the-secret 37\)\) )Tj
0 -1.2 TD
( \(cond \(\(= the-number the-secret\) 'that-is-the-secret-number\)\
)Tj
T*
( \(\(< the-number the-secret\) 'too-low\) )Tj
T*
( \(\(> the-number the-secret\) 'too-high\)\)\)\) )Tj
ET
q
10 0 0 7 10 485.6715393 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 485.6715 Tm
( SECRET-NUMBER)Tj
/T1_0 1 Tf
2.143 -2.557 Td
(We described )Tj
/T1_2 1 Tf
(LET)Tj
/T1_0 1 Tf
(, )Tj
/T1_2 1 Tf
(COND)Tj
/T1_0 1 Tf
(, and )Tj
/T1_2 1 Tf
(')Tj
/T1_0 1 Tf
( \(a.k.a. )Tj
/T1_2 1 Tf
(QUOTE\))Tj
/T1_0 1 Tf
( in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
344.882 447.755 m
395.044 447.755 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 344.882 449.8715 Tm
(Lesson 3)Tj
0 0 0 rg
(. The numeric comparison )Tj
-21.063 -1.343 Td
(functions have the obvious meaning. )Tj
-2.857 -2.562 Td
(The )Tj
/T1_2 1 Tf
(DEFUN)Tj
/T1_0 1 Tf
( form has three arguments:)Tj
1.607 -2.562 Td
(1. )Tj
(the name of the function: )Tj
/T1_2 1 Tf
(SECRET-NUMBER)Tj
/T1_0 1 Tf
(,)Tj
0 -1.205 TD
(2. )Tj
(a list of argument names: )Tj
/T1_2 1 Tf
(\(THE-NUMBER\))Tj
/T1_0 1 Tf
(, which will be bound to the function's parameters )Tj
1.25 -1.2 Td
(when it is called, and)Tj
-1.25 -1.205 Td
(3. )Tj
(the body of the function: )Tj
/T1_2 1 Tf
(\(LET ...\))Tj
/T1_0 1 Tf
(.)Tj
-1.607 -2.562 Td
(Since all three of these should stand for themselves, )Tj
/T1_2 1 Tf
(DEFUN)Tj
/T1_0 1 Tf
( does not evaluate any of its arguments. \(If it )Tj
0 -1.2 TD
(did, you'd face the inconvenience of having to quote each argument.\))Tj
/T1_2 1 Tf
0 -2.562 TD
(DEFUN)Tj
/T1_0 1 Tf
( returns the name of the defined function, and installs a global definit\
ion using the name, )Tj
0 -1.205 TD
(parameter list, and body that you supplied. Once you create a function u\
sing )Tj
/T1_2 1 Tf
(DEFUN)Tj
/T1_0 1 Tf
(, you can use it right )Tj
0 -1.2 TD
(away:)Tj
ET
q
7 0 0 8 10 150.7323761 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 150.7324 Tm
( \(secret-number 11\) )Tj
ET
q
10 0 0 7 10 133.932373 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 133.9324 Tm
( TOO-LOW )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 117.13237 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 117.1324 Tm
( \(secret-number 99\) )Tj
ET
q
10 0 0 7 10 100.3323822 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 100.3324 Tm
( TOO-HIGH )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 83.5323792 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 83.5324 Tm
( \(secret-number 37\) )Tj
ET
q
10 0 0 7 10 66.7323761 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 66.7324 Tm
( THAT-IS-THE-SECRET-NUMBER)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-07.html \(1 of 3\)11/3/2006 5:51:4\
8 PM)Tj
ET
EMC
endstream
endobj
1128 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 7)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9082 Tm
(When you call the function, its parameter \(e.g. )Tj
/T1_1 1 Tf
(99)Tj
/T1_0 1 Tf
( in the second example\) is bound to the argument )Tj
0 -1.205 TD
(name \(i.e. )Tj
/T1_1 1 Tf
(THE-NUMBER)Tj
/T1_0 1 Tf
(\) you supplied in the definition. Then, the body of the function \(i.e.\
)Tj
/T1_1 1 Tf
0 -1.205 TD
(\(LET ...\))Tj
/T1_0 1 Tf
(\) is evaluated within the context of the parameter binding. In other wo\
rds, evaluating )Tj
/T1_1 1 Tf
0 -1.205 TD
(\(SECRET-NUMBER 99\))Tj
/T1_0 1 Tf
( causes the body of the )Tj
/T1_1 1 Tf
(SECRET-NUMBER)Tj
/T1_0 1 Tf
( function definition to be executed )Tj
0 -1.205 TD
(with the variable )Tj
/T1_1 1 Tf
(THE-NUMBER)Tj
/T1_0 1 Tf
( bound to )Tj
/T1_1 1 Tf
(99)Tj
/T1_0 1 Tf
(.)Tj
0 -2.557 TD
(Of course, you can define a function of more than one argument:)Tj
ET
q
7 0 0 8 10 614.7711945 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 614.7712 Tm
( \(defun my-calculation \(a b c x\) )Tj
-0.5 -1.2 Td
( \(+ \(* a \(* x x\)\) \(* b x\) c\)\) )Tj
ET
q
10 0 0 7 10 581.1711884 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 581.1712 Tm
( MY-CALCULATION )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 564.3711853 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 564.3712 Tm
( \(my-calculation 3 2 7 5\) )Tj
ET
q
10 0 0 7 10 547.5711823 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 547.5712 Tm
( 92)Tj
/T1_0 1 Tf
-0.714 -2.552 Td
(When calling a function, parameters are bound to argument names in order\
. Lisp has several optional )Tj
0 -1.2 TD
(variations on the list of argument names. Formally, this list is called \
a )Tj
/T1_2 1 Tf
(lambda list)Tj
/T1_0 1 Tf
( -- we'll examine some )Tj
T*
(of its other features in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
136.364 476.122 m
198.188 476.122 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 136.364 478.2386 Tm
(Chapter 21)Tj
0 0 0 rg
(.)Tj
/T1_3 1 Tf
16.1538 0 0 16.1538 10 438.3088 Tm
(LAMBDA defines anonymous functions)Tj
/T1_0 1 Tf
14 0 0 14 10 402.054 Tm
(At times you'll need a function in only one place in your program. You c\
ould create a function with )Tj
/T1_1 1 Tf
0 -1.205 TD
(DEFUN)Tj
/T1_0 1 Tf
( and call it just once. Sometimes, this is the best thing to do, because\
you can give the function a )Tj
0 -1.2 TD
(descriptive name that will help you read the program at some later date.\
But sometimes the function you )Tj
T*
(need is so trivial or so obvious that you don't want to have to invent a\
name or worry about whether the )Tj
T*
(name might be in use somewhere else. For situations like this, Lisp lets\
you create an unnamed, or )Tj
0 -1.205 TD
(anonymous, function using the )Tj
/T1_1 1 Tf
(LAMBDA)Tj
/T1_0 1 Tf
( form. A )Tj
/T1_1 1 Tf
(LAMBDA)Tj
/T1_0 1 Tf
( form looks like a )Tj
/T1_1 1 Tf
(DEFUN)Tj
/T1_0 1 Tf
( form without the )Tj
0 -1.2 TD
(name:)Tj
/T1_1 1 Tf
0 -2.562 TD
(\(lambda \(a b c x\))Tj
0 -1.2 TD
( \(+ \(* a \(* x x\)\) \(* b x\) c\)\))Tj
/T1_0 1 Tf
0 -2.557 TD
(You can't evaluate a )Tj
/T1_1 1 Tf
(LAMBDA)Tj
/T1_0 1 Tf
( form; it must appear only where Lisp expects to find a function -- )Tj
0 -1.2 TD
(normally as the first element of a form:)Tj
ET
q
7 0 0 8 10 159.9843903 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 159.9844 Tm
( \(lambda \(a b c x\) )Tj
-0.5 -1.2 Td
( \(+ \(* a \(* x x\)\) \(* b x\) c\)\) )Tj
ET
q
11 0 0 9 10 126.3843842 cm
/Im2 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 21 126.3844 Tm
( Error )Tj
-0.786 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 109.5843811 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 109.5844 Tm
( \(\(lambda \(a b c x\) )Tj
-0.5 -1.2 Td
( \(+ \(* a \(* x x\)\) \(* b x\) c\)\) )Tj
T*
( 3 2 7 5\) )Tj
ET
q
10 0 0 7 10 59.1843872 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 59.1844 Tm
( 92)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-07.html \(2 of 3\)11/3/2006 5:51:4\
8 PM)Tj
ET
EMC
endstream
endobj
1129 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 7)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
0.5 0.5 0.5 rg
10 756.476 m
10 758.476 l
602 758.476 l
601 757.476 l
11 757.476 l
11 757.476 l
h
f
0.875 0.875 0.875 rg
602 758.476 m
602 756.476 l
10 756.476 l
11 757.476 l
601 757.476 l
601 757.476 l
h
f
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
259.1 735.335 m
308.884 735.335 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 737.4518 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 735.335 m
352.9 735.335 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 737.4518 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
20.589 716.535 m
75.413 716.535 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 20.589 718.6518 Tm
(Chapter 2)Tj
0 0 0 rg
( | )Tj
ET
85.213 716.535 m
216.253 716.535 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 85.213 718.6518 Tm
(Chapter 3, Introduction)Tj
0 0 0 rg
( | )Tj
ET
226.053 716.535 m
338.039 716.535 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 226.053 718.6518 Tm
(Chapter 3, Lesson 6)Tj
0 0 0 rg
( | Chapter 3, Lesson 7 | )Tj
ET
469.625 716.535 m
581.611 716.535 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 469.625 718.6518 Tm
(Chapter 3, Lesson 8)Tj
0 0 0 rg
( | )Tj
ET
275.438 697.735 m
330.262 697.735 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 275.438 699.8518 Tm
(Chapter 4)Tj
0 0 0 rg
( | )Tj
ET
0.5 0.5 0.5 rg
10 684.076 m
10 686.076 l
602 686.076 l
601 685.076 l
11 685.076 l
11 685.076 l
h
f
0.875 0.875 0.875 rg
602 686.076 m
602 684.076 l
10 684.076 l
11 685.076 l
601 685.076 l
601 685.076 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 665.0518 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
0 -1.2 TD
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-07.html \(3 of 3\)11/3/2006 5:51:4\
8 PM)Tj
ET
EMC
endstream
endobj
1130 0 obj(Successful Lisp - Chapter 3, Lesson 7)
endobj
1131 0 obj<>
endobj
1132 0 obj(http://psg.com/~dlamkins/sl/chapter03-07.html)
endobj
1133 0 obj(l<;"[~mT)
endobj
1134 0 obj<>
endobj
1135 0 obj<>
endobj
1136 0 obj(&5G?ѕ9/)
endobj
1137 0 obj 15
endobj
1138 0 obj 15
endobj
1139 0 obj 16
endobj
1140 0 obj 16
endobj
1141 0 obj 5
endobj
1142 0 obj<>
endobj
1143 0 obj<>
endobj
1144 0 obj<><>]/P 9 0 R/S/Article/T()/Pg 1145 0 R>>
endobj
1145 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1146 0 obj[1144 0 R]
endobj
1147 0 obj[1145 0 R/XYZ 0 698.277 null]
endobj
1148 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1149 0 obj[1148 0 R]
endobj
1150 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1151 0 obj[1144 0 R]
endobj
1152 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1153 0 obj[1152 0 R]
endobj
1154 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
1155 0 obj[1144 0 R]
endobj
1156 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1157 0 obj[1156 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R]
endobj
1158 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1159 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1160 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1161 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1162 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1163 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1164 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 8)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Lesson 8 - Essential Macro Definition)Tj
16.1538 0 0 16.1538 10 641.8611 Tm
(DEFMACRO defines named macros)Tj
/T1_0 1 Tf
14 0 0 14 10 605.5389 Tm
(A )Tj
/T1_2 1 Tf
(DEFMACRO)Tj
/T1_0 1 Tf
( form looks a lot like a )Tj
/T1_2 1 Tf
(DEFUN)Tj
/T1_0 1 Tf
( form \(see )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
323.334 603.422 m
373.496 603.422 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 323.334 605.5389 Tm
(Lesson 7)Tj
0 0 0 rg
(\) -- it has a name, a list of argument )Tj
-22.381 -1.343 Td
(names, and a body:)Tj
/T1_2 1 Tf
0 -2.562 TD
(\(defmacro )Tj
/T1_3 1 Tf
(name)Tj
/T1_2 1 Tf
( \()Tj
/T1_3 1 Tf
(argument)Tj
/T1_2 1 Tf
( ...\))Tj
0 -1.2 TD
( )Tj
/T1_3 1 Tf
(body)Tj
/T1_2 1 Tf
(\))Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 496.2091 Tm
(Macros return a form, not values)Tj
/T1_0 1 Tf
14 0 0 14 10 459.9543 Tm
(The macro body returns a form to be evaluated. In other words, you need \
to write the body of the macro )Tj
T*
(such that it returns a form, not a value. When Lisp evaluates a call to \
your macro, it first evaluates the )Tj
T*
(body of your macro definition, then evaluates the result of the first ev\
aluation. \(By way of comparison, a )Tj
T*
(function's body is evaluated to return a value.\))Tj
0 -2.557 TD
(Here are a couple of simple macros to illustrate most of what you need t\
o know:)Tj
ET
q
7 0 0 8 10 337.8869171 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 337.8869 Tm
( \(defmacro setq-literal \(place literal\) )Tj
-0.5 -1.2 Td
( `\(setq ,place ',literal\)\) )Tj
ET
q
10 0 0 7 10 304.2869263 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 304.2869 Tm
( SETQ-LITERAL )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 287.4869232 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 287.4869 Tm
( \(setq-literal a b\) )Tj
ET
q
10 0 0 7 10 270.6869202 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 270.6869 Tm
( B )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 253.8869171 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 253.8869 Tm
( a )Tj
ET
q
10 0 0 7 10 237.0869141 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 237.0869 Tm
( B )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 220.2869263 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 220.2869 Tm
( \(defmacro reverse-cons \(rest first\) )Tj
-0.5 -1.2 Td
( `\(cons ,first ,rest\)\) )Tj
ET
q
10 0 0 7 10 186.6869202 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 186.6869 Tm
( REVERSE-CONS )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 169.8869171 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 169.8869 Tm
( \(reverse-cons nil A\) )Tj
ET
q
10 0 0 7 10 153.0869141 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 153.0869 Tm
( \(B\))Tj
-0.714 -2.557 Td
(SETQ-LITERAL)Tj
/T1_0 1 Tf
( works like )Tj
/T1_2 1 Tf
(SETQ)Tj
/T1_0 1 Tf
(, except that )Tj
/T1_4 1 Tf
(neither)Tj
/T1_0 1 Tf
( argument is evaluated. \(Remember that )Tj
/T1_2 1 Tf
(SETQ)Tj
/T1_0 1 Tf
( )Tj
0 -1.205 TD
(evaluates its second argument.\) The body of )Tj
/T1_2 1 Tf
(SETQ-LITERAL)Tj
/T1_0 1 Tf
( has a form that begins with a )Tj
/T1_2 1 Tf
(`)Tj
/T1_0 1 Tf
( )Tj
0 -1.2 TD
(\(pronounced "backquote"\). Backquote behaves like quote -- suppressing \
evaluation of all the enclosed )Tj
T*
(forms -- except where a comma appears within the backquoted form. A symb\
ol following the comma is )Tj
T*
(evaluated.)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-08.html \(1 of 3\)11/3/2006 5:52:0\
0 PM)Tj
ET
EMC
endstream
endobj
1165 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 8)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 744.1521 Tm
(So in our call to )Tj
/T1_1 1 Tf
(\(SETQ-LITERAL A B\))Tj
/T1_0 1 Tf
( above, here's what happens:)Tj
1.607 -2.562 Td
(1. )Tj
(bind )Tj
/T1_1 1 Tf
(PLACE)Tj
/T1_0 1 Tf
( to the symbol )Tj
/T1_1 1 Tf
(A)Tj
/T1_0 1 Tf
(.)Tj
0 -1.205 TD
(2. )Tj
(bind )Tj
/T1_1 1 Tf
(LITERAL)Tj
/T1_0 1 Tf
( to the symbol )Tj
/T1_1 1 Tf
(B)Tj
/T1_0 1 Tf
(.)Tj
T*
(3. )Tj
(evaluate the body )Tj
/T1_1 1 Tf
(`\(SETQ ,PLACE ',LITERAL\))Tj
/T1_0 1 Tf
(, following these steps:)Tj
2.857 -1.205 Td
(1. )Tj
(evaluate )Tj
/T1_1 1 Tf
(PLACE)Tj
/T1_0 1 Tf
( to get the symbol )Tj
/T1_1 1 Tf
(A)Tj
/T1_0 1 Tf
(.)Tj
T*
(2. )Tj
(evaluate )Tj
/T1_1 1 Tf
(LITERAL)Tj
/T1_0 1 Tf
( to get the symbol )Tj
/T1_1 1 Tf
(B)Tj
/T1_0 1 Tf
(.)Tj
0 -1.205 TD
(3. )Tj
(return the form )Tj
/T1_1 1 Tf
(\(SETQ A 'B\))Tj
/T1_0 1 Tf
(.)Tj
-2.857 -1.205 Td
(4. )Tj
(evaluate the form )Tj
/T1_1 1 Tf
(\(SETQ A 'B\))Tj
/T1_0 1 Tf
(.)Tj
-1.607 -2.562 Td
(Neither the backquote nor the commas appear in the returned form. Neithe\
r )Tj
/T1_1 1 Tf
(A)Tj
/T1_0 1 Tf
( nor )Tj
/T1_1 1 Tf
(B)Tj
/T1_0 1 Tf
( is evaluated in a call )Tj
0 -1.205 TD
(to )Tj
/T1_1 1 Tf
(SETQ-LITERAL)Tj
/T1_0 1 Tf
(, but for different reasons. )Tj
/T1_1 1 Tf
(A)Tj
/T1_0 1 Tf
( is unevaluated because it appears as the first argument )Tj
0 -1.205 TD
(of )Tj
/T1_1 1 Tf
(SETQ)Tj
/T1_0 1 Tf
(. )Tj
/T1_1 1 Tf
(B)Tj
/T1_0 1 Tf
( is unevaluated because it appears after a quote in the form returned by\
the macro.)Tj
0 -2.562 TD
(The operation of )Tj
/T1_1 1 Tf
(\(REVERSE-CONS NIL A\))Tj
/T1_0 1 Tf
( is similar:)Tj
1.607 -2.557 Td
(1. )Tj
(bind REST)Tj
1.25 -1.205 Td
(to the symbol )Tj
/T1_1 1 Tf
(NIL)Tj
/T1_0 1 Tf
(. )Tj
-1.25 -1.205 Td
(2. )Tj
(bind )Tj
/T1_1 1 Tf
(FIRST)Tj
/T1_0 1 Tf
( to the symbol )Tj
/T1_1 1 Tf
(A)Tj
/T1_0 1 Tf
(.)Tj
0 -1.205 TD
(3. )Tj
(evaluate the body )Tj
/T1_1 1 Tf
(`\(CONS ,FIRST ,REST\))Tj
/T1_0 1 Tf
(, following these steps:)Tj
2.857 -1.205 Td
(1. )Tj
(evaluate )Tj
/T1_1 1 Tf
(FIRST)Tj
/T1_0 1 Tf
( to get the symbol )Tj
/T1_1 1 Tf
(A)Tj
/T1_0 1 Tf
(.)Tj
0 -1.205 TD
(2. )Tj
(evaluate )Tj
/T1_1 1 Tf
(REST)Tj
/T1_0 1 Tf
( to get the symbol )Tj
/T1_1 1 Tf
(NIL)Tj
/T1_0 1 Tf
(.)Tj
0 -1.205 TD
(3. )Tj
(return the form )Tj
/T1_1 1 Tf
(\(CONS A NIL\))Tj
/T1_0 1 Tf
(.)Tj
-2.857 -1.205 Td
(4. )Tj
(evaluate the form )Tj
/T1_1 1 Tf
(\(CONS A NIL\))Tj
/T1_0 1 Tf
(.)Tj
-1.607 -2.562 Td
(Both arguments of )Tj
/T1_1 1 Tf
(REVERSE-CONS)Tj
/T1_0 1 Tf
( are evaluated because )Tj
/T1_1 1 Tf
(CONS)Tj
/T1_0 1 Tf
( evaluates its arguments, and our )Tj
0 -1.205 TD
(macro body doesn't quote either argument. )Tj
/T1_1 1 Tf
(A)Tj
/T1_0 1 Tf
( evaluates to the symbol )Tj
/T1_1 1 Tf
(B)Tj
/T1_0 1 Tf
(, and )Tj
/T1_1 1 Tf
(NIL)Tj
/T1_0 1 Tf
( evaluates to itself.)Tj
0 -2.562 TD
(If you want to see how your macro body appears before evaluation, you ca\
n use the )Tj
/T1_1 1 Tf
(MACROEXPAND)Tj
/T1_0 1 Tf
( )Tj
0 -1.2 TD
(function:)Tj
ET
q
7 0 0 8 10 206.4694519 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 206.4695 Tm
( \(macroexpand '\(setq-literal a b\)\) )Tj
ET
q
10 0 0 7 10 189.6694489 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 189.6694 Tm
( \(SETQ A 'B\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 172.8694458 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 172.8694 Tm
( \(macroexpand '\(reverse-cons nil a\)\) )Tj
ET
q
10 0 0 7 10 156.0694427 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 156.0694 Tm
( \(CONS A NIL\))Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(Since )Tj
/T1_1 1 Tf
(MACROEXPAND)Tj
/T1_0 1 Tf
( is a function, it evaluates its arguments. This is why you have to quot\
e the form )Tj
T*
(you want expanded.)Tj
0 -2.557 TD
(The examples in this lesson are deliberately very simple, so you can und\
erstand the basic mechanism. In )Tj
0 -1.2 TD
(general, macros are trickier to write than functions -- in )Tj
ET
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
323.754 48.753 m
385.578 48.753 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 323.754 50.8694 Tm
(Chapter 20)Tj
0 0 0 rg
( we'll look at the reasons and the )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-08.html \(2 of 3\)11/3/2006 5:52:0\
0 PM)Tj
ET
EMC
endstream
endobj
1166 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 8)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_0 1 Tf
14 0 0 14 10 753.9756 Tm
(correct techniques for dealing with more complex situations.)Tj
ET
0.5 0.5 0.5 rg
10 721.2 m
10 723.2 l
602 723.2 l
601 722.2 l
11 722.2 l
11 722.2 l
h
f
0.875 0.875 0.875 rg
602 723.2 m
602 721.2 l
10 721.2 l
11 722.2 l
601 722.2 l
601 722.2 l
h
f
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
259.1 700.059 m
308.884 700.059 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 702.1756 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 700.059 m
352.9 700.059 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 702.1756 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
20.589 681.259 m
75.413 681.259 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 20.589 683.3755 Tm
(Chapter 2)Tj
0 0 0 rg
( | )Tj
ET
85.213 681.259 m
216.253 681.259 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 85.213 683.3755 Tm
(Chapter 3, Introduction)Tj
0 0 0 rg
( | )Tj
ET
226.053 681.259 m
338.039 681.259 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 226.053 683.3755 Tm
(Chapter 3, Lesson 7)Tj
0 0 0 rg
( | Chapter 3, Lesson 8 | )Tj
ET
469.625 681.259 m
581.611 681.259 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 469.625 683.3755 Tm
(Chapter 3, Lesson 9)Tj
0 0 0 rg
( | )Tj
ET
275.438 662.459 m
330.262 662.459 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 275.438 664.5756 Tm
(Chapter 4)Tj
0 0 0 rg
( | )Tj
ET
0.5 0.5 0.5 rg
10 648.8 m
10 650.8 l
602 650.8 l
601 649.8 l
11 649.8 l
11 649.8 l
h
f
0.875 0.875 0.875 rg
602 650.8 m
602 648.8 l
10 648.8 l
11 649.8 l
601 649.8 l
601 649.8 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 629.7756 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
0 -1.2 TD
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-08.html \(3 of 3\)11/3/2006 5:52:0\
0 PM)Tj
ET
EMC
endstream
endobj
1167 0 obj(Successful Lisp - Chapter 3, Lesson 8)
endobj
1168 0 obj<>
endobj
1169 0 obj(http://psg.com/~dlamkins/sl/chapter03-08.html)
endobj
1170 0 obj(nLm1']/Q)
endobj
1171 0 obj<>
endobj
1172 0 obj<>
endobj
1173 0 obj(\(HikP)
endobj
1174 0 obj 17
endobj
1175 0 obj 17
endobj
1176 0 obj 18
endobj
1177 0 obj 18
endobj
1178 0 obj<>
endobj
1179 0 obj<>
endobj
1180 0 obj<><>]/P 9 0 R/S/Article/T()/Pg 1181 0 R>>
endobj
1181 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1182 0 obj[1180 0 R]
endobj
1183 0 obj[1181 0 R/XYZ 0 698.277 null]
endobj
1184 0 obj<>/ColorSpace<>/Font<>/ProcSet[/PDF/Text/ImageC/ImageI]>>/Type/Page>>
endobj
1185 0 obj<>
endobj
1186 0 obj[1180 0 R]
endobj
1187 0 obj<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
1188 0 obj<>
endobj
1189 0 obj[1180 0 R]
endobj
1190 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1191 0 obj[1190 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R]
endobj
1192 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1193 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1194 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1195 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1196 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1197 0 obj<>/A<>/PA<>/Border[0 0 0]>>
endobj
1198 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 9)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
24.7692 0 0 24.7692 10 725.2968 Tm
(Chapter 3 - Essential Lisp in Twelve Lessons)Tj
19.3846 0 0 19.3846 10 681.2918 Tm
(Lesson 9 - Essential Multiple Values)Tj
16.1538 0 0 16.1538 10 641.8611 Tm
(Most forms create only one value)Tj
/T1_0 1 Tf
14 0 0 14 10 605.6063 Tm
(A form typically returns only one value. Lisp has only a small number of\
forms which create or receive )Tj
0 -1.2 TD
(multiple values.)Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 550.8765 Tm
(VALUES creates multiple \(or no\) values)Tj
/T1_0 1 Tf
14 0 0 14 10 514.5543 Tm
(The )Tj
/T1_2 1 Tf
(VALUES)Tj
/T1_0 1 Tf
( form creates zero or more values:)Tj
ET
q
7 0 0 8 10 478.6869202 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 478.6869 Tm
( \(values\) )Tj
-0.5 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 461.8869171 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 461.8869 Tm
( \(values :this\) )Tj
ET
q
10 0 0 7 10 445.0869141 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 445.0869 Tm
( :THIS )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 428.2869263 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 428.2869 Tm
( \(values :this :that\) )Tj
ET
q
10 0 0 7 10 411.4869232 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 411.4869 Tm
( :THIS )Tj
ET
q
10 0 0 7 10 394.6869202 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 394.6869 Tm
( :THAT)Tj
/T1_0 1 Tf
-0.714 -2.552 Td
(We show how many values are returned by the number of )Tj
ET
q
10 0 0 7 337.7539978 358.9543152 cm
/Im1 Do
Q
BT
/T1_0 1 Tf
14 0 0 14 347.754 358.9543 Tm
( lines produced by the evaluation of the )Tj
-24.125 -1.205 Td
(form. The three )Tj
/T1_2 1 Tf
(VALUES)Tj
/T1_0 1 Tf
( forms in the example above produced zero, one, and two values, respecti\
vely.)Tj
/T1_2 1 Tf
0 -2.562 TD
(VALUES)Tj
/T1_0 1 Tf
( is a function, and so evaluates its arguments.)Tj
/T1_1 1 Tf
16.1538 0 0 16.1538 10 268.2897 Tm
(A few special forms receive multiple values)Tj
/T1_0 1 Tf
14 0 0 14 10 232.0349 Tm
(What might you want to do with multiple values in a program? The most ba\
sic operations are to:)Tj
1.607 -2.557 Td
(1. )Tj
(bind each value to a separate symbol, or)Tj
0 -1.2 TD
(2. )Tj
(collect the values into a list.)Tj
-1.607 -2.562 Td
(Use )Tj
/T1_2 1 Tf
(MULTIPLE-VALUE-BIND)Tj
/T1_0 1 Tf
( to bind each value to a separate symbol:)Tj
ET
q
7 0 0 8 10 107.700119 cm
/Im0 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 17 107.7001 Tm
( \(multiple-value-bind \(a b c\) \(values 2 3 5\) )Tj
-0.5 -1.2 Td
( \(+ a b c\)\) )Tj
ET
q
10 0 0 7 10 74.1001129 cm
/Im1 Do
Q
BT
/T1_2 1 Tf
14 0 0 14 20 74.1001 Tm
( 10)Tj
/T1_0 1 Tf
-0.714 -2.552 Td
(If you provide more values than symbols, the excess values are ignored:)Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-09.html \(1 of 3\)11/3/2006 5:52:0\
7 PM)Tj
ET
EMC
endstream
endobj
1199 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 9)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
q
7 0 0 8 10 732.5001221 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 732.5001 Tm
( \(multiple-value-bind \(a b c\) \(values 2 3 5 'x 'y\) )Tj
-0.5 -1.2 Td
( \(+ a b c\)\) )Tj
ET
q
10 0 0 7 10 698.900116 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 698.9001 Tm
( 10)Tj
/T1_0 1 Tf
-0.714 -2.557 Td
(If you provide fewer values than symbols, the excess symbols are bound t\
o )Tj
/T1_1 1 Tf
(NIL)Tj
/T1_0 1 Tf
(:)Tj
ET
q
7 0 0 8 10 627.2327271 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 627.2327 Tm
( \(multiple-value-bind \(w x y z\) \(values :left :right\) )Tj
-0.5 -1.2 Td
( \(list w x y z\)\) )Tj
ET
q
10 0 0 7 10 593.6327209 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 593.6327 Tm
( \(:LEFT :RIGHT NIL NIL\))Tj
/T1_2 1 Tf
16.1538 0 0 16.1538 10 555.7703 Tm
(Some forms pass along multiple values)Tj
/T1_0 1 Tf
14 0 0 14 10 519.5155 Tm
(Some forms pass along the last value in their body, rather than creating\
a new value. Examples include )Tj
0 -1.205 TD
(the bodies of )Tj
/T1_1 1 Tf
(LET)Tj
/T1_0 1 Tf
(, )Tj
/T1_1 1 Tf
(COND)Tj
/T1_0 1 Tf
(, )Tj
/T1_1 1 Tf
(DEFUN)Tj
/T1_0 1 Tf
(, and )Tj
/T1_1 1 Tf
(LAMBDA)Tj
/T1_0 1 Tf
(.)Tj
ET
q
7 0 0 8 10 466.7807159 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 466.7807 Tm
( \(let \(\(a 1\) )Tj
-0.5 -1.2 Td
( \(b 2\)\) )Tj
0 -1.2 TD
( \(values a b\)\) )Tj
ET
q
10 0 0 7 10 416.380722 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 416.3807 Tm
( 1 )Tj
ET
q
10 0 0 7 10 399.580719 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 399.5807 Tm
( 2 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 382.7807159 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 382.7807 Tm
( \(cond \(nil 97\) )Tj
-0.5 -1.2 Td
( \(t \(values 3 4\)\)\) )Tj
ET
q
10 0 0 7 10 349.1807098 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 349.1807 Tm
( 3 )Tj
ET
q
10 0 0 7 10 332.380722 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 332.3807 Tm
( 4 )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 315.580719 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 315.5807 Tm
( \(defun foo \(p q\) )Tj
-0.5 -1.2 Td
( \(values \(list :p p\) \(list :q q\)\)\) )Tj
ET
q
10 0 0 7 10 281.9807129 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 281.9807 Tm
( FOO )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 265.1807098 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 265.1807 Tm
( \(foo 5 6\) )Tj
ET
q
10 0 0 7 10 248.380722 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 248.3807 Tm
( \(:P 5\) )Tj
ET
q
10 0 0 7 10 231.580719 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 231.5807 Tm
( \(:Q 6\) )Tj
-0.714 -0.336 Td
( )Tj
ET
q
7 0 0 8 10 214.7807159 cm
/Im0 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 17 214.7807 Tm
( \(\(lambda \(r s\) )Tj
-0.5 -1.2 Td
( \(values r s\)\) )Tj
T*
( 7 8\) )Tj
ET
q
10 0 0 7 10 164.380722 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 164.3807 Tm
( 7 )Tj
ET
q
10 0 0 7 10 147.580719 cm
/Im1 Do
Q
BT
/T1_1 1 Tf
14 0 0 14 20 147.5807 Tm
( 8)Tj
/T1_0 1 Tf
2.143 -2.552 Td
(In the case of the function and lambda bodies, the multiple values are a\
ctually returned by )Tj
0 -1.205 TD
(something called an ")Tj
/T1_3 1 Tf
(implicit)Tj
/T1_0 1 Tf
( )Tj
/T1_1 1 Tf
(PROGN)Tj
/T1_0 1 Tf
(." This is a fancy way of saying that the bodies can )Tj
0 -1.2 TD
(contain multiple forms, and only the value of the last form is returned.\
)Tj
0 -2.562 TD
(You can use the )Tj
/T1_1 1 Tf
(PROGN)Tj
/T1_0 1 Tf
( special form when you want this behavior. )Tj
/T1_1 1 Tf
(\(PROGN form1 )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-09.html \(2 of 3\)11/3/2006 5:52:0\
7 PM)Tj
ET
EMC
endstream
endobj
1200 0 obj<>stream
/Artifact <>BDC
0 0 0 rg
0 i
BT
/T1_0 1 Tf
0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 9 0 0 9 18 780.17 Tm
(Successful Lisp - Chapter 3, Lesson 9)Tj
ET
EMC
/Article <>BDC
q
0 18 612 756 re
W* n
BT
/T1_1 1 Tf
14 0 0 14 50 753.9082 Tm
(form2 ... formN\))Tj
/T1_0 1 Tf
( evaluates )Tj
/T1_1 1 Tf
(form1)Tj
/T1_0 1 Tf
( through )Tj
/T1_1 1 Tf
(formN)Tj
/T1_0 1 Tf
( in order, and returns the value )Tj
0 -1.205 TD
(of )Tj
/T1_1 1 Tf
(formN)Tj
/T1_0 1 Tf
(.)Tj
ET
0.5 0.5 0.5 rg
10 704.265 m
10 706.265 l
602 706.265 l
601 705.265 l
11 705.265 l
11 705.265 l
h
f
0.875 0.875 0.875 rg
602 706.265 m
602 704.265 l
10 704.265 l
11 705.265 l
601 705.265 l
601 705.265 l
h
f
0 0 1 RG
0.706 w 10 M 0 j 0 J []0 d
259.1 683.124 m
308.884 683.124 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 259.1 685.2408 Tm
(Contents)Tj
0 0 0 rg
( | )Tj
ET
318.684 683.124 m
352.9 683.124 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 318.684 685.2408 Tm
(Cover)Tj
0 0 0 rg
( )Tj
( )Tj
ET
17.089 664.324 m
71.913 664.324 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 17.089 666.4408 Tm
(Chapter 2)Tj
0 0 0 rg
( | )Tj
ET
81.713 664.324 m
212.753 664.324 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 81.713 666.4408 Tm
(Chapter 3, Introduction)Tj
0 0 0 rg
( | )Tj
ET
222.553 664.324 m
334.539 664.324 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 222.553 666.4408 Tm
(Chapter 3, Lesson 8)Tj
0 0 0 rg
( | Chapter 3, Lesson 9 | )Tj
ET
466.125 664.324 m
585.111 664.324 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 466.125 666.4408 Tm
(Chapter 3, Lesson 10)Tj
0 0 0 rg
( | )Tj
ET
275.438 645.524 m
330.262 645.524 l
S
0 0 1 rg
BT
/T1_0 1 Tf
14 0 0 14 275.438 647.6408 Tm
(Chapter 4)Tj
0 0 0 rg
( | )Tj
ET
0.5 0.5 0.5 rg
10 631.865 m
10 633.865 l
602 633.865 l
601 632.865 l
11 632.865 l
11 632.865 l
h
f
0.875 0.875 0.875 rg
602 633.865 m
602 631.865 l
10 631.865 l
11 632.865 l
601 632.865 l
601 632.865 l
h
f
0 0 0 rg
BT
/T1_0 1 Tf
14 0 0 14 10 612.8408 Tm
(Copyright \251 1995-2001, David B. Lamkins )Tj
0 -1.2 TD
(All Rights Reserved Worldwide )Tj
0 -1.1 TD
( )Tj
T*
(This book may not be reproduced without the written consent of its autho\
r. Online distribution is )Tj
0 -1.2 TD
(restricted to the author's site. )Tj
ET
EMC
/Artifact <>BDC
Q
BT
/T1_0 1 Tf
9 0 0 9 18 7.17 Tm
(http://psg.com/~dlamkins/sl/chapter03-09.html \(3 of 3\)11/3/2006 5:52:0\
7 PM)Tj
ET
EMC
endstream
endobj
1201 0 obj(Successful Lisp - Chapter 3, Lesson 9)
endobj
1202 0 obj<>
endobj
1203 0 obj(http://psg.com/~dlamkins/sl/chapter03-09.html)
endobj
1204 0 obj( k~E M}!)
endobj
1205 0 obj<>
endobj
1206 0 obj<>
endobj
1207 0 obj(D,D|MҺ\rFDe)
endobj
1208 0 obj 19
endobj
1209 0 obj 19
endobj
1210 0 obj 20
endobj
1211 0 obj 20
endobj
1212 0 obj<>
endobj
1213 0 obj<>
endobj
1214 0 obj[/Indexed/DeviceRGB 255 1215 0 R]
endobj
1215 0 obj<>stream
f3 ̙f3 f3 ffffff3f 3333f333 f 3 f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333 f 3 ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333 ̙ f 3 ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f 3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33 f 3 ̙ f 3 f 3 f f f ff f3 f 3 3 3 3f 33 3 f 3 w U D " w U D " w U D " ݻwwwUUUDDD"""
endstream
endobj
1216 0 obj<>stream
Hb?800i R
7
endstream
endobj
1217 0 obj(http://psg.com/~dlamkins/sl/gifs/dot.gif)
endobj
1218 0 obj( lDFg7\nD)
endobj
1219 0 obj<>
endobj
1220 0 obj<>
endobj
1221 0 obj[/Indexed/DeviceRGB 255 1222 0 R]
endobj
1222 0 obj<>stream
f3 ̙f3 f3 ffffff3f 3333f333 f 3 f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333 f 3 ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333 ̙ f 3 ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f 3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33 f 3 ̙ f 3 f 3 f f f ff f3 f 3 3 3 3f 33 3 f 3 w U D " w U D " w U D " ݻwwwUUUDDD"""
endstream
endobj
1223 0 obj<>stream
Hb` (0?@ )
endstream
endobj
1224 0 obj(http://psg.com/~dlamkins/sl/gifs/return.gif)
endobj
1225 0 obj(zf\ny1efҒ)
endobj
1226 0 obj<>
endobj
1227 0 obj<>
endobj
1228 0 obj[/Indexed/DeviceRGB 255 1229 0 R]
endobj
1229 0 obj<>stream
f3 ̙f3 f3 ffffff3f 3333f333 f 3 f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333 f 3 ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333 ̙ f 3 ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f 3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33 f 3 ̙ f 3 f 3 f f f ff f3 f 3 3 3 3f 33 3 f 3 w U D " w U D " w U D " ݻwwwUUUDDD"""
endstream
endobj
1230 0 obj<>stream
Hb`@E` Q
endstream
endobj
1231 0 obj(http://psg.com/~dlamkins/sl/gifs/double-right-arrow.gif)
endobj
1232 0 obj(Cvh\n#b)
endobj
1233 0 obj<>
endobj
1234 0 obj<>
endobj
1235 0 obj[/Indexed/DeviceRGB 255 1236 0 R]
endobj
1236 0 obj<>stream
f3 ̙f3 f3 ffffff3f 3333f333 f 3 f3 ̙f3 ̙̙̙̙f̙3̙ ffffff3f 3333f333 f 3 ̙f3 ̙̙f3 ̙f3 ff̙ffff3f 33̙33f333 ̙ f 3 ffffff3f fff̙fff3f ffffff3f fffffffffff3ff f3f3f3f3ff33f3 f f f f ff 3f 3333f333 333̙3f333 3333f333 3f3f3f3ff3f33f 33333333f33333 3 3 3 3 f3 33 f 3 ̙ f 3 f 3 f f f ff f3 f 3 3 3 3f 33 3 f 3 w U D " w U D " w U D " ݻwwwUUUDDD"""
endstream
endobj
1237 0 obj<>stream
HW δu# lED#6'k+Rseevs:n9?fe:f`:`y\%OW=h36`l[\E9|dw
vfyaE ;F]c;,n,zK<`Wa>c/uE4,\1;at0ؿ
.="c=cekk]+K;(Ԫ^fˈ ^bR