UBC Theses and Dissertations

UBC Theses Logo

UBC Theses and Dissertations

Antics : a system for animating LISP programs Dionne, Mark Stephen 1975

Your browser doesn't seem to have a PDF viewer, please download the PDF to view this item.

Notice for Google Chrome users:
If you are having trouble viewing or searching the PDF with Google Chrome, please download it here instead.

Item Metadata

Download

Media
831-UBC_1975_A6_7 D05.pdf [ 6.35MB ]
Metadata
JSON: 831-1.0051764.json
JSON-LD: 831-1.0051764-ld.json
RDF/XML (Pretty): 831-1.0051764-rdf.xml
RDF/JSON: 831-1.0051764-rdf.json
Turtle: 831-1.0051764-turtle.txt
N-Triples: 831-1.0051764-rdf-ntriples.txt
Original Record: 831-1.0051764-source.json
Full Text
831-1.0051764-fulltext.txt
Citation
831-1.0051764.ris

Full Text

ANTICS - A System for Animating LISP Programs by Mark Stephen Dionne B. Sc. (with honor), Michigan State University, 1972 A THESIS SUBMITTED IN PARTIAL FULFILLMENT OF THE REQUIREMENTS FOR THE DEGREE OF MASTER OF SCIENCE in THE DEPARTMENT OF COMPUTER SCIENCE We accept t h i s thesis as conforming to the required standard. THE UNIVERSITY OF BRITISH COLUMBIA October, 1975 (c) Mark Stephen Dionne, 1975 In p r e s e n t i n g t h i s t h e s i s i n p a r t i a l f u l f i l m e n t o f t h e r e q u i r e m e n t s f o r a n a d v a n c e d d e g r e e a t t h e U n i v e r s i t y o f B r i t i s h C o l u m b i a , I a g r e e t h a t t h e L i b r a r y s h a l l m a k e i t f r e e l y a v a i l a b l e f o r r e f e r e n c e a n d s t u d y . I f u r t h e r a g r e e t h a t p e r m i s s i o n f o r e x t e n s i v e c o p y i n g o f t h i s t h e s i s f o r s c h o l a r l y p u r p o s e s may be g r a n t e d by t h e H e a d o f my D e p a r t m e n t o r by h i s r e p r e s e n t a t i v e s . I t i s u n d e r s t o o d t h a t c o p y i n g o r p u b l i c a t i o n o f t h i s t h e s i s f o r f i n a n c i a l g a i n s h a l l n o t be a l l o w e d w i t h o u t my w r i t t e n p e r m i s s i o n . D e p a r t m e n t o f Computer Science T h e U n i v e r s i t y o f B r i t i s h C o l u m b i a 2075 Wesbrook Place Vancouver, Canada V6T 1W5 b a t e October 27, 1975 ABSTRACT An animated f i l m i s an excellent medium for conveying complex ideas i n computer science. A system has been developed which produces animated fi l m s , f i l m s t r i p s , or s l i d e s depicting the execution of LISP programs. The design and implementation of this system i s discussed and i t i s compared to ex i s t i n g systems. The system, named ANTICS, may be used by entering very simple commands, and produces real-time animation. The system may be "backed up1* i n t e r a c t i v e l y and atomic values may be changed. Advanced commands and a set of graphics primitives are available which permit an instructor or film-maker to control minute d e t a i l s of the animation and to add features not e x p l i c i t l y provided by the system. ANTICS may therefore be used as an in t e r a c t i v e educational t o o l or as an animation system. ANTICS i s very economical to use. A three minute f i l m showing the operation of the recursive function MEMBER was produced for a t o t a l cost of $12.00. The f i l m i s included as part of the thesis. The system i s dependent on IBM 370/168 and Adage Graphics Terminal hardware, but the design, which i s based on the organization of the LISP EVAL function, could be used on other systems. i i i TABLE OF CONTENTS CHAPTER I - PROGRAM ANIMATION 1 1.1 Introduction 1 1.2 Motivation 1 •1.3 Relevant Literature 3 1.4 Types of Animation 4 1.5 Animation Methods 5 1.5.1 Key frame animation 5 1.5.2 Simple animation 6 CHAPTER II - SYSTEM DESIGN 8 2. 1 Display Design 8 2.1.1 S-expressions 8 2.1.2 Evaluation 10 2.2 Single-frame vs. Real-time Animation 13 2.3 Script Design 15 2.4 Graphics Primitives 16 2.5 Human Factors Affecting Design 17 CHAPTER I I I - IMPLEMENTATION 21 . 3.1 System Organization 21 3.1.1 The Adage Graphics Terminal 21 3.1.2 The GRAPH supervisor program 22 3.1.3 LISPBASIC 22 3.1.4 LISP/MTS 23 3.2 Display F i l e Organization 23 3.3 Methods Used i n the Program 31 3.4 Cost and Execution Time 32 CHAPTER IV - CONCLUSIONS 33 iv 4.1 Comparison With Existing Systems 33 4.2 Possible Improvements to ANTICS 33 4.3 Summary 34 BIBLIOGRAPHY 35 APPENDIX A - ANTICS USER'S GUIDE 39 1. The ANTICS Script 39 2. How to Run ANTICS 41 3. Using the System Int e r a c t i v e l y 42 4. The ANTICS EVAL Function 43 5. Additional Commands 45 6. Graphics Language 45 7. Interfacing with GLISP 49 8. Producing Films 50 9. Commands 54 10. Graphics Primitives 60 11. Useful ANTICS Variables 62 Index to ANTICS User's Guide 68 APPENDIX B - SAMPLE ANTICS SCRIPTS 69 APPENDIX C - ANTICS PROGRAM LISTING 73 V LIST OF FIGURES 1 • An Example of the Display of S-expressions 9 2 * Snapshot of EVAL Animation 12 3 • Display F i l e Organization 26 4 • Dimensions of an EVAL Box 65 5 • Dimensions of a CONS-cell 66 v i ACKNOWLEDGEMENT I would l i k e to express my appreciation to Dr. Alan Mackworth for suggesting t h i s thesis and for his he l p f u l suggestions f o r making the system more v e r s a t i l e . I would also l i k e to thank Dr. Barry Pollack and Dr. Richard Rosenberg f o r t h e i r suggestions for improving t h i s t h e s i s . 1 CHAPTER I - PROGRAM ANIMATION INTRODUCTION Animated films and displays have shown potential of becoming useful and p r a c t i c a l teaching aids i n computer science education. Animation can be used to i l l u s t r a t e actions which normally cannot be seen, and which are d i f f i c u l t to express on a blackboard because of their complexity or dynamics. These conditions often occur while teaching computer science. A system named ANTICS has been produced which animates programs written i n LISP £16], The system i s designed f o r use by an instructor in a programming course, allowing her to make fil m s which w i l l demonstrate various features of the LISP language and of algorithms programmed i n LISP. The ins t r u c t o r may control the parts of LISP which are animated, and the amount of d e t a i l which i s shown. Also, the system i s simple and economical enough to be used as an on-line i n t e r a c t i v e i n s t r u c t i o n a l aid. I2.2 MOTIVATION Teaching beginning computer science almost always has involved graphic t o o l s — a guick look through many textbooks w i l l v e r i f y t h i s . Flowcharts, data structures, system organization diagrams,' parse trees, hardware schematics and graphic representations of certa i n algorithms each have an 2 important place in the language of computer science. 1 Many computer science concepts, such as the stack, the linked l i s t , and the array have an i m p l i c i t graphic language of t h e i r own which i s invariably taught i n beginning courses. Other more dynamic concepts do not have well established graphic representations, since th e i r actions are not easy to convey with fix e d images. Examples of these are recursion, i t e r a t i o n , binding, and algorithms such as searching, sorting, and parsing. The motive for animating computer programs i s to provide new . graphic expressions for complex dynamic processes i n the f i e l d of computer science. (Complex ideas in physics already have been i l l u s t r a t e d i n several computer produced films [10, p. 313].) A vi s u a l display of dynamic processes should greatly enhance the student 1s appreciation of complex systems which are d i f f i c u l t to appreciate when explained by words and s t a t i c diagrams. An excellent appreciation of a system can be gained by "hands on" experimentation. 2 This p r i n c i p l e was found very helpful by the investigator while learning LISP: a system £ 9 ] was available which would step through programs, back up and res t a r t , change values, and so on. This type of environment forces the student to think and act about what i s happening, and can quickly lead her to a basic and confident appreciation of a system. By making the animation system i n t e r a c t i v e , the student l i t i s i n t e r e s t i n g to note that the operation of hardware i s often represented graphically by means of an oscilloscope. *This i s the motivation behind LOGO, a simple programming language which teaches mathematical and 'programming s k i l l s by being "played with" by children [ 8 ] . 3 could explore the LISP world v i s u a l l y and at her own pace. The programming language LISP i s guite d i f f e r e n t from most programming languages. S-expressions and EVAL are concepts which are unigue to LISP, and a r e l a t i v e l y experienced programmer may f e e l that she i s a beginner when she t r i e s to learn LISP. Because i t depends on these abstract concepts, LISP was selected as the language to be animated. jN 3 RELEVANT LITERATURE Although computer animation has been f a i r l y popular for a number of years, few attempts have been made to produce animated computer science f i l m s . U n t i l recently, only one s i g n i f i c a n t computer animated f i l m has been produced which i s related to computer science [15]. (This f i l m was produced by a system which cost approximately $600 per minute of f i l m [14].) Baecker and his students have done work i n t h i s area which Baecker has aptly named "program i l l u s t r a t i o n " [2]. Two systems have been produced by them. One system animates any program written i n a subset of LOGO £2, p. 160]. A fixed set of conventions determines how the execution of statements and evaluation of variables w i l l be displayed v i s u a l l y . Optional parameter settings may be added to the program to t a i l o r the timing and s p a t i a l positioning of the animation. The system has been used to animate a simple LOGO program which reverses a character s t r i n g , demonstrating features of the LOGO language as well as the concept of recursion. This system allows any LOGO program to be animated without adding s p e c i a l commands. The system i s too expensive f o r production work, however. 4 The second system animates programs written in a subset of PL/1 [2, p. 161]. Psuedo-comments, interspersed with the PL/1 source code, c a l l s p e c i a l functions which produce the animation. Producing a f i l m with t h i s system may take several hours of programmer e f f o r t since the pseudo-comments must be written for each program to be animated. However, more detailed control of the animation i s possible than i n the LOGO system. This system has been used to produce a f i l m i l l u s t r a t i n g a sorting algorithm; the f i l m followed the execution of the PL/1 program without making reference to the PL/1 language. The PL/1 system can produce f i l m c l i p s for $100 to $200 per minute. Both of these systems produce key frames which are used by a computer animation language to produce the f i n a l f i l m . (See Section 1.5.1.) Neither system can be used i n t e r a c t i v e l y . Hopgood has produced computer animated films i l l u s t r a t i n g hash table algorithms [13]. His system applies various algorithms to examples which are too large to be managed e a s i l y by hand, thus giving students an appreciation f o r the methods when applied to n o n - t r i v i a l problems. This i s claimed to show the advantage of certain algorithms more c l e a r l y than mathematical analysis or simple examples. Vj.4 TYPES OF ANIMATION Four major areas in computer science are l i k e l y to benefit from animation. The methods developed are l i k e l y to d i f f e r , and when "program animation" i s mentioned, the exact type should also be s p e c i f i e d . The areas are: 5 1. Animating algorithms, such as sorting, parsing, or searching. 2. Animating programming language features, such as "DO" i n FORTRAN or "COND" in LISP., 3..Animating hardware operation. Animating movement of data between registers, arithmetic units, memory and channels. H. Animating concepts i n computer science, such as control structures and data structures. ANIMATION METHODS Ke_y Frame Animation Hand animation and computer animation both have made use of the key frame animation technigue. An image i s f i r s t produced for every "key" frame of the finished movie, and then "less s k i l l e d " a r t i s t s (or a computer) produce intermediate "interpolated" frames, r e s u l t i n g i n the smooth movement of the figures from one key frame to the next. In the case of computer key frame animation systems, the key frames could be produced by an a r t i s t using a data tablet, or by another program. The computer uses an algorithm which matches l i n e segments i n two successive key frames and then produces intermediate frames. The l i n e segments of the f i r s t key frame are moved and lengthened or shortened gradually u n t i l they are transformed into the matching l i n e segments i n the second frame. 6 Key frame animation i s very suitable for a r t i s t i c f i l m s , where there i s no need for precise control of the i n t e r p o l a t i o n between key frames. The key frames may have d i f f e r e n t numbers of l i n e s and are usually not drawn to exact s p e c i f i c a t i o n s , and so a generalized rule i s necessary to produce adeguate animation i n every case. A generalized rule usually w i l l make assumptions and approximations, however, and may take more computation time than a special-purpose rule. Key frame animation may be useful i n producing computer science f i l m s , as Baecker has shown £2]# but i t i s not the only possible method. 1.5.2 Simple Animation Simple animation r e l i e s on the f a c i l i t i e s of a graphics system to produce animation. The tools developed for i n t e r a c t i v e graphics are extended to produce a sequence of animated displays. Hany graphics systems provide means to displace, scale, rotate and change the i n t e n s i t y of sets of vectors. These f a c i l i t i e s can be used to produce movement and other animation e f f e c t s . The d e t a i l s of producing animation i n t h i s way are more involved than in key frame animation: timing considerations and display f i l e organization may be d i f f i c u l t , and complex motions of a r t i s t i c figures may be impossible. On the other hand, since most of the detailed animating i s done at high speeds by the display processor, i t i s generally more fe a s i b l e to produce real-time " l i v e " animation by t h i s method. A frame can be set up by the main computer and movement i n i t i a t e d . While the display processor i s producing the 7 movement the main computer can be working on the next major display change. 8 CHAPTER II - SYSTEM DESIGN 2^1 DISPLAY DESIGN The overal l purpose of the ANTICS system i s to impart some knowledge of the basic operation of LISP to a beginning programmer. There are two fundamental concepts which form the foundation of LISP: the structure of S-expressions, and the operation of EVAL. The design of ANTICS i s centered on these two concepts. S-exjaressions Although S-expressions occasionally are changed during the execution of a t y p i c a l LISP program, they generally specify "structure" in some sense, and the f i r s t thing a student must do i s understand S-expressions as s t a t i c data structures. I t i s important to understand how S-expressions map into CONS-cells i n order to have a thorough knowledge of LISP, especially i n the case of c i r c u l a r l i s t s , ANTICS provides the c a p a b i l i t y of displaying a r b i t r a r y S-expressions either in "p r e t t y p r i n t e d " 3 form or as CONS-cells and pointers. Figure 1 shows a CONS-cell display. (The s c r i p t which produced t h i s display i s included i n Appendix B.) 3 P r e t t y p r i n t i n g i s a s t y l e of pr i n t i n g LISP functions which makes them easy to read. A l l of the LISP examples i n t h i s thesis are i n prettyprinted form. Figure 1 - An Example of the Display of S-expressions (actual size) 10 Since S-expressions are b a s i c a l l y s t a t i c , dynamic animation i s not p a r t i c u l a r l y applicable to them. A s o l i d understanding of S-expressions may be obtained by examining a number of examples, and t h i s i s the approach taken i n the design of ANTICS. Zj.ls.2 Evaluation The operation of EVAL i s a complex, dynamic process. It consists of a precisely ordered sequence of recursive operations on S-expressions, coordinated with the binding and unbinding of variables on a stack or a - l i s t . It i s possible to be an adequate LISP programmer without knowing e x p l i c i t l y about EVAL, and the beginning student does not need to know about i t s existence. On the other hand, the student who i s learning LISP as "just another programming language" i s r e a l l y being shown the various aspects of EVAL, and should appreciate the idea of EVAL when i t i s presented. ANTICS bases i t s animation of LISP functions on the operation of EVAL, though i t does not presume that the student has any knowledge of EVAL i t s e l f . ANTICS* animation simply r e f l e c t s the various facets of EVAL as they are brought into operation, by displaying them i n a su i t a b l e fashion. The d e t a i l s of the design have centered on selecting the parts of EVAL to display and devising suitable graphic representations for them. Not every step i n the EVAL process has been animated; the fetching of the LAMBDA-expression has been omitted, for example. Other facets of EVAL may be included i n the animation at the d i s c r e t i o n of the user, such as the display of variables. 11 the stack, and "EVLIS"* values. The basic animation proceeds as follows (refer to Figure 2): 1. The form which i s being evaluated i s printed on the display screen and, after a short i n t e r v a l , a box i s displayed containing the word "EVAL", indicating that the form has been sent to EVAL. 2. I f the form contains parameters which must be evaluated, then t h e i r evaluation i s animated to the r i g h t of the present display and the return values are moved into a column below the present "EVAL" box. After these "EVLIS" values have a l l been returned, their bindings to the dummy variables of the LAMBDA-expressions optionally are displayed and the old values of the dummy variables are placed on the stack. whenever the center of a c t i v i t y moves from the EVAL display to some other part of the screen, such as the stack display, the viewer's attention i s directed by moving a "follower" to the new area of the screen. The follower i s simply a star or other simple figure which moves to the peripheral display area at a rate which i s followed e a s i l y by the viewer's v i s i o n . 3. If the function being evaluated i s part of the LISP system 5 the returned value i s displayed aft e r removing the o r i g i n a l form from the screen. I f a user-defined *EVLIS refers to the function that evaluates arguments to LISP functions. It i s part of EVAL [16]. SA SUBS, a function written i n assembly language. 12 in — W7 i ' *"} ft J 8 DC -— ^ f= S2 f K " J a ^ w ^ a ->-i 3E. Ul 1 3 ~ 21 Q » - i Z X. o i— a kxl _l cn cr M II 1 d z : t— i *~• U7 1 x-r— r ~ cr tc UJ •—i —• d 5 g _ u £ — 2 i -in VI K U 4 2 g - 5 5 x —• in x tc UJ CD Z Ui is z 5 UJ to I I I I I 1— I l C C w I II I II I u I 1/3 3 , I II— I uiuj ui O §1 IK II II La I— z in —• 5 ^ _ i z — 5 s 5 a Z Ul a 3-* F i g u r e 2 - S n a p s h o t o f EVAL A n i m a t i o n (8/10 a c t u a l s i z e ) 13 function i s being evaluated, the expressions which constitute the body of i t s d e f i n i t i o n are evaluated i n turn. Expressions which are conditions i n a COND or SELECT function are animated to the right of the current EVAL box, while a l l other expressions are animated so as to appear d i r e c t l y below i t . 4. Throughout the animation, the d e f i n i t i o n of a function may be displayed at the top of the screen, and the portion of i t that i s currently being animated w i l l be i n t e n s i f i e d . The viewer can t e l l e a s i l y at any time exactly how the form currently being evaluated re l a t e s to the o v e r a l l function d e f i n i t i o n . 5. The LISP stack or association l i s t * o ptionally may be displayed on the screen, as well as current variable bindings. Changes in these are shown as they occur. 6. Whenever the EVAL animation or the stack display encounters the border of the display area, part of the display i s " r o l l e d o f f " the screen and disappears, thus freeing space on the display screen. When the evaluation i s exiting the r o l l e d portions reappear on the screen. 2-2 SINGLENFRAME VS.. REAL-TIME ANIMATION A computer system to produce general-purpose, high quality animation probably would have to produce one frame at a time, 6LISP systems commonly use either a stack or association l i s t (commonly c a l l e d the " a - l i s t " [16]) to save variable bindings. ANTICS w i l l animate either method. given the present state of the development of computer graphics systems. A high p r i o r i t y i n the design of ANTICS was that the system be able to produce animation i n "real-time." This means that someone could look at the display screen and see the animation exactly as i t would appear i n a finished f i l m . There were several reasons for t h i s : 1. The implementation of ANTICS would be very d i f f i c u l t i f a l l t esting had to be done by fil m i n g one frame at a time. 2. The production of properly timed films for classroom use also would be very d i f f i c u l t . 3. A real-time system also could be made in t e r a c t i v e , and t h i s would provide an extremely v e r s a t i l e , though perhaps expensive, teaching t o o l . 4. Many animation systems have produced one frame at a time. It would be valuable to help to demonstrate that t h i s i s not always necessary. 5. A real-time system e a s i l y can be made to display one frame at a time i f t h i s i s needed to produce high quality f i l m . The goal of producing a real-time system caused some implementation d i f f i c u l t i e s , but these were considered minor i n l i g h t of the f i r s t two reasons given above. In addition, single-frame animation i s much, more complicated or impossible i f the scan time of the display screen i s longer than the longest camera shutter time, and t h i s i s the case with ANTICS and the available equipment. (See Appendix A, Section 8.) 15 2^3 SCRIPT DESIGN It was assumed that a person making a f i l m with ANTICS would be a r e l a t i v e l y sophisticated LISP user (a course inst r u c t o r or a s s i s t a n t ) , and that the instructions necessary to produce a f i l m (called the script) would not need to be especially s i m p l i f i e d . On the other hand, since the system would also be i n t e r a c t i v e , a r e l a t i v e l y naive LISP programmer should be able to produce i n s t r u c t i v e animation with only a l i n e or two of input. The res u l t was the following design: 1. A single command, #EVALQ, w i l l animate the evaluation of a function once i t has been defined. 2. Several simple commands control the other basic displays. (#SH08, #STAR, #DISPLAY and #DEFON.) 3. Additional commands provide more elaborate control over d e t a i l s of the animation. 4. A sophisticated user may insert "breakpoints" into the d e f i n i t i o n s of the functions to be evaluated. The breakpoints can c o n d i t i o n a l l y change minor d e t a i l s i n the animation. 5. A general-purpose graphics language i s available to build special displays such as t i t l e s , explanatory text and figures. This language i s compatible with a subset of GLISP [11]. The choice of the syntax of commands i s limited by the syntax of LISP. Care was taken to make the order of parameters and selection of default values as consistent and l o g i c a l as possible. Timing information could be indicated in the s c r i p t i n two 16 ways: by including an absolute s t a r t i n g time as part of every command, or by providing a command to wait a given time i n t e r v a l . The second method was chosen because i t was simple to implement and because i t made the reorganization of s c r i p t s much less complicated. The types of commands that are allowed in the s c r i p t can be broken down into several groups: one group controls the major displays; a second group controls d e t a i l s of the animation; a t h i r d group i s concerned with d e t a i l s of producing f i l m s , such as timing and camera control. The reader should refer to Appendix A, Section 1 (page 39) which contains a simple annotated s c r i p t . 2 i i GRAPHICS PRIMITIVES In order to provide f l e x i b i l i t y to the user of ANTICS, a general purpose graphics language was provided. The following points were considered: 1. The user would most l i k e l y want to produce t i t l e s , diagrams, and explanatory text. She also may want to highlight portions of the animation by adding s p e c i a l e f f e c t s such as pointers or ou t l i n i n g boxes. 2. I t should be possible to include figures sketched with the l i g h t pen or data t a b l e t . 3. The graphics language should be easy to learn. An obvious choice was to base the graphics language on a subset of GLISP, a LISP based graphics language [11 ]. GLISP has a useful set of primitive functions for drawing l i n e s and text. 17 I t also allows the user to sketch figures with the l i g h t pen or data tablet and to adjust t h e i r size and position on the display screen, and also to save figures i n a l i b r a r y . Furthermore, GLISP i s supported and well documented. The GLISP primitives and data structures are i n the form of S-expressions, and t h e i r adaptation to ANTICS was simple. I t also was possible to use the GLISP primitives while writing parts of ANTICS. Additional primitives were added to produce a fade e f f e c t and " i n v i s i b l e hand drawing." (Appendix A, Section 6 (page 45) contains detailed instructions on the use of the graphics language. Appendix A, Section 10 (page 60) i s a reference l i s t of graphics primitives.) 2 A5 HOMAN FACTORS AFFECTING DESIGN Since ANTICS i s an educational t o o l , e f f o r t was made to consider i t s design in this respect. At one l e v e l , the graphic representation of concepts f a l l s under t h i s category. At another l e v e l , the timing and sequencing of the animation were considered. ANTICS also i s an i n t e r a c t i v e graphics system, and t h i s was taken into account in i t s design. The graphical representation of S-expressions i s a well established standard form, and there was not much la t i t u d e in i t s design. The method of animating EVAL i s not standard however; i t i s based on a "blackboard" method used i n a university course on LISP programming.7 This representation was 7CPSC 509, taught by Raymond Reiter at the University of B r i t i s h Columbia;, Vancouver, Canada. 18 found to be i n s t r u c t i v e by the investigator and by others taking the course. The well-defined nature of EVAL tends to l i m i t the p o s s i b i l i t y of r a d i c a l l y d i f f e r e n t graphic representations. The r e a l choxces l i e in the complexity of the functions animated and the amount of d e t a i l shown, and ANTICS provides the instructor/animator the a b i l i t y to match these choices to the l e v e l of her students. The timing and sequencing of animation were important considerations i n the design of ANTICS. Early versions of the program produced animation that was d i f f i c u l t to follow . because the "action" moved from one side of the display screen to the other without warning. The idea of a "follower" was developed: a moving figure on the screen naturally catches the eye and dir e c t s the viewer's attention to a new area of the screen. Movement was found to be very compelling v i s u a l l y — i n fact, any movement on the screen seems to lock the viewer's attention. Because of t h i s , the rule for lengthening ANTICS* animation gives p r i o r i t y to making the s t a t i c portions of the f i l m longer, since these sections allow the user to absorb the meaning of the animation sequence. Movement i s a dominating element i n entertainment animation, but i t s use i n i n s t r u c t i o n a l animation must be considered c a r e f u l l y [10, p. 66], The o v e r a l l speed of the animation must be slow enough for the viewers to follow, and t h i s speed i s not easy to define. No exact speeds can be recommended, but the following points were considered: 1. Viewers gain s k i l l at following the animation as they 19 become more f a m i l i a r with the form of representation used i n the animation. 2. For naive LISP programmers, "the slower the better" i s perhaps a very r e a l i s t i c rule for the speed of animation. (On the other hand, an authoritative source claims, " I t has been proved by experience that the shorter the f i l m the more e f f e c t i v e the ins t r u c t i o n i s l i k e l y to be, because of the intense concentration which the student must give. . ." £10, p. 136]) 3. A short f i l m can be shown several times consecutively and d i f f e r e n t facets of LISP can be emphasized each time by the i n s t r u c t o r . 4. A suitable projector can stop the animation while the instructor makes detailed explanations. 8 The speed of animation can be adjusted with the #BATE command. A one-minute f i l m can be stretched to approximately ten minutes by adding the command (#BATE 0.1) to the ANTICS s c r i p t . One way for an instructor to decide how fast animation should be i s to ask herself how much lecture time she would devote to the subject and then to scale the f i l m accordingly. (Alternatively, she might base the animation speed on cost. Section 3.4 has d e t a i l s of the cost of producing films.) Two important considerations i n the design of i n t e r a c t i v e 8 I f a single frame of f i l m i s intended to be projected, non-reversed (negative) fi l m should be used, giving black l i n e s on a white background. Film with a black background i s much more l i k e l y to melt when the projector i s stopped. 20 graphics systems are response time and methods of i n t e r a c t i o n . ANTICS' response time has been excellent due to the design of the supporting system, and no design decisions were affected by i t . (See [17] for an analysis of system response times.), Newman and Sproull recommend that i n t e r a c t i o n be primarily through a single input device as th i s i s more graceful for the user [18]., iANTICS primarily uses the Adage function buttons, since they most nearly match the c h a r a c t e r i s t i c s of the majority of the i n t e r a c t i v e requests: simple actions without parameters. (A l i g h t pen menu also f i t s t h i s a p p l i c a t i o n , but was not considered seriously since the display screen must be l e f t clear for filming.) In s p e c i a l cases other input devices were used. A d i a l was used to adjust the animation rate since i t i s easy to learn the re l a t i o n s h i p between the d i a l position and the rate. The l i g h t pen was used for "backing-up" the animation and selecting variables to be changed since pointing i s a natural way to accomplish these operations. The keyboard was used to enter animation commands and new atomic values since i t was the only p r a c t i c a l a l t e r n a t i v e . (Appendix A, Section 3 (page 42) describes how to use the i n t e r a c t i v e features of ANTICS.) Interacting with several devices i n succession can be confusing for the user, but i n ANTICS, which i s primarily an animation system, the methods described were found to be natural to use, and the goal of providing a single i n t e r a c t i v e medium was not given high p r i o r i t y . 21 CHAPTER III - IMPLEMENTATION This chapter i s concerned with important aspects of the implementation of ANTICS. I t does not cover every d e t a i l — i t refers mainly to the factors which affected the o v e r a l l structure of the implementation and which may be of i n t e r e s t to future implementors of similar systems. I i i SYSTEM ORGANIZATION The implementation of ANTICS i s dependent on a unique environment of hardware and software. This i s unavoidable due to the i n t e r a c t i v e nature of ANTICS: i n t e r a c t i v e graphics systems tend to be hardware dependent. The general organization of the implementation environment i s f a i r l y t y p i c a l of graphics systems however, and i t may be possible to modify ANTICS to work on other systems without undue e f f o r t . JAIA-I The Adage Graphics Terminal The ANTICS system i s implemented on a Model 10 Adage Graphics Terminal which communicates with an IBM 370/168 computer operating under the Michigan Terminal System £3j. The user communicates with the 370 through an IBM 3270 Display Station which i s located next to the Adage display screen. Refer to [4] f o r more information.. 22 2 The GRAPH Super visor Program The Adage Graphics Terminal contains a supervisory program named GRAPH which simultaneously controls the refreshing of the display screen and handles communication with the IBM 370/168 [6], The supervisor contains a 6000 word display buffer. Each word i n the buffer either causes a vector to be drawn on the display screen or causes one of t h i r t y - e i g h t control functions to be performed, such as scaling the size of the following vectors, displacing the X and Y axes of the display, branching to a new location i n the buffer, enabling or disabling the l i g h t pen, modifying other control words, etc. The supervisor places commands into t h i s buffer at any time under control of the IBM 370/168, and returns to the 370 any user input from the d i a l s , l i g h t pen, or function buttons which are attached to the Adage Graphics Terminal. 3.1.3 LISPBASIC LISPBASIC i s a package of LISP-callable routines which communicate with GRAPH through the standard FORTRAN int e r f a c e , AGTBASIC[7]. The LISPBASIC routines [12] assemble Adage vectors and control words, translate text into display vectors, send blocks of vectors and control words to the Adage Graphics Terminal to be displayed, and read the Adage buttons, d i a l s and l i g h t pen. LISPBASIC provides only the most primitive control of the Adage Graphics Terminal. 23 3±lsJi LISP/MTS ANTICS i s written i n LISP/MTS [20], an interpreter s i m i l a r to LISP 1.5 [16]. LISP/MTS uses an i n t e r n a l stack rather than an a - l i s t as do LISP 1.5 and several other LISP systems. 9 The animation which i s produced r e f l e c t s t h i s aspect of LISP/MTS and several other minor d e t a i l s , but since ANTICS contains i t s own EVAL function these d e t a i l s could be changed e a s i l y . The system probably would be s i g n i f i c a n t l y cheaper to run i f a LISP compiler were used. 3.. 2 DISPLAY FILE ORGANIZATION The organization of the contents of the Adage Graphics Terminal buffer, refered to hereafter as the display f i l e , was altered several times i n the course of the development of ANTICS. Newman and Sproull provide excellent information on the l o g i c a l design of i d e a l display f i l e s [18]. In ANTICS the actual display f i l e stayed f a i r l y far from the i d e a l due to hardware and software l i m i t a t i o n s and design considerations. The chief factor was the design goal of keeping ANTICS real-time and i n t e r a c t i v e . There are three basic l i m i t a t i o n s i n the Adage graphics system which affected the display f i l e organization i n ANTICS. The f i r s t i s that the Adage Graphics Terminal i s r e l a t i v e l y slow, since a l l characters are generated by software (in the IBM 370/168) and displayed as a series of vectors, and also since 9INTERLISP uses a binding method similar to an a - l i s t [ 19, p. 12. 2]. 24 a l l display f i l e commands (except vector commands) are interpreted by the GRAPH supervisor. An experimental version of the routine to display CONS-cell structures showed extreme f l i c k e r when the CONS-cell boxes were set up as displaced instances of one set of vectors which drew the box. When each box was displayed " i n - l i n e " by a separate set of draw commands the f l i c k e r was eliminated e n t i r e l y . The f l i c k e r therefore was due to the overhead time of interpreting; the displacement and jump commands i n the display f i l e . Because of t h i s , the display f i l e was designed to have a limited number of interpreted commands. . The second hardware l i m i t a t i o n of the Adage Graphics Terminal i s related to the way vectors are displayed: the X and Y coordinates of a vector command are absolute — t h e y may not be made r e l a t i v e to the previous vector. There are two reg i s t e r s , known as DX and DY, which are used to displace each vector, and these provide for movement or displacement of any set of vectors. There i s no way to increment or decrement these r e g i s t e r s , and therefore they can not be used to produce several l e v e l s of displacement. Therefore, any hierarchy b u i l t i n t o the display f i l e can have only one l e v e l of coordinate displacement provided by the system. The t h i r d l i m i t a t i o n i n the Adage graphics system i s that i t i s impossible to t e l l which instance of a subroutine c a l l was selected by the l i g h t pen. For example, i f a l l EVAL boxes were coded as one set of vectors which was displaced to various locations on the display screen, a l i g h t pen h i t of a box would only indicate that a box was h i t and not which instance of the 25 box. This problem can be solved only by a major revision.of the GRAPH supervisor which would return a stack containing a l l jump addresses which had occurred before the l i g h t pen h i t . In addition to these hardware constraints, several design factors affected the display f i l e organization. In order for the system to be i n t e r a c t i v e and real-time, the display may not be interrupted i n order to reorganize the display f i l e (to "garbage c o l l e c t " i t , f o r example). As a r e s u l t , fixed portions of the display were set aside f o r sections of the ANTIGS display f i l e which varied i n length, such as the atomic values displayed by the #DISPLAY command and the value returned from EVAL., Another design constraint resulted from the need to be able to move parts of the display in order to provide animation. The design of the display f i l e must take i n t o account the relationship of vectors that w i l l move together, as well as vectors which a l l must disappear simultaneously. In sin g l e -frame animation the display f i l e can be reorganized when changes are made in the display to produce movement, but i n a real-time or i n t e r a c t i v e system, the p o s s i b i l i t y of movement must be ca r e f u l l y taken into account at a l l . , Also, since real-time movement i s produced by slowly changing the displacement applied to a number of vectors, and the Adage graphics system only provides one l e v e l of displacement commands, the o v e r a l l design of the display f i l e must take into account the various uses of displacement commands. Several f a l s e s t a r t s were made on display f i l e design: Figure 3 i l l u s t r a t e s the f i n a l design for the display f i l e during the animation of evaluation. j 26 ADDRESS; EVAL-RETURN FWA-DISPLAY SCALE 1.0 CAMERA ON/OFF NULL/JUMP LIGHTPEN ON INTENSITY * "STEP" INTENSITY NORMAL "AUTO" LIGHTPEN OFF JUMP S K I P Z INCR DY LIGHTPEN OFF JUMP ( t o s t a c k ) LIGHTPEN ON INTENSITY * "X v a l u e JUMP u n u s e d INTENSITY * "Y = " e t c . INTENSITY NORMAL LIGHTPEN OFF box a r o u n d v a r i a b l e s C o n t r o l s e c t i o n ftDISPLAY command s e c t i o n F i g u r e ADDRESS: FWA-STAR FWA-FOLLOWER FWA-RETVAL INTENSITY BRIGHT function name INTENSITY NORMAL function, prettyprinted, normal i n t e n s i t y commands interspersed INTENSITY NORMAL underscore pjLL/JUMB SKIPZ * INCR * DX * SKIPZ * INCR * DY * JUMP/ INTENSITY BRIGHT SKIPZ * INCR * DX * SKIPZ * INCR * DY * return value JUMP * unused I n i #STAR command section Follower section Return value section Figure 3 - continued ADDRESS: EVAL-ROLL JUMP-ROLL (LOCLIST) (STACKLIST) 6001 SKIPZ INCR DY INTENSITY NORMAL DX LIGHTPEN ON NULL/JUMP * EVAL display display produced by breakpoints temporary display such as EVLIS values JUMP EVAL-RETURN free space stack entry NULL/EOL stack entry NULL/EOL etc. EOL EVAL animation section Stack display section Figure 3 - continued 29 The control section of the display f i l e always i s present. It includes the basic scaling command, commands to control the operation of the camera automatically, and two l i g h t pen "buttons" 1 0. I t also contains a short section which provides a fix e d buffer address for the displacement commands which r o l l the stack display, and a fixed address where the EVAL display can return. The fDISPLAY command section i s omitted i f there i s no display of variables. A fixed number of buffer words i s allocated for each atomic value so that the display need not be reorganized when values change. Intensity commands with normal i n t e n s i t y values are inserted betweeen the entries. These commands are changed when a variable i s brightened to indicate that i t s value has been changed or referenced. , The #STAE command section also i s optional. I t contains the vector commands which display the prettyprinted "starred" function d e f i n i t i o n . Interspersed with these are i n t e n s i t y commands set to normal i n t e n s i t y . , During animation of evaluation, these are replaced with bright intensity commands as the various parts of the function are evaluated. The follower section contains the vector commands which draw the follower symbol and the necessary commands to turn i t on or off and to produce movement. I t i s always present during evaluation animation. The return value section always i s present during animation 1 0A " l i g h t button" i s an area of the display which may be selected by the l i g h t pen to trigger some action by the system. Usually i t i s a word describing the action. 30 and contains a fixed length area which holds the vectors which display return values. It also contains commands which are modified i n order to move the return value and to make i t disappear. The EVAL animation section contains a l l the display commands producing the evaluation animation. Each l e v e l of evaluation adds to t h i s section, and removes from i t upon ex i t i n g . Displays produced by user breakpoints are placed here as well. This section begins with commands which are necessary to r o l l the display and to skip part of i t when more space i s needed on the screen. The section must end with a jump back to the control section so that the stack display i s entered properly. During animation, LOCLIST i s a l i s t of addresses of the beginning of the Adage buffer locations where each l e v e l of the the EVAL animation has placed i t s display commands. The stack display section s t a r t s at the end of the Adage buffer and exists only during evaluation animation. New stack display entries are added to the beginning of t h i s area of the buffer. A jump to the beginning of t h i s section i s located i n the control section. When parts of the stack display must disappear because i t has been r o l l e d p a r t i a l l y off the screen, an e n d - o f - l i s t indicator i s placed i n one of the words reserved for t h i s purpose. STACKLIST i s a l i s t of addresses i n the display buffer where each stack entry s t a r t s . Stack e n t r i e s are made by both LAMBDA-expressions and PROG function c a l l s . Hhen an a - l i s t i s displayed in place of a stack, a fixed number of buffer words i s set aside for each entry so that the display can be changed i f values are changed by SET or SETQ. 31 3-.1 METHODS DSED IN THE PROGRAM The heart of ANTICS i s a set of LISP functions co n s t i t u t i n g a version of the LISP EVAL function. (See [16] for a d e f i n i t i o n of EVAL.) This version of EVAL i s interspersed with c a l l s to animation routines, and t h i s i s how a l l animation i s produced. The stack, variable and "s t a r " displays are also driven by ANTICS EVAL, and user breakpoints are detected and processed by i t . As a r e s u l t , the animation naturally follows the execution of EVAL and ANTICS has a simple underlying structure. The highlighting of the "starred" function by in t e n s i f y i n g parts of i t as animation progresses i s accomplished by in s e r t i n g breakpoints i n t o i t s d e f i n i t i o n which are si m i l a r to user breakpoints. These contain the Adage buffer address where a word has been reserved; ANTICS EVAL intercepts these breakpoints and places an i n t e n s i f y command i n the buffer location. (Both types of breakpoints must be detected and ignored at many other places i n ANTICS.) Inte r a c t i v e l y "backing up" the system i s done by using the LISP/MTS UNEVAL function to return to higher l e v e l s of ANTICS EVAL, and clearing part of the display. The routine which displays CONS-cells also uses some novel methods. When given a l i s t i t draws a CONS box, and then c a l l s i t s e l f recursively with the CAR of the l i s t . The return value i s a pair of dimensions indicating the physical s i z e of the display which was generated. These dimensions are used to locate the display of the CDR which i s generated by a second recursive c a l l . 32 i i i COST AND EXECUTION TIME I t was o r i g i n a l l y assumed that ANTICS would be expensive to use since i t combined two r e l a t i v e l y expensive items i n terms of computer charges: LISP and graphics. Development and debugging costs were not p a r t i c u l a r l y low, but the cost of producing animated films has turned out to be su r p r i s i n g l y low. A three minute-twenty second f i l m i l l u s t r a t i n g the execution of the recursive function MEMBER was produced f o r a t o t a l computation cost of $4.23 u t i l i z i n g 5.4 seconds of central processor time. 1 1 (The s c r i p t for t h i s f i l m i s included i n Appendix B.) The cost of f i l m and processing was $7.50., The example should probably have been slowed down two or three times to make i t easier to follow. This would only add a s l i g h t a d d i t i o n a l computation charge, as only the elapsed time and v i r t u a l memory usage would increase. 1 1 The cost could be reduced even further i f a compiled version of ANTICS was used rather than the present inter p r e t i v e system. 33 CHAPTEE IV - CONCLUSIONS COMPARISON WITH EXISTING SYSTEMS Few program animation systems have been developed, and i t i s d i f f i c u l t to compare ANTICS to those that e x i s t . ANTICS* strong points — i t s cheapness and i n t e r a c t i v e c a p a b i l i t y — are not found i n any other systems. Also, existing systems have been designed to present subject areas quite d i f f e r e n t from ANTICS*. One thing that can be said i s that ANTICS i s not a general system i n the same sense as the PL/1 animation system described i n [ 2 ] . ANTICS* primary use i s to teach features of LISP. After LISP i s mastered and students are f a m i l i a r with the s t y l e of ANTICS' presentation, the system could be used, perhaps, to i l l u s t r a t e general properties of algorithms. (For example, by animating EVAL i t s e l f . A s c r i p t for t h i s i s included i n Appendix B.) Ii2 POSSIBLE IMPROVEMENTS TO ANTICS An improvement which could be added to the present system would permit more complex functions to be animated. The 6000 words of the Adage Graphics Terminal buffer are f i l l e d f a i r l y quickly. (The display of Figure 2 (page 12) uses approximately 2900 words.) In the current implementation of ANTICS, when part of the display has r o l l e d off the screen i t remains i n the buffer. This part of the display buffer could be saved i n the 34 IBM 37 0/168 memory and the Adage memory could be made avai l a b l e . I t would not be easy to accomplish t h i s without blinking the display, since the contents of the Adage buffer would have to be reorganized. Since the usefulness of long and complex animations seems somewhat doubtful, t h i s extension was not considered i n d e t a i l . If thi s modification were made, another modification probably should be made to the routines which r o l l the display, allowing them to r o l l to the l e f t as well as upward. 4^3 SUMMARY A system has been implemented which animates LISP programs. The system can be used to produce animated f i l m s , f i l m s t r i p s and s l i d e s , or i t may be used i n t e r a c t i v e l y as an i n s t r u c t i o n a l aid. The cost of using the system i s very low compared to other systems. The system w i l l operate only on a s p e c i f i c hardware configuration, but elements of i t s design could be useful to other possible implementations. BIBLIOGRAPHY 36 [ 1 ] Baecker, B. M., Towards Animating Computer Programs: A F i r s t Progress Report, Proceedings of the Third National Research Council M a n-C o m p_ute r Communications Seminar. May, 1973, 4,1-4.1 0 7 £2] Baecker, R. M., Two Systems which Produce Animated Representations of the Execution of Computer Programs, SIGCSE B u l l e t i n , Feb., 1975, Vol. .7 No.,1, pp. 158-167. [3] Choit, M. D. (ed.). The MTS Commands Manual, University of B r i t i s h Columbia Computing Centre, 1970. [4] Coulthard, W. J . , Operator's Manual f o r the Adage Graphics Terminal, University of B r i t i s h Columbia Computing Centre, 1970. £5] Coulthard, W. J . , UBC CAMERA - Use of a Camera at the Adage Graphics Terminal, University of B r i t i s h Columbia Computing Centre, 1972. £6] Coulthard, W. J . , UBC GRAPH - A Simple Interactive Graphics Package, University of B r i t i s h Columbia Computing Centre, 1971. £7] Coulthard, W. J . ; DeKleer, J . , UBC AGTBASIC - Basic Communications Package for the Adage Graphics Terminal, University of B r i t i s h Columbia Computing Centre, 1971. £8] Feurzeig, W.; Papert, S.; et. a l . , Programming Languages as a Conceptual Framework f o r Teaching Mathematics, Bolt Beranek and Newman Inc. Report 1889, 1969. £9] Friedman, P., An Interactive Debugging Package f o r LISP/MTS, Haster's Thesis, University of B r i t i s h Columbia, Department of Computer Science, 1973. £10] Halas, J.; Manvell, R., The Technique of Film Animation, Communication Arts Books, New York, 1971. £11] H a l l , W.; J e r v i s , B.; J e r v i s , J . , GLISP - A LISP Based Graphic Language, University of B r i t i s h Columbia Department of Computer Science. £12] H a l l , W.; J e r v i s , B.; J e r v i s , J . , LISPBASIC - A LISP-AGTBASIC Interface, University of B r i t i s h Columbia Department of Computer Science, 1973. £13] Hopgood, F. R. A., Computer Animation Used as a Tool i n Teaching Computer Science, Proceedings of the 1.974 International Federation of Information Processing Societies Conference, North-Holland Publishing Co., 1974, pp.~889-892.. " 37 [14] Knowlton, K. C. , Computer Produced Movies, Science, Nov. 26, 1965, Vol. 150, p. 1116. [15] Knowlton, K. C , 16: B e l l Telephone Laboratories Low Level Linked L i s t Language, two black and white sound f i l m s . B e l l Telephone Laboratories, J3urray H i l l , N.J., 1966. [16] McCarthy, J . ; Levin, M. I., et. a l . , LISP 1 ..5 Programmer's Manual, M.I.T. Press, 1962., [17] M i l l e r , R. B., Response Time i n Man-Computer Conversational Transactions, Proceedings of the F a l l Joint Computer Conference f 1968. Vol. 33, pp. 267-277. [18] Newman, W. M.; Sproull, fl. F., Pr i n c i p l e s of Interactive Computer Graphics, McGraw-Hill, New York, 1973. [19] Teitelman, W., et. a l . , 1NTERLISP Reference Manual, Xerox, Palo Alto Research Center, 1974. [20] Wilcox, B.; Hafner, C , IISP/MTS User^s Guide, University of B r i t i s h Columbia Department of Computer Science, Sept., 1974. 3 8 APPENDIX / 39 APPENDIX A - ANTICS 0SEE1S GUIDE USING THIS GUIDE Reading Sections 1 and 2 i s a bare minimum for using ANTICS. A casual user w i l l want to read Sections 1 through 5, and an advanced user or film-maker should read a l l sections. A l l users w i l l want to refer to Section 9, ANTICS commands. This guide presupposes some f a m i l i a r i t y with LISP/MTS [20], MTS [3] and the Adage Graphics Terminal [ 4 ] , Is. THE ANTICS SCRIPT The input to ANTICS i s a series of LISP forms c a l l e d a s c r i p t . When a movie i s being produced t h i s s c r i p t must be en t i r e l y on an MTS f i l e so that i t can be read without interruptions, which would confuse the timing of the movie. There i s no reason why the s c r i p t cannot be entered one l i n e at a time when the system i s being used i n t e r a c t i v e l y or while experimenting with ideas. A s c r i p t may consist of several l i n e s to produce an animation of a single LISP evaluation, or i t may contain a hundred or more l i n e s to produce a complete movie with t i t l e s and explanatory text. The following s c r i p t produces a rudimentary animation: 40 (#START) (DEFON MEMBER (THING LIST) (COND ( (NULL LIST NIL) ((EQUAL THING (CAR LIST)),LIST) (T (MEMBER THING (CDR LIST)) ) ) ) (#DISPLAY THING LIST) (#8AIT 5) (tEVALQ (MEMBER «A ' (C A T) ) ) #STAST i n i t i a l i z e s some parameters and blanks the display screen. BEFUN simply defines the function of interest i n the usual way. #DISPLAY causes the names and values of the atoms THING and LIST to be displayed on the screen. They w i l l remain u n t i l the screen i s blanked, and the display . w i l l be changed whenever t h e i r values change. #8AIT causes a f i v e second pause before the next l i n e of the s c r i p t i s executed. #EVALQ causes a complete animation sequence, l a s t i n g perhaps several minutes, of the EVALuation of the given form. During t h i s animation the values of the atoms spec i f i e d by the #DISPLAY command are updated constantly. There are two additional major commands which could be added to the above s c r i p t anywhere before the #EVALQ command: (#SIACK THING LIST) (#STAE MEMBER) #STACK causes a stack to be displayed.during animation showing the bindings of the atoms THING and LIST. No display i s produced when the #STACK command i s given — the display i s shown during the animation produced by #£VALQ. Optionally, an a - l i s t may be displayed i n place of the stack. #STAR causes the 41 d e f i n i t i o n of MEMBER to be shown immediately at the top of the display screen. During the animation produced by #EVA1Q the portion of t h i s " s t a r " function currently being evaluated w i l l be i n t e n s i f i e d . These commands are the basic high-level animation features of ANTICS. The user can obtain a great deal of variety, however, by selecting options, changing parameters, and producing a d d i t i o n a l graphical displays with the graphics primitives included with ANTICS. 2^ HOW TO RON ANTICS Before attempting to use ANTICS, make sure that the GRAPH supervisor program i s running i n the Adage Graphics Terminal. GRAPH usually i s ready; i f i t i s necessary to res t a r t i t , see [6], (Either of the current versions of GRAPH w i l l work.) ANTICS may be run by executing the MTS command: $SOURCE HASD:ANTICS while signed on at the 3270 Display Station at the Adage Graphics Terminal. A #START command i s executed automatically and the user may define a function and use #EVALQ immediately to see the animation. The PF9 key i s set to " (#BLANK)" and may be used to clear the screen. The PF6 key i s set to "NIL" and may be used to e x i t from BREAK loops. A s c r i p t may be read by using the MTS command: $CONTINUE WITH s c r i p t RETURN where " s c r i p t " i s the name of a f i l e containing the ANTICS commands comprising the s c r i p t . I f a medium length or longer s c r i p t i s used, the 3270 Display Station may go into pause mode 42 when the return values of the commands are l i s t e d . This may be avoided by placing a PRGGN c a l l around a l l of the commands or by using the %FAST device command to prevent the 3270 from pausing. I i USING THE SYSTEM INTERACTIVELY Although ANTICS i s designed primarily f o r making movies, i t i s f a s t enough to support i n t e r a c t i v e use. Interaction i s by means of the l i g h t pen and function buttons. (An overlay card i s provided which labels the function of the various buttons.) Whenever ANTICS i s waiting, both of these devices are acti v e . During animation, #WAIT i s c a l l e d before and af t e r evaluating each form. There are two modes of i n t e r a c t i v e operation: STEPMODE and AUTOmatic. STEPMODE i s selected by pressing the STEPMODE button (15) or by using the l i g h t pen i n any way. While in STEPMODE, the function #WAIT always waits u n t i l either the STEP button (13) i s pushed or the STEP l i g h t button i s selected with the l i g h t pen. The STEP l i g h t button i s i n t e n s i f i e d while ANTICS i s waiting. In AUTO mode, the #WAIT function waits the s p e c i f i e d time, unless the STEP button i s pushed f i r s t . AUTO mode i s selected by pressing the AUTO button (16) or by pointing the l i g h t pen at the AUTO l i g h t button. The l i g h t pen has two other functions as well. At any time i t may be pointed at any variable i n the l i s t created by #DISPLAY, and a new value for the atom may be entered through the keyboard. The l i g h t pen also may be pointed to any part of the evaluation display, and the animation w i l l back up to-that point and rest a r t . 4 3 There are several other buttons which may be used at any time. The QOIT button (10) causes a return to the top l e v e l of LISP. This w i l l terminate an animation sequence and proceed to the next command i n the s c r i p t . The animation display i s not erased. The PLOT button (9) w i l l plot whatever i s on the display screen at the time i t i s pushed. I t i s i d e n t i c a l to the command #PL0T. The BREAK button (11) enters a LISP/MTS break loop for debugging purposes. If this button has been used, the animation may be resumed by entering NIL from the keyboard or by using the PF6 key. The CAMERA button (12) turns the camera on or off a l t e r n a t i v e l y , using relay 1. , The BACKUP button (5) causes the l a s t form v i s i b l e on the display of animation to be re-evaluated and animated. This button i s enabled only during evaluation animation. The RATE button (14) reads a value from the Adage d i a l MA n and c a l l s the #RATE command to change the rate of animation. This can be used to experiment with various speeds of animation; the #RATE value which was used i s printed and a fRATE command l a t e r can be inserted into the s c r i p t when an appropriate value has been established. High #RATE values can be used to preview an animation quickly. (Note that the l i g h t pen has trouble responding when the animation proceeds too quickly. When t h i s happens, the STEPMODE button may be used before the l i g h t pen i s used.) iU THE ANTICS EVAL FUNCTION In order to produce animation, ANTICS contains i t s own EVAL 4 4 function which i s interspersed with c a l l s to graphics routines. This EVAL contains some p e c u l i a r i t i e s and l i m i t a t i o n s of which the user of ANTICS must be aware. None of these are r e s t r i c t i n g to the kind of LISP functions which are l i k e l y to be animated. In most respects, ANTICS' EVAL appears l i k e LISP/MTS rather than other LISP systems. The basic r e s t r i c t i o n i s that the ANTICS EVAL uses i t s own int e r n a l a - l i s t to store atomic values. (See [16] for a description of the use of the a - l i s t . ) Therefore, ANTICS atoms and LISP/MTS atoms are completely independent (except when CAR and RPLACA are used on atoms — they w i l l refer to LISP/MTS atomic values). This also means that FSOBRs and NSUBRs a l l must be e x p l i c i t l y coded into the ANTICS EVAL, or else they may try to get atomic values from LISP/MTS in the normal fashion., The following functions, normally FSOBRs or NSUBRs have been coded into the ANTICS EVAL: COND AND OR SELECT PROG SET SETQ SELECTQ The following commonly used FSOBRs and NSUBRs are not available during animation: DEFUN UNCONS DEFINE LABEL DEFPROP UNTIL WHILE DO STATUS Additionally, two functions have been provided for use i n the s c r i p t : #SET and #SETQ. They appear to work exactly as SET and SETQ normally do in LISP/MTS, except that they work with the ANTICS EVAL a - l i s t . If a variable i s set which i s not yet on the a - l i s t , i t i s appended to the a - l i s t . (This i s d i f f e r e n t from LISP 1.5.) 45 If EVAL or APPLY are c a l l e d within a function being animated, the ANTICS EVIL, or APPLY i s used. EETUEN and GO should only be used d i r e c t l y within a PROG. RETURN may not take a second parameter. GO must be given a l a b e l name, i t w i l l not c a l l EVAL. FEXPRs, NEXPRs and no-spread functions may be used, as well as the function AEG. (Calls to ARG may have only one argument.). I f a function i s undefined then the value of the function name i s taken, and i f i t i s not NIL i t i s treated as the function d e f i n i t i o n (as done i n LISP 1.5). The various MAP functions should not be used. Since ANTICS EVAL does not contain a l l of the normal LISP error messages, i t i s important to be sure that a function i s correct before attempting to animate i t . 5^ ADDITIONAL COMMANDS The command #DEFUN has exactly the same e f f e c t s as LISP DEFUN, and in addition i t causes a display. The DEFUN statement i t s e l f i s displayed at the top of the screen, and the CONS-cell structure i s displayed below. The command (#SH08 S X Y) displays the CONS-cell structure of the given S-expression on the screen, s t a r t i n g at coordinates X,Y. C i r c u l a r S-expressions may be displayed i n t h i s manner. These and other commands are explained in d e t a i l i n Section 9 . fLs. GRAPHICS LANGUAGE There i s a general purpose graphics language available to 46 the user of ANTICS. It contains both graphics primitives and sp e c i a l functions for displaying LISP structures. This graphics language can be used d i r e c t l y i n the s c r i p t to produce a variety of displays within the movie, such as text and diagrams. I t also can be used within special breakpoints which may be inserted into a function whose evaluation i s being animated. By using these breakpoints, which are i n v i s i b l e to the viewer of the movie, the user of ANTICS may , t a i l o r the evaluation animation by omitting unnecessary d e t a i l and displaying explanatory messages and figures at key points i n the animation. Det a i l s of the i n d i v i d u a l primitives are found in Section 10. 6..1 GRAPHICS LANGUAGE WITHIN THE SCRIPT When a command i s included i n the s c r i p t , the graphics display which results i s shown automatically on the screen. When graphics primitives are used, however, they must be embedded in the command #DISP in order to be displayed. For example: (#DISP (*SYMBQL -2.5 .6 'HELLO 1.) (•SYMBOL -2.5 -.6 * THERE 1.)) may be included i n the s c r i p t to display the message on the screen. The message w i l l remain on the screen u n t i l the next #BLANK command. Successive #DISP commands w i l l cause a display to be b u i l t up on the screen, and the #WAIT command may be used to control the timing. The FOR or FADE primitives may be used i f i t i s desired to have part of the display turn o f f before using the #BLANK command to clear the entire display. Even i f FADE or FOR have caused the entire screen to be blanked, #BLANK 47 should be used so that a l l locations i n the display buffer are made available. 6.2 GRAPHICS LANGOAGE EMBEDDED IN FUNCTIONS TO BE ANIMATED Breakpoints may be inserted into any function to be evaluated. The form of a breakpoint i s : (# ENTRY-FORM FORM EXIT-FORM) FORM i s part of the function which i s being animated. Before FORM i s evaluated and animated, ENTRY-FORM i s evaluated by, LISP/MTS. ENTRY-FORM may contain graphics primitives and i t also may change various parameters e f f e c t i n g the animation i n progress. (See Section 11 for information on ANTICS variables.) After FORM i s evaluated and animated, and the animation display i s removed from the screen, EXIT-FORM, which i s optional, i s evaluated by LISP/MTS. Graphics primitives may be included in ENTRY-FORM, and they w i l l be displayed on the screen when the text of FORM i s displayed. The display w i l l remain on the screen u n t i l a return i s made from the evaluation of FORM. I f a shorter time i s desired, the FOR primitive should be used. Graphics primitives used within EXIT-FORM should be included within the command (#EXIT-DISP SECONDS primitives) i n order to be displayed for the given number of seconds. The following notes apply to breakpoints: 1. The variables X and Y are the coordinates where the text of FORM w i l l be displayed as part of the animation. They may be used to locate displays generated by the breakpoint. 48 The variables #TIMES i s bound to the t o t a l number of times the pa r t i c u l a r breakpoint has been entered within the current animation. It can be used, for example, i n a conditional expression to make the breakpoint*s action dependent on the number of times the viewer has been shown a p a r t i c u l a r d e t a i l . Two variables, VAF1 and VAR2, are protected by a PROG and may be used to pass values from ENTRY-FORM to EXIT-FORM. The value returned from the evaluation of FORM i s avail a b l e to EXIT-FORM as RETURN-VALUE. The animation may be turned on or off by setting DISP? to T or NIL. This may be done only i n ENTRY-FORM. When animation i s turned o f f , three dots are displayed on the screen as an i n d i c a t i o n . If OLD-DISP? i s set to NIL i n addition to setting DISP? = NIL, the three dots also w i l l be omitted from the display. An ENTRY-FORM can override the e f f e c t of a #DEPTH command by setting DISP? to T. FORM may be omitted from a breakpoint. In t h i s case, the breakpoint consists of ENTRY-FORM alone. This may be useful whenever a l i s t of forms i s being evaluated, as i n PROGs or conditional statements. The value returned from ENTRY-FORM i s returned, and w i l l be s i g n i f i c a n t within conditional expressions such as AND and OR. A dummy LISP/MTS function named "#n i s supplied which 49 simply EVALs FORM. This permits functions containing breakpoints to be evaluated by LISP/MTS for te s t i n g . If FORM i s omitted from the breakpoint NIL i s returned. (See Note 7 above.) 9. ANTICS EVAL atomic values may be obtained by c a l l i n g the function •VALUE. The form i s : (•VALUE ATOM A ERR) The value of ATOM i s the name of the atom, A i s the ANTICS a - l i s t (named A), and ERR i s evaluated and returned i f ATOM i s undefined. Is. INTERFACING WITH GLISP Several of the graphics primitives i n ANTICS are i d e n t i c a l to low l e v e l GLISP functions (See [11]). This feature allows the user of ANTICS to create SUBROUTINES in GLISP and include them as part of her ANTICS s c r i p t . One of the various GLISP sketching routines can be used to draw a picture which i s then included as part of the ANTICS s c r i p t , perhaps as part of the movie t i t l e s . GLISP SUBROUTINES which, use the following functions may be inserted d i r e c t l y into the ANTICS s c r i p t : •GOTO • PLOT •SYMBOL •INTENSITY •DASH •UNDASH •FOR ADJ(without dials) GPROG •JUMP •SKIPNZ •SKIPZ The SUBROUTINE name must be included, though i t i s ignored. SUBROUTINES may not be included within ANTICS breakpoints, although •GOTOs, •PLOTS and •SYMBOLS created by GLISP may be 50 included. Note that ANTICS does not treat SUBROUTINES the same way that GLISP does — they are displayed when they are encountered in the s c r i p t and they do not need to be c a l l e d i n any way. Also, when primitives created by GLISP are inserted i n t o ANTICS breakpoints, i t should be remembered that ANTICS1 scale i s set to 1.0 while GLISP runs with a scale setting of 0.5. The SUBROUTINE function in ANTICS automatically adjusts the scale to 0.5 when GLISP SUBROUTINES are included d i r e c t l y i n the s c r i p t . The following GLISP SUBROUTINE produces a box which outlines the area of the screen where ANTICS produces animation, and where a Super-8 mm. camera should be pointed. (SUBROUTINE FRAME (*G0T0 -10. 10.) (*PL0T 10. 10.) (*PLOT 10. -4.8) (*PLOT -10. -4.8) (*PLOT -10. 10.) ) 8. PRODUCING FILMS ANTICS can be used to make fi l m s t r i p s , s l i d e s , or animated f i l m s . Film s t r i p s or s l i d e s can be made using STEPMODE (described i n Section 3.) and simply photographing suitable steps i n the animation seguence [ 5 ] 1 2 . The following steps w i l l 1 2The exposure settings given i n t h i s reference might be reduced to give better r e s u l t s . 51 produce a f i l m with minimum f l i c k e r . This elaborate procedure i s necessary due to the inherent incompatibility of the camera's shutter speed and the Adage refresh rate. The procedure i s given as a guide f o r experimentsation. Some d e t a i l s may possibly be changed -— especially the Adage refresh rate and the exposure setting. 1. Press the RESET and then the RUN buttons on the Adage display console. Execute the HTS command: $COPY AGT:GRAPH >AGTI 2. Set the Adage refresh rate to 30 times/second: a. Set the switches on the Adage control console to 22000 01612 (octal) and press PULSE1. The l i g h t s i n the button register should read 61014 00001 (octal). I f they do not, AGT:GRAPH has been changed. b. Press RESET BR and set the button reg i s t e r to 61014 00002 by pressing the buttons (which also l i g h t up). (Setting the buttons to 61014 O0O0N w i l l set the refresh rate to 120/ (N+2) times/second.) c. Set the switches to 20200 01612 and press PULSE1. Set the switches to 20200 00754 and press PULSE1. d. Place the statement (SETQ FRAMES/SEC 30) at the beginning of your ANTICS s c r i p t . 3. Set the f-stop on the NIZO S 56 camera to f/1.8. , If the indicator needle f a i l s to move the mercury batteries are dead. In that case, the shutter w i l l stay open to f/1.8 and the f i l m s t i l l w i l l be properly exposed. Check the motor batteries by pressing the power switch forward — i f the exposure meter reads to the right of f/8 the batteries 52 are low. Set the camera speed to 18 frames/second. Set the f i l t e r for a r t i f i c i a l l i g h t . Load the camera with Kodak "4-X Reversal Film 7277" (ASA 400 r a t i n g ) . The master int e n s i t y control knob located under the Adage display screen should be set with the mark pointing straight down. Set the camera on a tripod about 3 to 4 feet from the Adage display screen. Run ANTICS. (See Section 2.) Execute a #FOC0S command and adjust the camera by t i l t i n g the tripod and moving the zoom lens. Focus the camera c a r e f u l l y . Press the STEP button (13) to end the iFOCUS command. If the camera i s connected to the Adage relay 1 (on top of the display console), the #CAMERA command i n the s c r i p t w i l l turn the camera on or o f f . See the example MEMBER i n Appendix B for a good way to organize the s c r i p t . I f the camera i s being controlled by the relay, leave the camera's power switch off u n t i l you have fin i s h e d experimenting. Run ANTICS and expose the f i l m . The room l i g h t s should be turned o f f and the l i g h t s on the Adage control panel should be covered. A 50 foot cartridge l a s t s 200 seconds at 18 frames/second. To expose more than one cartridge, press the STEPMODE button (15), change f i l m , and press the AUTO button (16). The camera w i l l be stopped and restarted. A l t e r n a t i v e l y , the f i l m can be stopped automatically by i n i t i a l l y setting the variable FILM-LENGTH to the number of seconds of f i l m to be exposed. Hhen ANTICS has turned the camera on for t h i s length of time i t w i l l stop the 53 animation and the camera, print a message, and enter a LISP break loop. You may then change the f i l m and type "NIL" to restart. If the new cartridge i s a d i f f e r e n t length than the previous one you may change the value of FILM-LENGTH with SETQ before leaving the break loop. This feature w i l l not stop the camera during the time that a #DRAW command i s executing. 8. The actual elapsed time of a s c r i p t seems to vary with system load. This can cause problems i f you are trying to exactly f i l l a f i l m cartridge., The #RATE command can be used to adjust the duration of animation. 9. If the ADAGE i s given frames to display which take longer than 1/30 second, the frame rate w i l l change and you may get an objectionable strobe e f f e c t or f l i c k e r on the f i l m . The most complex frames in the HEMBE.fi example, displaying 7 EVAL boxes, take almost exactly 1/30 second. (See Figure 2 (page 12) . This figure represents the most complex frame of the film.) To test i f frames take longer than the present Adage refresh time, set the button reg i s t e r to 23004 00077, set the switches to 20200 01601, and press PULSE1. (Do not do t h i s while ANTICS i s running.) Run the s c r i p t , and when frames take longer than the refresh time the IC1 l i g h t w i l l f l a s h and the display screen w i l l blink i n an unmistakable fashion. Repeat steps 1 and 2 to reset t h i s . I f your animation has frames which take longer than 1/30 second, you may try simplifying i t by shortening variable names, removing options, etc. You also may 54 experiment with d i f f e r e n t camera speeds and refresh rates. F l i c k e r and "strobing" can be monitored by opening the camera^ back and looking through the lens while the shutter i s operating. (This w i l l work only when the projection speed i s roughly the same as the camera speed.) A f i n a l a l t e r n a t i v e i s to experiment with the slow-motion feature on the camera while se t t i n g the animation speed very low with the #BATE command and the variables FOLLOW-RATE and MOVE-RATE. Remember that i t i s impossible to get perfect exposure of the f i l m as long as the longest shutter time (1/40 second) i s shorter than the time required to produce an image on the display. 11. Bhen you are fi n i s h e d repeat step 1. Set the switches on the Adage console to 24000 77776 (octal). 9.. COMMANDS NOTATION Arguments which are enclosed i n angle brackets (such as <X>), are optional; they may be omitted. Braces indicate that one alternative should be chosen, as i n {QN,0FF}. Elipses indicate that one or more occurrences of the argument may be given, as i n (#DISPLAY ATOM 1 . . . ATQUS) • A r i underscored parameter i s one which w i l l not be evaluated. Values returned by commands and primitives are meaningless unless s p e c i f i e d . (#START) #START resets several ANTICS features, #BLANKs the display screen, and i n i t i a l i z e s the timer used by #END. The following actions are also taken: 1. The stack display i s turned o f f (see #STACK) . 55 2. The animation depth i s set to 10000 (see 4'OEPTH). (#DEPTH = 10000). 3. The animation time delays are reset to normal. The rates of movement of return values and the follower are reset to normal., (Thus the e f f e c t of #FAST i s reset.) 4. The displaying of EVLIS values i s turned on. (EVLIS? = T, EVLIS-NOVE? = T) 5. The movement of return values i s turned on. (RETURNS? = T) 6., Prettyprinting i s set so as to translate (QUOTE S) to 'S. (SHORTQUOTE = T). 7. The e f f e c t s of a l l tBRIEF and #EXCLUDE commands are reset. (tDEFUN NAME <TYPE> ARGLIST SI . . . Sn) This i s i d e n t i c a l to LISP/MTS DEFUN. In addition to defining the function, the DEFUN statement i t s e l f i s prettyprinted at the top of the display screen, and after a short i n t e r v a l , the CONS-cell structure of the resul t i n g LAMBDA-expression i s displayed below. A #BLANK command normally should be used immediately before #DEFUN, and a suitable #WAIT and #BLANK should be used after i t . (#STAR FN MI) This command i s used to name the "sta r " function of an evaluation animation and to prettyprint the function's LAMBDA-Expression at the top of the display screen. I t i s used after a #BLANK command and before one or more #EVAL or #EVALQ commands. The display w i l l remain u n t i l a #BLANK command i s given, and only one #STAR command may be given between two #BLANK commands. (#DISPLAY ATOM 1 . . . . ATOMn) The given atoms 1 names, along with t h e i r values, are displayed i n the upper right-hand corner of the screen. The arguments to no-spread LAMBDA-expressions may be displayed by entering numbers i n the l i s t of atoms: (#DISPLAY 1 N) w i l l display "ARG 1" and N. Any succeeding changes i n the atomic values w i l l be r e f l e c t e d i n the display. Whenever ANTICS i s waiting (the STEP l i g h t button i s intensified,) the display w i l l respond to the l i g h t pen and values may be changed. The display remains on the screen u n t i l the next #BLANK command, and only one #DISPLAY command should be given between two #BLANK commands. Also see the #REDISP command below. 56 (#STACK AT0M1 ... . . ATOHn) (#STACK #ALL7 (#STACK) This command controls the stack display, which i s only apparent during the animation produced by #EVAL or #EVALQ. If a l i s t of atoms i s given, only the stack bindings of those atoms w i l l be displayed during animation. The bindings of no-spread LAMBDAS may be shown by entering numbers i n the l i s t of atoms. For example, {#STACK N 1) w i l l show the bindings of N and "AEG 1". <#STACK #ALL) causes a l l bindings to be displayed. In either case, every LAMBDA and PBOG w i l l produce at least an empty entry i n the stack display (a dashed l i n e ) . (#STACK) turns off the stack display. The display i s also turned o f f by the #STABT command. I f the variable ALIST? i s non-NIL an a - l i s t i s displayed i n place of the stack. The #STACK command s t i l l must be given and only the specified atoms are shown on the a - l i s t display. Bhen SET or SETQ change a value on the a - l i s t the display also i s changed. If SET or SETQ set the value of an atom which i s not on the a - l i s t , the value i s placed on the end of the a - l i s t , but t h i s i s not shown i n the a - l i s t display.. (This would be an error i n LISP 1.5.) (#EVAL FOBM <ALIST>) (#EVALQ FORM <ALIST>) These both cause the evaluation of FOBM to be animated. #EVAL f i r s t evaluates i t s argument with LISP/MTS. When the animation i s f i n i s h e d , the return value from the evaluation w i l l be l e f t on the screen; i t w i l l disappear when the next #EVAL, #EVALQ, or #BLANK i s encountered. ALIST may be s p e c i f i e d i n the form {{ATOM . VALUE) . . . (ATOM .VALUE)). The default ALIST contains T, any values set by #SET or #SETQ, and "top level'! values set by SET or SETQ i n previous animations. (#BLANK) This clears the display screen, except f o r the STEP and AUTO l i g h t buttons when ANTICS i s i n STEPMODE. The effects of #STAB and #DISPLAY are reset completely. The #STACK, #BBIEF and SEXCLUDE commands are not reset. (#WAIT SECONDS) ANTICS pauses f o r the given number of seconds. #WAIT i s used i n the s c r i p t to adjust the timing of the movie. When ANTICS i s i n STEPMODE, #BAIT always w i l l wait u n t i l the l i g h t pen i s used or one of the buttons i s used, and i t w i l l stop waiting only when STEP or AUTO i s selected with the l i g h t pen or buttons. See Section 3 for more information. 57 (#END) The camera i s turned off and the elapsed time from #STAST i s printed., ' (#SET A1 S1 . . . An Sn) (#SETQ Al S1 . . . An Sn) These commands place values permanently on the ANTICS a-l i s t exactly as SET and SETQ normally would be expected to do. (LISP 1.5 generates an error i f atoms are set which do not appear on the a - l i s t , while antics places them on the end of the a - l i s t . The r e s u l t appears exactly l i k e LISP/MTS to the user.) These commands may be used d i r e c t l y i n the s c r i p t or i n breakpoints. If the atom whose value i s being set i s currently displayed on the screen (due to a #DISP1AY command) then the change w i l l be recorded in the display. (SUBROUTINE NAME primitive . . . primitive) The primitives are displayed immediately, with the scale set to 0.5. NAME i s ignored. This command i s provided primarily for compatibility with GLISP. (See Section 6.) (#DRAW N primitive . . . primitive) The vectors and commands generated by the primitives are displayed on the screen consecutively, at a rate determined by N, so that they appear as though they are being drawn by an i n v i s i b l e hand. I f N i s zero, the vectors are placed on the screen one at a time as fast as the system permits — roughly 14 per second. I f N i s negative, the vectors are placed on the screen JN| at a time at the maximum rate. I f N i s p o s i t i v e , a pause of N 300ths of a second i s taken between displaying each vector. The scale i s set to 0.5, the GLISP default. I f an #EVAL or #EVALQ command has been executed, a #BLANK command must be placed before the #DRAW command. This command works well with vectors generated by the GLISP TABLET function. (#PP S <X <Y>>) The LISP expression S i s prettyprinted on the display screen at location X,Y. I f X or Y are omitted they default to the upper left-hand corner of the display screen. The display w i l l remain on the screen u n t i l the next #BLANK command. (#SH0W S <X <¥») The CONS-cell structure of S i s displayed on the screen at X,Y. S may be a " c i r c u l a r , , S-expression. X and Y are the 58 coordinates of the loser, left-hand corner of the f i r s t CONS-c e l l . I t a c i r c u l a r expression i s shown, part of the display may be s l i g h t l y to the l e f t of X (1/4 inch), and care should be taken that t h i s does not extend outside the camera's view. I f X or Y are omitted they default to the upper left-hand corner of the display screen. The display w i l l remain on the screen u n t i l the next #BLANK command. (#SHOWFN FNAME <X < Y » ) The CONS-cell structure of the LAMBDA—expression of the function FNAME i s displayed on the screen at X,Y. FNAME i s displayed above and i n t e n s i f i e d . I f X or Y are omitted they default to the upper left-hand corner of the display screen. The display w i l l remain on the screen u n t i l the next # BLANK command. (#PLOT) The contents of the display screen are saved on f i l e -PLOT#. Any number of plots may be saved i n t h i s manner, and they may be plotted a f t e r leaving LISP by entering the MTS command; $BUN PLOT:Q PAR= BE SURE TO ENTER ONE BLANK AFTER "PAR= «. (#RATE RATE) The rate at which evaluation animation proceeds i s scaled by RATE. The normal value i s 1.0, and higher values produce faster animation. The elapsed time i s not precisely proportional to the rate, due to the fixed overhead of CPU time. (For example, an animation of 56.0 seconds duration at (#RATE 1.0) took 30.6 seconds at (#RATE 2.0).) RATE must be greater than zero. The #START command resets the rate to 1.0. #RATE may be used within a breakpoint. See Section 3 f o r a description of the RATE button. (#GRID) This draws a grid of 1-by-1 unit squares on the portion of the screen seen by the camera. This i s useful when laying out hand coded displays. The screen i s not blanked, and therefore #GRID may be used before or after creating other displays on the screen. (#F0CUS) This blanks the screen (exactly as #BLANK does) and then brings up a display which outlines the camera frame area of the display screen and indicates the center of the frame. This i s 59 used to frame and focus the camera. The camera should be adjusted so that the frame outline on the screen i s just c l e a r l y v i s i b l e i n the camera viewfinder., Press the STEP button (13) to terminate the display and continue with the next command i n the s c r i p t . (#REDISP ATOM • . ATOHn) This command may be used either i n the s c r i p t or i n a breakpoint. I t assures that the atoms named are displayed c o r r e c t l y i f they are currently being displayed by a #DISPLAY command. I t i s designed to be used after NCONC, RPLACA, or RPLACD, since they can change atomic values without e x p l i c i t l y naming the atoms. (tAIIAS FNAME ALIAS) I f t h i s command has been given, whenever function FNAME i s displayed on the screen, during animation, #SHOSFN, #STAR or #DEFON, the name ALIAS i s used i n place of the function's r e a l name. This i s useful when, for animation purposes, one wishes to redefine a system function, but the r e d e f i n i t i o n would disturb the operation of ANTICS. For example to animate EVAL one could define a function $EVAL and include the command (lALIAS 3EVAL EVAL). To remove the ALIAS from a function, use the command (iALIAS FNAME NIL). The c a l l to the function from tEVALS or #EVALQ must use the function's r e a l name, not i t s a l i a s . #STAR, tSHOWPN, #BRIEF, #EXCLUDE etc. also must use the the function's r e a l name. There i s no corresponding function f o r atoms since the are kept on the ANTICS EVAL a - l i s t and are completely independent from LISP/MTS. (#DISP primitive . . . primitive) #DISP i s used to include primitive display commands in the s c r i p t . The display w i l l remain on the screen u n t i l the next #BLANK command unless the FOR or FADE primitives are used. (#EXIT-DISP SECONDS primitive . . . primitive) This command i s used only, to include primitives i n the EXIT-FORM portion of an animation breakpoint. The primitives are displayed for the given number of seconds while the rest of animation waits. See Section 6.2 f o r more information. ( #CAMERA {ON,OFF}) This turns the camera on or off by switching the relay connected to l i g h t 1 on the Adage display screen. 60 (#DEPTH N) This command sets the maximum number of le v e l s of recursion of ANTICS EVAL that w i l l be displayed on the screen during animation. (The maximum number of EVAL blocks displayed w i l l be N.) when t h i s l i m i t i s exceeded, three dots are displayed on the screen to indicate that part of the evaluation i s not being animated (though the evaluation does continue.) If a breakpoint sets DISP? = T then animation w i l l continue. (#BRIEF FNAME1 . . . FNAMEn) (#BRIEF)~ The f i r s t form of this command adds the named functions to a l i s t of functions which w i l l be animated as though they were SUBBs: the function c a l l and evaluation of parameters are animated, but the animation of the function's LAMBDA-expression i s made completely i n v i s i b l e . The commands (#BRIEF) and (#START) reset the e f f e c t of a l l previous {#BRIEF . . .) commands. (#EXCLUDE FUNCTION FNAJ1E1 (#EXC1UDE ATOM AT0M1 . . (#EXCLUDE FUNCTION) (#EXCLUDE ATOM) The f i r s t two forms of #EXCL0DE add the sp e c i f i e d functions or atoms to respective l i s t s which t e l l the animation to completely omit the animation of the evaluation of the given functions and atoms. Both EXPRs and SUBRs may be excluded. The second two forms of #EXCLUDE reset the e f f e c t s of a l l previous #EXCLUDE commands. #START also resets a l l iEXCLUDEd functions and atoms. (tSTEPMODE) (tSTEPMODE {ON,OFF}) This turns STEPMODE on or o f f . (tSTEPMODE) turns STEPMODE on. See Section 3 f o r more information. 10. GRAPHICS PRIMITIVES Graphics primitives may #DISP or SUBROUTINE commands information see Section 6. beginning of Section 9. • FNAMEn) ATOMn) be used i n breakpoints or within in the s c r i p t . For more Notation i s explained at the 61 {•GOTO X Y) This moves the display beam to position X,Y on the screen without drawing. (*PLOT X Y) This draws a vector from the present position on the screen to X,Y. (•SYMBOL X Y STRING HEIGHT) The characters of STRING are displayed on the screen. X,Y i s the location of the lower left-hand corner of the f i r s t character of STRING, and HEIGHT i s the height of the character. (The variable TXTHT may be used for HEIGHT. This w i l l give characters the same siz e that ANTICS normally uses.) The horizontal spacing of characters i s 6/7 (0.857) times a character's height. (FOR SECONDS primitive . . . primitive) The primitives are displayed for the given number of seconds and then turned o f f . Note that i n GLISP the FOR function takes the time parameter i n i n frames, not seconds. (FADE HOLDTIME FADETIME primitive . . . primitive) The primitives are displayed for HOLDTIME seconds at normal i n t e n s i t y and then fade out gradually i n FADETIME seconds. (*DASH) (*UNDASH) Vectors drawn af t e r (*DASH) are drawn as dashed l i n e s u n t i l (•UNDASH) i s encountered. (•INTENSITY N) N i s a number between 0.0 and 1.0 c o n t r o l l i n g the i n t e n s i t y of the following vectors. Two variables, NORMAL and BRIGHT, are available as standard i n t e n s i t y values (their values are 0.55 and 0.77 respectively.) ANTICS does not reset the i n t e n s i t y i f i t i s changed by the user — she must be sure to reset i t to NORMAL., 62 (GPRQG (IABEX#primitive} . . . {LABEL,primitive}) This i s a PROG type function taken from GLISP. I t i s used in conjunction with *JUMP. See the GLISP documentation £11] f o r more information. (*JUMP LABEL) (*SKIPNZ COUNT) (*SKIPZ COUNT) These are used i n conjunction with GPSOG. See the GLISP documentation £11] f o r more information. (ADJ (DX DY INTENSITY SCALE) primitive . . . primitive) This i s provided primarily for GLISP compatibility. The primitives are displayed at the given i n t e n s i t y , scale, and of f s e t s . Unlike GLISP, d i a l s may not be s p e c i f i e d . If. an ADJ primitive i s nested inside a FADE primitive, the ADJ in t e n s i t y i s ignored. The adjusting values are i n the range of -10.0 to 10.0. (SHW1 S X Y) This primitive i s the same as the #SHOi command, except that X and Y are reguired. (PPD FORM X Y WIDTH LEVELS LINE-SKIP) This prettyprints FORM on the display screen. The bottom left-hand corner of the f i r s t character i s located at X,Y. WIDTH s p e c i f i e s the maximum width of the screen, i n characters, that w i l l be used. LEVELS s p e c i f i e s the depth to which FORM w i l l be printed i n d e t a i l . Sub-expressions of FORM beyond t h i s l e v e l w i l l be replaced by "6". LINE-SKIP s p e c i f i e s the distance between successive l i n e s on the screen. I f LINE-SKIP i s zero only one l i n e w i l l be printed, and i f any l i n e s are skipped as a r e s u l t , three dots w i l l be printed as an i n d i c a t i o n . The height of the characters used i s determined by the global variable TXTHT. The global variable SCREEN-WIDTH i s set to the width of the screen i n characters, and i t may be used for WIDTH. TXTHT*2 i s set to a good value for LINE-SKIP. The global variable SHORTQUOTE controls the printing of the QUOTE function. If SHORTQUOTE = T then a l l QUOTE functions w i l l be abbreviated with «»«. 63 H i . USEFUL ANTICS VARIABLES The following table l i s t s ANTICS variables which the user may wish to access or change. They may be changed either i n the s c r i p t or in breakpoints during animation. The type of numeric variables, integer or r e a l , should not. be changed. If a variable i s indicated to have dependants then there are other ANTICS variables which are calculated from the pa r t i c u l a r variable. After changing any of these variables and before executing any ANTICS commands or leaving a breakpoint, the function INITL-CALC should be c a l l e d to re-calculate the dependant variables. (INITL-CALC takes no parameters.) 64 r T— - — _ j . - T T r~ 1 VARIABLE | DEFAULT I SETQ ?|DEPEN-| NOTE | WHERE i NAME J VALDE i |DENTS J i i i RESET i 1 \ T BRIGHT | . 77 1 NO I ~ 1 1 ] NORMAL | .55 \ NO 1 ~ t 1 I GLISP-SCALE 1 .5 | YES 1 NO i j FOLLOW? 1 T 1 YES I NO | 2 I REFS? | NIL | YES 1 NO | 2 I ROLL-RATE 1 .75 | YES 1 NO | 3 I #START,#RATE FOLLOW-RATE | 2. | YES 1 NO | 3 | #ST.ART,#RATE MOVE-RATE | .75 | YES 1 NO | 3 I #START##RATE ENTER-WAIT I 2. J YES 1 NO | 3 I iSTART,#RATE EXIT-WAIT 1 1- | YES 1 NO | 3 | #START,#RATE DEFON-WAIT i 2. | YES 1 NO | 3 i fSTART SHORT-WAIT I . 4 | YES 1 NO i 3 I #START,#RATE MEDIUM-WAIT I -8 | YES 1 NO | 3 j #START,#RATE DOWN-Y | .6 | YES 1 NO 1 4 I RIGHT-X I 1- j YES 1 NO | 4 I B0X8 I .5 | YES | YES | ! ARRL | .2 | YES I YES J 4 1 BARBSIZE j .075 | YES 1 NO | 4 1 BOXH I -2 1 YES | YES | 4 | EV—* | .05 | YES 1 NO ] ^ t EV-HT I .1 | YES 1 NO | 4 1 TXTHT I .14 J YES | YES | 5 1 SCREEN-LIMIT I 5. | NO 1 - 1 6 | ROLL-RATIO | .66 | YES I NO | 7 f VALUE-LENGTH | 24 | YES | YES | 3 I EVAL-PPLEV I 4 f YES 1 NO i 9 1 VAR-PPLEV I 2 | YES 1 NO | 9 1 STAR-PPLEV ) 100 | YES i NO | 9 1 FRAME-RATIO | .74 | YES | YES j 10 | DONT-TOUCH I -1 | YES I NO | 11 | #DEPTH | 10000 | YES | NO | 12 | #START "*UNDEF* | "*UNDEF* " J YES 1 NO | 13 | FRAMES/SEC I 40. 1 YES 1 NO | 14 | RETURNS? I T | YES 1 NO | 15 | tSTAfiT EVLIS? I T | YES | NO J 15 | #START EVLIS-MOVE? I T | YES 1 NO | 15 | #START EVLIS-PPLEN I 8 I YES 1 NO 1 16 | SHORTQUOTE J T | YES 1 NO | 17 | #START LOOPS? i T | YES J NO | 18 | CONTINUE? J T | YES 1 NO | 18 J SHOWNIL? | NIL | YES 1 NO | 18 | DETAILATOM? I NIL J YES 1 NO | 18 | CONSIZE | .16 | YES | YES J 19 | ATMHT I .11 | YES 1 NO | 19 J YD EC I -.5 I YES | NO j 19 | MINCONSWIDTH | .55 | YES 1 NO | 19 | X-LIMIT | 4.5 | YES I NO ) 20 J Y-LIMIT | -4.5 | YES 1 NO | 20 | ALIST? ] NIL | YES 1 NO { 21 | i i . J , - i . J. i . J 65 NOTES: 1. 2. 3. See the primitive *.INTENSITY, FOLLOW? i s used to turn the follower on or o f f . REFS? determines whether the follower w i l l move to the variable display when atomic values are referenced. These control the rate at which animation progresses. MOVE-RATE, FOLLOW-RATE and ROLL-EATE control the rates of movement of return values, the follower and r o l l i n g of the display. They are in units of screen-units/second. ENTER-WAIT and EXIT-WAIT control the time delays before and a f t e r entering animation EVAL. SHORT—WAIT and MEDIUM-WAIT control time delays which occur at various times during animation, DEFUN-WAIT determines the time delay i n #DEFUN between pret t y p r i n t i n g the function and displaying i t s CONS-cells. These variables determine the dimensions of the EVAL box display during animation. The following figure i l l u s t r a t e s t h e i r s i g n i f i c a n c e . These variables should not be changed during animation. I I I L _ I I t BY-* , ^ W — • EVBL LEQURL THIN. » tCRR Figure 4 - Dimensions of an EVAL Box (actual size) 5 . TXTHT i s the hei atom names i n SHOW 6. SCREEN-LIMIT i s the coordinates. It i should not be chan 7. ROLL-RATIO datermi disappear when ani off the screen. 8. VALUE-LENGTH i s the which w i l l be d # DISPLAY or #STACK depends on the n characters. 9. EVAL-PPLEV i s ght of a l l text used in ANTICS except f o r bound f o r s provided ged. nes the f r mation r o l approxiraa isplayed displays, umber of v the absolute values of X and Y for reference, and probably action of the screen which w i l l Is part of the display upwards te maximum number of characters as return values or entries i n The actual length displayed ectors required to generate the the number of level s of d e t a i l that are shown 66 the screen which would look best i f See the command Notice from the the It FOR when pre t t y p r i n t i n g forms being evaluated during animation. VAR-PPLEV i s the number of levels of d e t a i l included during animation when p r i n t i n g return values or entries i n the #DISPLAY or #STACK displays. STAR-PPLEV i s the number of le v e l s of d e t a i l included when prettyprinting for the #ST AR or #PP commands. 10. This i s the r a t i o frame-height/frame-width of the camera being used. 0.74 i s correct for Super-8 mm. f i l m . 11. DONT-T00"CH i s simply a short distance on may be used when two parts of a display they were very close but not touching. 12. #DEPTH controls the depth of evaluation. #DEPTH f o r more information. 13. This i s the value given to undefined atoms. blank added to the name which distinguishes t h i s LISP/aTS undefined atom value. 14. FRAMES/SEC should match the refresh rate of the Adage i s used when producing movement and i n the FADE and pr i m i t i v e s . 15. RETURNS? determines whether return values w i l l be displayed or not. EVLIS? determines whether values from the evaluation of arguments w i l l be displayed; and EVLIS-MOVE? determines whether they w i l l be moved into a l i s t of argument values. 16. This i s the maximum length, i n characters, of the EVLIS values that are l i s t e d . 17. If SHORTQUOTE = T, (QUOTE S) w i l l be abbreviated 'S whenever i t i s displayed. 18. These a f f e c t SSHOw, tSHOMFN, #DEFUN, and SHS1. LOOPS? determines whether a search w i l l be made for c i r c u l a r S-expressions. I f CONTINUE? = T, portions of the display which w i l l not f i t on the screen are prettyprinted. (Also see Note 20 below.) If SHOHNIL? = T, a l l NIL atoms are shown, including those which are CDRs. If DETAILATOM? = T, a l l atoms are shown to be CONS-cells with t h e i r PNAMEs displayed to the r i g h t . 19. These are the dimensions used when displaying CONS-cell structures: 3 [ ST CONO. .1 —JNULL ;Lisr"*™*r Figure 5 - Dimensions of a CONS-cell (actual size) 67 20. These are the l i m i t s of the screen while displaying CONS-c e l l structures. When the display attempts to go to the ri g h t of or below these l i m i t s , i t w i l l stop, and depending on the value of CONTINUE?, the remainder w i l l be prettyprinted. (See Note 18 above.) 21. See the command #STACK. INDEX TO ANTICS USEfi^S GUIDE ADJ ... ........................... 62 #ALIAS ..............................59 # BLANK .............................. 56 #BRIEF ..............................60 B u t t o n s ..........................42-43 •CAMERA ......a,.,..,...,,,.....,..,.59 * D A S H ............................... 61 #DEFUN 45,55 #DEPTH ..............................60 • DISP ,.,..-,.46,59 •DISPLAY .........................40,55 • DRAW ., .57 #END ...... #EVAL ..... #EVALQ .... #EXCLUDE .. •EXIT-DISP FADE ...... tFOCUS .... FOB ....... ........... ......57 ..................40,56 ..................40,56 ........ ..60 ..47,59 61 5 8 ...,...,.,..,,.......61 *GOTO ..... .,,.......,...,..,...,....61 GPBOG ............................,,.62 • GRID ...............................58 •INTENSITY ..........................61 *JUMP 6 2 L i g h t Pen .................. ....,42 N o t a t i o n ...............,.....,,,...,54 #PLOT 58,61 #PP 57 PPD , 62 • RATE .................,,,,....,.,43,58 #REDISP .......,,...,,,,...,,.,,.,,..59 •SET 57 #SETQ .57 •SHOW 45,57 •SHOWFN ., 58 SHH1 ..............,..,,.......-..,-,62 •SKIPNZ .62 • SKIPZ 62 •STACK .40,56 • STAB 40,55 #STABT .............................. 54 • STEPMODE 60 SUBROUTINE ....................... 49,57 •SYMBOL .............................61 • UNDASH ...61 V a r i a b l e s ...........................63 #8AIT .......................,...,42,56 69 APPENDIX B - SAMPLE ANTICS SCRIPTS This s c r i p t produced the animated f i l m which i s included as part of t h i s thesis. I t l a s t s approximately three minutes, twenty seconds, but for educational purposes i t probably should be slowed down by a factor of two or three. (PROGN (SETQ FRAMES/SEC 30) (#F0CUS) (tWAIT 10.) (#START) (#CAMERA ON) ;TITLES (#DISP (FADE 6. 2. (•SYMBOL -2.57 1. 'MEMBER 1-))) (#HAIT 2.) (#DISP (FADE 4. 2. (•SYMBOL -1.8 0. '"BY MARK DIONNE" .3))) (#WAIT 6.5) (#DISP (FADE 5. 2. (•SYMBOL -3. 2.5 *"SUBMITTED IN PARTIAL FULFILLMENT OP" .2) (•SYMBOL -2.92 2. 0 '"THE REQUIREMENTS FOR THE DEGREE OF" .2) (•SYMBOL -1.46 1.5 '"MASTER OF SCIENCE" .2) (•SYMBOL -2.57 0. »"UNIVERSITY OF BRITISH COLUMBIA" .2) (•SYMBOL -1.11 -.5 '"OCTOBER, 1975" .2))) (#WAIT 7.) (#BLANK) (#RATE .9) (SETQ X-LIMIT 5.0) (#DEFUN MEMBER (THING LIST) (COND {{NULL LIST) NIL) { (EQUAL THING (CAR LIST)) LIST) {T (MEMBER THING (CDR LIST))))) (#WAIT 6.) (SBLANK) (ISTAR MEMBER) (#DISPLAY THING LIST) (#STACK THING LIST) EVALUATION ANIMATION (#EVALQ (MEMBER ' A ' (C A T) )•) (#WAIT 2.) (#BLANK) ;"THE END" (tDRAM 0 {•GOTO 0 0) (•GOTO -8.351988 -0.083084) {•PLOT -8.151501 -0.183328) (Approximately 100 li n e s of •PLOT and •GOTO primitives are omitted at t h i s point. They were generated by GLISP using the data tablet and constitute the words "the end" i n hand drawn scr i p t . ) (•PLOT 5.701635 -1.694323) (•PLOT 5. 853224 -1. 542734)) (#END) ) 70 This s c r i p t i l l u s t r a t e s the display of S-expressions, Figure 1 (page 9) shows the screen after t h i s s c r i p t has been executed. (PROGN {# BLANK) (#DISP (*SYMBOL -5. 4.5 «"1 - (SETQ Z «((&) B) ) TXTHT) ) (SETQ Z » ( (A) B) ) (#HAIT 1.) (#DISP (*SYHBOL -4.5 4. , • Z= TXTHT)) (#SH0W Z -4.5 3.5) (#WAIT 5.) (#DISP (*SYMB0L -5. 1. »"2 - (RPLACD (CDR 2) Z) " TXTHT)) (NULL (RPLACD (CDR Z) Z)) (#WAIT 1.) (#DISP (*SYMBOL —4.5 .3 *Z= TXTHT)) (#SHOB Z -4.5 -0.2) (#WAIT 5.) (#DISP (*SYBBOL 0. 4.5 »"3 - (RPLACA (CDR Z) (CAR Z) ) " TXTHT) ) (NULL (RPLACA (CDR Z) (CAR Z) ) ) (#8AIT 1.) (#DISP (*SYMBOL 0.5 4.0 «Z= TXTHT)) (#SHO» Z 0.5 3.5) (#WAIT 5.) (#DISP (*SYHBOL 0. 1. »"4 - (RPLACD Z Z)" TXTHT)) (NULL (RPLACD Z Z)) (#DISP (*SYMBOL .5 .3 • Z= TXTHT) ) (#SHOS Z 0.5 -.2) (tWAIT 5.) ) 71 This s c r i p t animates the execution of a s i m p l i f i e d version of EVAL. I t uses several of the more advanced features of ANTICS to delete unnecessary d e t a i l from the f i l m and to permit the animation of functions with the same names as LISP system functions. The *APPLY function uses user breakpoints i n a novel way to access the LISP/MTS APPLY function i n order to execute SUBRs. Since the functions,animated here are too large to f i t on the display screen e a s i l y , the viewer should be provided with a copy of EVAL f o r reference £16], (PROGN (#START) (#DISPLAY FORM FN A ARGS) (tSTACK FORM A) ;THE EVAL FUNCTIONS ARE PRINTED AS SKELETONS — THEY ARE LARGE (SETQ EVAL-PPLEV 2) (tEXCLUDE FUNCTION QUOTE CAR CDR NULL) (tEXCLUDE ATOM FORM FN A EXP ARGS C M NIL T J) (#BRIEF !GET SASSOC APPLY* *PAIR) (#ALIAS !GET GET) ;*PAIR IS PART OF ANTICS! (#ALIAS *PAIR PAIR) (#ALIAS ! EVAL EVAL) (#ALIAS !EVCON EVCON) (#ALIAS .'EVLIS EVLIS) (#ALIAS !APPLY APPLY) (#SETQ A • { (T . T))) (DEFUN !APPLY (FN ARGS A) (COND ( (NULL FN) NIL) ((ATOM FN) (COND ( (!GET FN • EXPS) {! APPLY EXP ARGS A)) ((!GET FN * SUBR) (APPLY* EXP ARGS)) (T {!APPLY (SASSOC FN A) ARGS A)))) ( (EQ (CAR FN) ' LAMBDA) (I EVAL (CADDR FN) (NCONC (*PAIR (CADR FN) ARGS) A))) (T (IAPPLY (I EVAL FN A) ARGS A)))) (DEFUN J EVAL (FORM A) (COND {(NULL FORM) NIL) ( (NUMBERP FORM) FORM) ( (ATOM FORM) (SASSOC FORM A)) ( (EQ (CAR FORM) 'QUOTE) (CADE FORM) ) ( (EQ (CAR FORM) 'COND) (IEVCON (CDR FORM) A)) { (ATOM (CAR FORM)) (COND {('GET (CAR FORM) 'EXPR) ('APPLY EXP (IEVLIS (CDR FORM) A) A) ) ( (! GET (CAR FORM) *SUBR) (APPLY* (CAR FORM) {!EVLIS (CDR FORM) A))) (T {! EVAL (CONS (SASSOC (CAR FORM) A) (CDS FORM)) A) ) ) ) (T (! APPLY (CAR FORM) (!EVLIS (CDR FORM) A) A)))) (DEFUN JEVCON (C A) (COND { (! EVAL (CAAR C) A) (! EVAL (CADAR C) A)) (T (IEVCON (CDR C) A) ) ) ) (DEFUN ! EVLIS (M A) (# (AND DISP? (SETQ DISP? (LESSP #TIMES 2))) (COND ( (NULL M) NIL) (T (CONS (! EVAL (CAR M) A) (! EVLIS (CDR M) A)))))) {DEFUN !GET (FN TYPE) (SETQ EXP (GET FN TYPE) ) (COND ((NULL EXP) NIL) ((EQ TYPE 'SUBR) »*) (EXP))) (DEFUN SASSOC (AT LIST) (CDR (ASSOC AT LIST " (*UNDEFINED*) ) )) (DEFUN APPLY* (EXP ARGS) (# (APPLY (*VALUE •EXP A NIL) (*VALUE 'ARGS A NIL)))) ) ;AN EXAMPLE (DEFUN FOO (X) (CONS XX)) (#EVALQ (J EVAL ' {FOO »Z) A)) APPENDIX C - ANTICS PROGRAM LISTING .******************* ; LISPBASIC • ******************* (STATUS (32 6)) (MTS *"SET LIBSRCH=GRAF:AGTBASIC+AGT:BASIC") ;PARTS OF LISPBASIC WHICH ARE NOT USED ARE OMITTED (DEFINE (DUMMY1 SUBR (0 "GRAF:LISPBASIC.0" AGPLOT)) (#DUMP# SUBR (3 "GRAF:BDUMP.0" BDUMP)) (GETSPACE SUBR (0 "GRAF:LISPBASIC.O" LGETSPA)) {AGTRD SUBR (0 "GRAF:LISPBASIC.0" LAGTRD)) (BUTTON SUBR (0 "GRAF:LISPBASIC.0" LBUTTON)) (DIAL SUBR (0 "GRAF:LISPBASIC.O" LDIAL)) (PENHIT SUBR (0 "GRAF:LISPBASIC.0" LPENHIT)) (INDEX SUBR (0 "GRAFMISPBASIC. 0" LINDEX) ) (AGTBUF SUBR (0 "GRAF:LISPBASIC.0" LAGTBUF)) (AGTCON SUBR (0 "GRAF:LISPBASIC.0" LAGTCON)) (CONAGT SUBR (0 "GRAF:LISPBASIC.O" LCONAGT)) (AGTCVT SUBR (0 "GRAF:LISPBASIC.0" LAGTCVT)) (AGTDSP SUBR (0 "GRAF:LISPBASIC.0" LAGTDSP)) (AGTEXT SUBR (0 "GRAF:LISPBASIC.0" LAGTEXT)) (AGPLOT SUBR (0 "GRAF:LISPBASIC0" LAGPLOT)) ) (SETQ DASH 1 UNDASH 2 SCALE-D 4 SCALE 5 DX-D 6 DX 7 DY-D 8 DY 9 INT-D 10 INT 11 PENON 15 PENOFF 16 MOVE 19 MOVER 20 JUMP 21 JUMPR 22 SKIPNZ 23 SKIPZ 24 INCR-D 25 INCR 26 LIGHTSON 34 LIGHTSOFF 36) (DEFUN BDUMP (ARRAY START END) (PROG NIL (OR (AND (GREATERP START 0) (LESSP START (ADD1 END)) \ 74 (LESSP END 6001}) (RETURN (NULL (PRINT '"BAD INDEX PASSED TO BDUMP")))) (#DUMP# ARRAY START END})) .******************** ; INITIALIZATION ETC. - ******************** ;.IFADG CHECKS TO SEE IF HE ARE AT THE ADAGE TERMINAL (DEFINE (RTHAIT SUBR (3 *LIBRARY RTWAIT)) (AGT? SUBR (0 "MASD: AGTEST.O" IFADG) ) {STOP BUG ( (LAMBDA NIL (AND PLOTTED? (PRINT '"PLOT OUTPUT IS ON FILE -PLOT#")}))>) ;FIX SYSTEM FUNCTION PLEN SO THAT IT (PUT »#PLEN# 'SUBR (GET * PLEN 'SUBR)) WORKS FOR NUMERIC ATOMS (PUT * PLEN 'EXPR « (LAMBDA (ATOM) (COND ((NUMBERP (#PLEN# ATOM) (MKATOM ATOM) ) ) ((#PLEN# ATOM)}))) ; INITIALIZE "ONE-TIME" STUFF ;THESE SHOULD GENERALLY NOT BE CHANGED BY THE USER (SETQ AT AGT? (AGT?) STAR NIL ?STEPMODE NIL PLOTTED? NIL STAR-FLAG NIL FADE? NIL SUBROUTINE? NIL EVALING? NIL ON 'ON OFF * OFF SCREEN-LIMIT 5. CAMERA? NIL TIME-FILM-STARTED NIL RESTART-CAMERA NIL USER-FORM »# STAR-FORM '* FULLMODE 2 PAREN-LEN 4 ii jn i it H j II I H j It II II t I I II • * II • II I II I II & '& EVAL-COUNTER 1 RATE-BUTTON 14 QUIT-BUTTON 10 STEP-BUTTON 13 BACKUP-BUTTON 5 STEPMODE-BUTTON 15 AUTO-BUTTON 16 PLOT-BUTTON 9 BREAK-BUTTON 11 CAMERA-BUTTON 12 NORMAL-BUTTONS (LIST STEP-BUTTON QUIT-BUTTON AUTO-BUTTON STEPMODE-BUTTON PLOT-BUTTON BREAK-BUTTON RATE-BUTTON CAMERA-BUTTON) EVAL-BUTTONS (CONS BACKUP-BUTTON NORMAL-BUTTONS)) ;IF THE FOLLOWING ARE CHANGED EVERYTHING MUST BE RELOADED (SETQ LWA-ADAGE 6000 FOLLOWER-SIZE 0.1 *SCALE 1. BRIGHT 0.77 NORMAL 0.55) ;THESE MAY BE CHANGED BY THE USER (SETQ GLISP-SCALE 0.5 FOLLOW? T ALIST? NIL REFS? NIL "*UNDEF* " '"*UNDEF* « DEFUN-WAIT 2. FRAMES/SEC 40. FILM-USED 0. FILM-LENGTH NIL TIMESCALE 1. FRAME-RATIO 0.74 TXTHT 0.14 DONT-TOUCH 0.1 ITSY-BITSY 0.05 DOWN-Y 0.6 RIGHT-X 1. EVLIS-PPLEN 8 BOXW 0.5 ARRL 0.2 BARBSIZE 0.075 BOXH 0.2 EV-* 0.05 EV-HT 0. 1 ROLL-RATIO 0.66 VALUE-LENGTH 24 STAR-PPLEV 100 EVAL-PPLEV 4 VAR-PPLEV 2) ;THESE ARE USED BY #SHOH ;CONSIZE IS THE HEIGHT OF A CONS CELL (SETQ YDEC -0.5 ATMHT 0.11 CONSIZE 0.16 SOMESPACE 0.035 SHOW-BARBSIZE 0.05 MINCONSWIDTH 0.55 X-LIMIT 4.5 Y-LIMIT -4.5 SHOWNIL? NIL DETAILATOM? NIL LOOPS? T CONTINUE? T) ;RE-CALCULATE DEPENDANT CONSTANTS (DEFUN INITL-CALC () (SETQ DY-DX-SCALE (TIMES *SCALE 0.1) LINE-SKIP (TIMES TXTHT 1.5) NEG-SCREEN-LIMIT (MINUS SCREEN-LIMIT) BOTTOM-OF-FILM (SUB SCREEN-LIMIT (TIMES FRAME-RATIO (ADD SCREEN-LIMIT SCREEN-LIMIT) )-) TXTHT*2 (ADD TXTHT TXTHT) TXTHT/2 (TIMES TXTHT 0.5) BOXW/2 (TIMES BOXW 0.5) BOXH/2 (TIMES BOXH 0.5) EVAL-BLK-HT (ADD ARRL BOXH) AGT-VALUE-LENGTH (TIMES VALUE-LENGTH 5) LOOPDEC (TIMES 0.5 (ADD YDEC CONSIZE)) CONSIZE/2 (TIMES CONSIZE 0.5) CONSIZE*2 (ADD CONSIZE CONSIZE) VARS-X (SUB SCREEN-LIMIT (TIMES VALUE-LENGTH TXTHT)) STACK-X VARS-X SCREEN-WIDTH (FIX (DIVIDE (SUB SCREEN-LI MIT N EG-S CRE EN-LIMIT) TXTHT)))) (INITL-CALC) ;SET SPEED OF ANIMATION (DEFUN #RATE (N) (SETQ ENTER-WAIT (DIVIDE 2. N) EXIT-WAIT (DIVIDE 1. N) MOVE-RATE (TIMES 0.75 (MAX (FLOAT N) 1.)) ROLL-RATE (MIN 4 0. (TIMES 0.75 (MAX (FLOAT N) 1.))) FOLLOW—RATE (TIMES 2. (MAX (FLOAT N) 1.)) SHORT-WAIT (DIVIDE 0.4 N) MEDIUM-WAIT (DIVIDE 0.8 N) ) ) 77 ;SET UP AGT ARRAYS ; (ALIST-LPAREN, ABOUT LINE — 6 5 , IS SPACE FOR THE ALIST OUTER . „ ( H ) (COND (ATAGT? (SETQ :ARRAY (GETSPACE LWA-ADAGE) tFQLLOW (GETSPACE 15) : ROLL (GETSPACE 8) ICONTROL (GETSPACE 124) ROLL-LEN 7 ROLL-EOL 8 :EOL (GETSPACE 1) ;NOP (GETSPACE 1) :TEMP (GETSPACE 10) :BRIGHT (GETSPACE 1) :NORMAL (GETSPACE 1) :STACK (GETSPACE 1) :SKIP-VAL (GETSPACE 1)) (INDEX : ROLL 1) (SETQ ROLL-SKIP (INDEX :ROLL)) (AGTCON SKIPZ 0 0 ;ROLL) (SETQ ROLL-INCR (INDEX :ROLL)) (AGTCON INCR 0 0 :ROLL) (SETQ ROLL-DY (INDEX :ROLL)) (AGTCON DY 0 0 :ROLL) (AGTCON INT 0 NORMAL :ROLL) (AGTCON DX 0 0 :ROLL) (AGTCON PENON 0 0 :ROLL) (SETQ ROLL-JUMP (INDEX :ROLL)) (AGTCVT 0 0 NIL NIL ;ROLL) (AGTCVT 0 0 NIL T :ROLL) (AGTCON INT 0 BRIGHT :BRIGHT 1) ' (AGTCON INT 0 NORMAL :NORMAL 1) (AGTCON SKIPZ 0 0 :FOLLOW 2) (AGTCON INCR 0 0 :FOLLOW) (AGTCON DX 0 0 :FOLLOW) (AGTCON SKIPZ 0 0 :FOLLOW) (AGTCON INCR 0 0 :FOLLOW) (AGTCON DY 0 0 :FOLLOW) (AGTCVT 0. FOLLOWER-SIZE NIL NIL :FOLLOW) (AGTCVT (TIMES 0.6 FOLLOWER-SIZE) (TIMES -0.8 FOLLOWER-SIZE) T NIL :FOLLOW) (AGTCVT (TIMES -0.95 FOLLOWER-SIZE) (TIMES 0.3 FOLLOWER-SIZE) T NIL : FOLLOW) (AGTCVT (TIMES 0.95 FOLLOWER-SIZE) (TIMES 0.3 FOLLOWER-SIZE) T NIL :FOLLOW) (AGTCVT (TIMES -0.6 FOLLOWER-SIZE) (TIMES -0.8 FOLLOWER-SIZE) T NIL :FOLLOW) (AGTCVT.0. FOLLOWER-SIZE T NIL :FOLLOW) (SETQ FOLLOW-LENGTH (SUB1 (INDEX :FOLLOW) ) ) (AGTCON JUMPR FOLLOW-LENGTH 0 :FOLLOW 1) (AGTCON SCALE 0 *SCALE :CONTROL 1) (SETQ CAMERA-CONTROL (INDEX :CONTROL)) (AGTCON LIGHTSOFF 1 0 :CONTROL) (AGTCON PENOFF 0 0 :CONTROL) (AGTEXT -0.72 -4. 0.28 'ANTICS :CONTROL) (INDEX : CONTROL (ADD1 (SETQ STEP-CONTROL (INDEX : CONTROL) ) )•) (AGTCON PENON 0 0 :CONTROL) (SETQ INTS-STEP (INDEX :CONTROL)) (AGTCON INT 0 NORMAL :CONTROL) (AGTEXT NEG—SCREEN-LIMIT NEG-SCREEN-LIMIT TXTHT 'STEP :CONTROL) (AGTCON INT 0 NORMAL :CONTROL) (SETQ END-STEP (INDEX :CONTROL)) (AGTEXT (ADD NEG-SCREEN-LIMIT (TIMES TXTHT 6) ) NEG-SCREEN—LIMIT TXTHT •AUTO ;CONTROL) (AGTCON PENOFF 0 0 :CONTROL) (SETQ END-AUTO (INDEX :CONTROL)) (INDEX :CONTROL (ADD 1 END-AUTO)) (SETQ EVAL-RETURN (INDEX :CONTROL) STACK-ROLL-ADDR EVAL-RETURN) (AGTCON SKIPZ 0 0 :CONTROL) (AGTCON INCR 0 0 :CONTROL) (AGTCON DY 0 0 :CONTROL) (AGTCON PENOFF 0 0 :CONTROL) (SETQ ALIST-LPAREN (INDEX :CONTROL)) (REPEAT '(AGTCVT 0 0 NIL NIL 2 CONTROL) PAREN-LEN) (SETQ STACK-JUMP (INDEX :CONTROL)) (AGTCON JUMP LWA-ADAGE 0 :CONTROL) (SETQ CONTROL-LEN (INDEX : CONTROL) INIT-FREE CONTROL-LEN) (AGTCVT 0 0 NIL T :CONTROL) (AGTCON JUMP INIT-FREE 0 :CONTROL STEP-CONTROL) (AGTCON JUMP (AGTCVT (AGTCVT (AGTCON {AGTCON INIT-PREE 0 :CONTROL END-ADTO) JUMP EVAL-RETURN 0 :STACK JUMPR AGT-VALUE-LENGTH 0 ;SKIP-VAL D 0 0 NIL NIL :NOP 1) 0 0 NIL T :EOL 1) ) ) .*************************** ; FUNCTIONS CALLED BY A USER .*************************** ;SET ANIMATION VARIABLES (DEFUN #SETQ FEXPR (Q) (COND ((LISTP (CAR Q) ) (ERRMSG ATTEMPT TO SETQ: ({CAR Q) ) ) ) { (NULL (CDDR Q) ) (•SETQ1 (CAR Q) (EVAL (CADR Q)) (COND (EVALING? A) (•ALIST) ) ) ) (T {•SETQ1 (CAR Q) (EVAL (CADR Q) ) (COND (EVALING? A) (•ALIST))) (APPLY «#SETQ (CDDR Q))))) (DEFUN #SET FEXPR (Q) (PROG (AT) (SETQ AT (EVAL (CAR Q))) (COND ( (LISTP AT) (ERRMSG ATTEMPT TO SET: (AT))) { {NULL (CDDR Q)) (•SETQ1 AT ;DEFINE AND DISPLAY A FUNCTION (DEFUN #DEFUN FEXPR (F) (PROG (NLINES) (APPLY * DEFUN F) (INDEX : ARRAY 1) (SETQ NLINES (FIX (PPD (CONS * DEFUN F) (EVAL (CADR Q) ) (COND (EVALING? A) (•ALIST)))) (T (•SETQ1 AT (EVAL (CADR Q) ) (COND (EVALING? A) (•ALIST))) (APPLY «#SET (CDDR Q) ) ) ) ) ) NEG-SCREEN-LIMIT (SOB SCREEN-LIMIT TXTHT) SCREEN-WIDTH 100 TXTHT*2) ) ) (DISPL) (#WATT DEFUN-W AIT) (APPLY1 •#SHOWFN (CAR F) NEG-SCREEN-LIMIT (SOB SCREEN-LIMIT (TIMES TXTHT*2 (ADD 2 NLINES)))))) ;PRETTYPRINT AN S-EXPRESSION AT X Y ON THE SCREEN (DEFDN #PP N (INDEX : ARRAY 1) (PROG (X) (PPD (ARG 1) (SETQ X (COND { (GREATERP N 1) (ARG 2)) ((ADD NEG-SCREEN-LIMIT CONSIZE)))) (COND {(GREATERP N 2) (ARG 3)) {(SOB SCREEN-LIMIT CONSIZE*2))) (FIX (DIVIDE (SUB SCREEN-WIDTH X) TXTHT)) STAR-PPLEV TXTHT*2)) (DISPL) ) ; (#DISPLAY VAR VAR ...) ;CONTROLS DISPLAY OF VARIABLES. ;IF VAR IS A NUMBER, IT CONTROLS (ARG N) (DEFUN #DISPLAY NEXPR N (PROG (M Y A ADDR) (INDEX : ARRAY 1) (AGTCON PENON 0 0 :ARRAY) (SETQ M 1 Y TOP-SCREEN-AGT DISP-VARS NIL RMARGIN (MIN RMARGIN (SUB VARS-X DONT-TOUCH))) LOOP (SETQ A (ARG M) ) (AND (NUMBERP A) (SETQ A (MKATOM 1"ARG " A))) (SETQ DISP-VARS (CONS A DISP-VARS)) (PUT A 'BEGIN (INDEX : ARRAY)) (•INTENSITY NORMAL) (AGTEXT VARS-X Y TXTHT (MKATOM A »" =") : ARRAY) (PUT A * VAL-ADDR (SETQ ADDR (INDEX iARRAY))) (PUT A 'Y Y) (PPD (PUT A 'VALUE 81 (•VALUE A •ALIST '"*UNDEF* ") ) (PUT A •X (ADD VARS-X (TIMES TXTHT (ADD (PLEN A) 3) ) ) ) Y VALUE-LENGTH VAR-PPLEV 0) (SETQ A (SUB (INDEX : ARRAY) ADDR) Y (SUB Y TXTHT*2) ) (AND (LESSP A AGT-VALUE-LENGTH). (AGTCON JUMPR (SUB AGT-VALUE—LENGTH A) 0 ; ARRAY) ) (INDEX :ARRAY (ADD ADDR AGT-VALUE-LENGTH)) (SETQ M (ADD1 M) ) (OR (GREATERP M N) (GO LOOP) ) {•INTENSITY NORMAL) (AGTCON PENOFF 0 0 :ARRAY) (•DASH) {•GOTO SCREEN-LIMIT (ADD TXTHT Y) ) {•PLOT RMARGIN (ADD TXTHT Y) ) (•PLOT RMARGIN (MIN SCREEN-LIMIT (ADD TXTHT^2 TOP-SCREEN-AGT) )) (•UNDASH) (SETQ STACK-TOP Y Y-FOLLOW-VARS Y X-FOLLOW-VARS (SUB VARS-X (ADD FOLLOWER-SIZE DONT-TOUCH)) FWA-VARS (DISPL)))) ;A USER CALL TO MAKE SURE AN ATOMIC VALUE IS DISPLAYED ; PROPERLY. ; IT IS USED AFTER AN NCONC ETC. WHEN A VALUE CHANGE IS NOT ; APPARENT TO THE ANIMATION. (DEFUN #REDISP NEXPR (AT) (VAR-CHANGE AT (•VALUE AT (COND (EVALING? A) (•ALIST) ) •"•UNDEF+ »))) ;NAME THE FUNCTION WHICH IS THE STAR OF ANIMATION (DEFUN tSTAR NEXPR (F) (PROG (N) (PUT F •STAR (COPYSTAR (GET F • EXPR '(RETURN (ERRMSG (F) IS 82 NOT AN "EXPR.") ))••)) (SETQ STAR F) (INDEX zARRAY 1) (•INTENSITY BRIGHT) (AGTCVT 0 0 NIL NIL :ARRAY) (AGTEXT NEG-SCREEN-LIMIT TOP-SCREEN-AGT TXTHT (MKATOM (FNAME F) ' :) :ARRAY) (•INTENSITY NORMAL) (SETQ STAR-FLAG T N (PPD (GET F 'STAR) NEG-SCREEN-LIMIT (SUB TOP-SCREEN-AGT TXTHT+2) (FIX (DIVIDE (ADD RMARGIN SCREEN-LIMIT) TXTHT)) STAR-PPLEV TXTHT^2) STAR-FLAG NIL TOP-SCREEN-AGT (SUB TOP-SCREEN-AGT (TIMES (ADD 1 N) TXTHT+2) ) ) (•INTENSITY NORMAL) (•DASH) (•GOTO NEG-SCREEN-LIMIT TOP-SCREEN-AGT) (•PLOT RMARGIN TOP-SCREEN-AGT) (•UNDASH) (SETQ TOP-SCREEN-AGT (SUB TOP-SCREEN-AGT TXTHT^2) FWA-STAR (DISPL)) (OR DISP-VARS (SETQ STACK-TOP TOP-SCREEN-AGT)))) ;COPY THE STAR FUNCTION INSERTING BREAKPOINTS FOR THE ADDRESSES ; TO INTENSIFY. (DEFUN COPYSTAR (FORM) (COND ((ATOM FORM) FORM) ((ATOM (CAR FORM)) (COND ((EQNAME (CAR FORM) USER-FORM) (CONS (CAR FORM) (CONS (CADR FORM) (AND (CDDR FORM) (CONS (COPYSTAR (CADDR FORM)) (CDDDR FORM) )•)))) (T (LIST STAR-FORM NIL (COND ( (MEMQ . (CAR FORM) ' (LAMBDA NLAMBDA FLAMBDA PROG) ) (CONS (CAR FORM) (CONS (CADR FORM) (MAPCAR 'COPYSTAR (CDDR FORM) ) ) ) ) ( (EQ (CAR FORM) ' COND) (CONS (CAR FORM) (MAPCAB » (LAMBDA (X) (MAPCAB •COPYSTAR X)) (CDB FOBM) ) ) ) ({EQ (CAR FOBM) • SETQ) (PBOG (N) (CONS (CAR FORM) (MAPCAB »(LAMBDA (X) (COND (N (SETQ N NIL) (COPYSTAR X)) (T (SETQ N T) X))) (CDR FORM) ) ) ) ) ({EQ (CAR FORM) •SELECT) (CONS (CAB FOBM) (CONS (COPYSTAR (CADR FORM) ) (SELCOPY (CDDR FORM) ) ) ) ) ( (EQ (CAR FORM) * SELECTQ) (CONS (CAR FORM) (CONS (COPYSTAR (CADB FORM) ) (SELQCOPY (CDDB FORM))))) (T (CONS (CAB FORM) (MAPCAB 'COPYSTAR (CDR FORM))))))))) (T (MAPCAB 'COPYSTAR FORM)))) (DEFUN SELQCOPY (F) (COND ( (NULL (CDS F) ) (LIST (COPYSTAR (CAB F) ) ) ) (T (CONS (CONS (CAAB F) (MAPCAB 'COPYSTAR (CDAR F) ) ) (SELQCOPY (CDR F) ) ) ) ).)• (DEFUN SELCOPY (F) (COND ((NULL (CDR F) ) (LIST (COPYSTAR (CAR F) ) ) ) (T (CONS {MAPCAB 'COPYSTAR (CAR F)) (SELCOPY (CDR F) ))))•) ;(#STACK VAR1 VAR2 ... <#ALL>) (DEFUN fSTACK FEXPB (L) (COND ((NULL (CAB L) ) (SETQ STACK? (T (HAP * (LAMBDA (L) (AND NIL) ) L) (NUMBE8P (CAB L) ) (BPLACA L (MKATOM *"ARG " (CAB L) ) ))) (SETQ STACK-VABS L STACK? T) (AND (MEMQ * # ALL STACK-VABS) (SETQ STACK-VABS T) ) ) ) ) ;MAKE FUNCTIONS AND ATOMS INVISIBLE (DEFUN #EXCLUDE FEXPB (L) (COND ({EQ (CAE L) * ATOM) (COND { (CDS L) (SETQ EXCLUDE-ATOMS (NCONC (CDB L) EXCLUDE-ATOMS) ).) (T (SETQ EXCLUDE-ATOMS NIL)))) {{EQ (CAB L) 'FUNCTION) (COND ({CDB L) (SETQ EXCLUDE-FNS (NCONC (CDB L) EXCLUDE-FNS))) (T (SETQ EXCLUDE-FNS NIL)})))) ;MAKE FUNCTIONS LOOK LIKE SUBBS (DEFUN tBBIEF FEXPB L (COND {{NULL L) (SETQ BRIEF-FNS NIL) ) {(SETQ BBIEF-FNS (NCONC (ARG 1) BRIEF-FNS)))}) ;THE VIEWER WILL BE ACQUAINTED WITH A FUNCTION BY ITS ALIAS, ; NOT ITS SEAL NAME (DEFUN #ALIAS NEXPB (FN ALIAS) {PUT FN 'ALIAS ALIAS)) ;RETURN ALIAS IF IT EXISTS, OTHERWISE SEAL NAME (DEFUN FNAME (FN) (OR (GET FN 'ALIAS) FN)) ;WAIT A GIVEN NUMBER OF SECONDS (CALLED BY *EVAL) (DEFUN #WAIT (SECS) {COND (?STEPMODE (AGTDSP INTS-STEP NIL FULLMODE 1 :BBIGHT) (AGTRD 600) (AGTDSP INTS-STEP NIL 85 FULLMODE 1 :NORMAL) (STEP-AGT) ) (T (AND FILM-LENGTH CAMERA? TIME-FILM-STARTED (GREATERP (ADD (TIMES SECS TIMESCALE) FILM-USED (TIMES 9.999999E-4 (SUB (STATUS 39) TIME-FILM-STARTED))) FILM-LENGTH) (PROGN (#CAMERA NIL) (MSSG INSERT FILM THEN TYPE NIL) (SETQ FILM-USED 0.) (BREAK) (•CAMERA T) ) ) (AGTRD (TIMES TIMESCALE SECS)) (STEP-AGT) ) ) ) ;WAIT FOR A FEW SECONDS (DEFUN REALWAIT (SECS) (SETQ SECS (TIMES SECS TIMESCALE)) (REPEAT * (RTWAIT 18000) (FIX (DIVIDE SECS 60.))) (RTWAIT (REMAIN (FIX (TIMES SECS 300)) 18000))) ;PROCESS BUTTON OR PEN HIT (DEFUN STEP-AGT () (SELECT (BUTTON) (0 (COND ((EQ 0 (PENHIT) ) ) ( (EVAL-PEN) )•) ) (BACKUP-BUTTON (AND EVALING? (PROGN (AGTDSP (CADR LOCLIST) NIL FULLMODE 1 : STACK) (WIPE-VAL) (SETQ STACK-BACKUP STACK?) (*UNEVAL* 2)))) (QUIT-BUTTON (SETQ EVALING? NIL) (AND CAMERA? (•CAMERA NIL)) (UNEVA.L -1 •«***STOPPED***)) (STEPMODE-BUTTON (#STEPMODE T) (REALWAIT SHORT-WAIT) {•WAIT 1)) (AUTO-BUTTON ( •STEPMODE NIL) ) (PLOT-BUTTON (•PLOT) (•WAIT 1.)) (BREAK-BUTTON (BREAK) (tWAIT 0)) (RATE-BUTTON (SETQ tRATE (TIMES 2. (ADD 1.1 (DIAL 1).)) (PRINT (LIST »#RATE #RATE)) (#RATE tRATE) . (REALWAIT MEDIUM-WAIT) (#WAIT 0)) (CAMERA-BUTTON (iCAMERA (NOT CAMERA?) ) XREALWAIT SHORT-WAIT) (tWAIT 0)) NIL)) ;PROCESS PEN HIT (DEFUN EVAL-PEN () (PROG (HIT) (SETQ HIT (PENHIT) ) (COND ((LESSP HIT END-STEP) (REALWAIT SHORT-WAIT)) ((LESSP HIT END-AUTO) (tSTEPMODE NIL) ) ((LESSP HIT FWA-EVAL) (tSTEPMODE T) (CHANGE-VAR) (#WAIT 1)) . (T (PROG (N LIST) (SETQ LIST LOCLIST N 0) LOOP (COND ( (NOT (NUMBERP (CAR LIST))) (RETURN NIL)) ( (GREATERP HIT (CAR LIST) } ) (T (SETQ LIST (CDR LIST) N (ADD1 N) ) (GO LOOP))) (AGTDSP (CAR LIST) NIL FULLMODE 1 : STACK) (WIPE-VAL) (REALWAIT SHORT-WAIT) (SETQ STACK-BACKUP STACK?) (#STEPMODE T) (*UNEVAL* N) )))•)) ;BACK-UP ANIMATION N LEVELS (DEFUN *UNEVAL* (##N##) (COND ({OR (LESSP ##N## 2) (NOT (UNEVAL »EVAL1))) (INDEX '.ARRAY 1) (UNEVAL »*EVAL T)) (T (UNEVAL »EVAL1 (LIST »*UNEVAL* (SUB1 ##N##)))))) ;PROCESS A PEN HIT OF A VARIABLE {DEFUN CHANGE-VAR () (PROG (HIT LIST AT) (SETQ LIST DISP-VARS HIT (SOB (PENHIT) FWA-VARS)) LOOP (OB (LESSP HIT (GET (CAB LIST) * BEGIN) ) (GBEATEBP HIT (ADD AGT-VALOE-LENGTH (GET (CAR LIST) ' VAL-ADDR) ) ) (GO GOTIT) ) (SETQ LIST (CDR LIST) ) (OB (NOLL LIST) (GO LOOP)) (RETURN NIL) GOTIT (SETQ AT (CAB LIST)) (AGTDSP (SETQ HIT (ADD FWA-VARS (GET AT 'BEGIN) NIL FULLMODE 1 : BRIGHT) (MSSG TYPE THE NEW VALOE FOR: (AT) ) (*SETQ1 AT (READ ERRIN) (COND (EVALING? A) (*ALIST) ) ) (REALWAIT .MEDIUM-WAIT) (AGTDSP HIT NIL FULLMODE 1 :NORMAL) ) ) ; START A NEW SEQUENCE—INITIALIZE EVERYTHING, WIPE SCREENS, ; TIME=0 (DEFUN tSTART () (#RATE 1.) (SETQ STACK? NIL RETURNS? T EVLIS-MOVE? T EVLIS? T SHORTQUOTE T #DEPTH 10000 STACK-VARS NIL EXCLUDE-ATOMS NIL EXCLUDE-FNS NIL BBIEF-FNS NIL) (AND ATAGT? (AGTRD 0 NORMAL-BUTTONS) ) (# BLANK) (STATUS 37)) (DEFUN #END () (#CAMEBA NIL) (MSSG ((TIMES (STATUS 39) 9.999999E-4)) "SECONDS.")) ; BLANK THE SCREENS. ;PUT A PROGRAM IN ADAGE TO PROVIDE A "FIXED" ADDRESS FOR THE ; BEGINNING OF ; THE STACK DISPLAY, WHICH COMES DOWN FROM THE ADAGE LWA. (DEFUN #BLANK {) 88 (OS STACK? (SETQ BMABGIN SCREEN-LIMIT)) (AND STAB (PUT STAB * STAB NIL) ) (AGTDSP 1 T FULLMODE CONTBOL-LEN :CONTBOL) (AGTDSP LWA-ADAGE NIL FULLMODE 1 :EOL) (SETQ TOP-SCREEN-AGT (SUB SCBEEN-LIMIT TXTHT) STACK-TOP TOP-SCBEEN-AGT BOTTOM-SCBEEN-AGT BOTTOM-OF-FILM DISP-VABS NIL STAB NIL FOLLOW-X NIL FBEE INIT-FREE FWA-STAR NIL •FWA-MSGS NIL FWA-VABS NIL FWA-EVAL NIL LAST-STAB NIL) (AND ?STEPMODE (tSTEPMODE T))) ;PLOT THE SCBEEN TO FILE -PLOT* (DEFUN #PLOT () (SETQ PLOTTED? T) (AGPLOT LWA-ADAGE) ) ; (#DEPTH N) SETS THE NUMBEB OF LEVELS OF EVAL TO DISPLAY (DEFUN IDEPTH (N) (SETQ tDEPTH N) ) ;START OR STOP CAMERA (DEFUN tCAMERA (N) (SETQ CAMERA? (MEMQ N '(ON T) ) ) (COND (CAMERA? (AGTCON LIGHTSON 1 0 ;CONTROL CAMEfiA-CONTROL) (OB TIME-FILM-STABTED (SETQ TIME-FILM-STABTED (STATUS 39)))) (T (AGTCON LIGHTSOFF 1 0 :CONTBOL CAHEBA-CONTBOL) (AND TIME-FILM-STABTED (PBOGN (SETQ FILM-USED (ADD FILM-USED (TIMES 9.999999E-4 (SUB (STATUS 39) TIME-FILM-STABTED) ).) ) (MSSG (FILM-USED) SECONDS OF FILM USED ON THIS CARTRIDGE) (SETQ TIHE-FILM-STARTED NIL)))}) (AGTDSP CAMERA-CONTROL NIL FOLLMODE 1 :CONTROL CAMERA-CONTROL)) ; (STEPMODE X) SETS STEP MODE. X MAY BE; ON, OFF, NIL, T (DEFUN #STEPMODE N (SETQ RESTART-CAMERA (OR RESTART-CAMERA (AND CAMERA? (NOT ?STEPMODE))) ?STEPHODE (OR (EQ N 0) (MEMQ (ARG 1) « (ON T) ).)•) (COND (?STEPMODE (AGTDSP STEP-CONTROL NIL FOLLMODE 1 :NOP) (AND CAMERA? (#CAMERA NIL))) (T (AGTDSP STEP-CONTROL NIL FULLMODE 1 :CONTROL STEP-CONTROL) (AND RESTART-CAMERA (#CAMERA T) (SETQ RESTART-CAMERA NIL)))}) ;THIS BRINGS UP A PATTERN FOR ADJUSTING THE CAMERA ;LOW INTENSITY REDUCES SMEAR (DEFUN #FOCUS () (#BLANK) (#DISP (AGTCON INT 0 0.3 : ARRAY) (•GOTO NEG-SCREEN-LIMIT SCREEN-LIMIT) {•PLOT NEG-SCREEN-LIMIT BOTTOM-OF-FILM) (•PLOT SCREEN-LIMIT BOTTOM-OF-FILM) (•PLOT SCREEN-LIMIT SCREEN-LIMIT) (•PLOT NEG-SCREEN-LIMIT SCREEN-LIHIT) (•PLOT SCREEN-LIMIT BOTTOM-OF-FILH) (•GOTO NEG-SCREEN-LIMIT BOTTOM-OF-FILM) (•PLOT SCREEN-LIMIT SCREEN-LIMIT) (•GOTO 0 SCREEN-LIMIT) {•PLOT 0 BOTTOM-OF-FILM)) (# WAIT 3600) (# BLANK) ) ;DISPLAY A GRID ON THE SCREEN FOR REFERENCE (DEFUN #GRID () (#DISP (DO Y S C R E E N - L I M I T ( S U B Y 1.) ( L E S S P Y B O T T O M - O F - F I L M ) (AND (EQ Y 0.) ( • I N T E N S I T Y B R I G H T ) ( A G T C V T 0 0 N I L N I L : A R R A Y ) ) ( * G O T O N E G - S C R E E N - L I M I T Y) ( • P L O T S C R E E N - L I M I T Y) (AND (EQ Y 0.) ( • I N T E N S I T Y N O R M A L ) ) ) (DO X N E G - S C R E E N - L I M I T (ADD X 1. ) ( G R E A T E R P X S C R E E N — L I MIT) (AND (EQ X 0.) ( • I N T E N S I T Y B R I G H T ) ( A G T C V T 0 0 N I L N I L : A R R A Y ) ) ( •GOTO X S C R E E N - L I M I T ) ( • P L O T X B O T T O M - O F - F I L M ) (AND (EQ X 0.) { • I N T E N S I T Y N O R M A L ) ) ) ( •DASH ) ( •GOTO N E G - S C R E E N - L I M I T B O T T O M - O F - F I L M ) { • P L O T S C R E E N - L I M I T B O T T O M - O F - F I L M ) (•UNDASB.) ( • SYMBOL 0.05 0.05 0 0.2))) ************** E V A L * * * * * * * * * * * * * * ( D E F U N # E V A L Q N E X P R N ( # E V A L (ARG 1) (COND { ( EQ N 1) • A L I S T ) ( ( E V A L (ARG 2)))))) (DEFUN #EVAL N (AGTRD 0 ErAL-BUTTONS) (SETQ EVALING? T TEMP-FREE FREE DY-EVAL 0. DY-STACK 0.) (AND STACK? (SETQ RMARGIN (MIN RMARGIN ( SUB STACK-X DONT-TOUCH) ) ) ) (SETQ FWA-FOLLOW FREE F R E E (ADD FWA-FOLLOW FOLLOW-LENGTH) FWA-RETVAL FREE F R E E {ADD FWA-RETVAL AGT-VALUE-LENGTH)) (AGTDSP (ADD1 F R E E ) • NIL FULLMODE (SUB1 ROLL-EOL) : ROLL 2) (AGTDSP F R E E N I L FULLMODE 1 : R O L L ) (AND FOLLOW? (AGTDSP (ADD! FWA-FOLLOW) NIL FULLMODE (SUB1 FOLLOW-LENGTH) :FOLLOW 2) (AGTDSP FWA-FOLLOW NIL FULLMODE 1 :FOLLOW)) (AND RETURNS? (AGTDSP FWA-RETVAL NIL FULLMODE 1 :SKIP-VAL)) (SETQ EVAL-ROLL FREE FWA-EVAL (ADD EVAL-ROLL ROLL-LEN) BOTTOM-EVAL (ADD EVAL-BLK-HT BOTTOM-OF-FILM DONT-TOUCH) NBLOCKS (ADD1 (FIX (DIVIDE (SUB TOP-SCREEN-AGT BOTTOM-EVAL) (ADD DOWN-Y EVAL-BLK-HT)))) NROLL (FIX (ADD 0.5 (TIMES NBLOCKS ROLL-RATIO))) ROLL-DIST (TIMES NROLL (ADD DOWN-Y EVAL-BLK-HT)) JUMP-ROLL (ADD EVAL-ROLL ROLL-JUMP -1) STACK-BACKUP NIL EVAL-COUNTER (ADD 10000 EVAL-COUNTER) STACK-HEIGHT (SUB (SUB STACK-TOP 0.8) BOTTOM—OF-FILM) STACK-ADDRESS LWA-ADAGE Y-STACK BOTTOM-OF-FILM LAST-STAR NIL STACK-CHOP NIL LAST-RETVAL *" «) (AND STACK? ALIST? (PROG (A LENGTH ADDR-LIST) (SETQ A (COND ( (EQ N 1) *ALIST) ((ARG 2 ) ) ) Y-STACK (ADD BOTTOM-OF-FILM (A-HEIGHT A)) Y-ALIST (MAX BOTTOM-OF-FILM (SUB Y-STACK LINE-SKIP) ) ) (AGTEXT (SUB STACK-X TXTHT) Y-ALIST TXTHT if (ii : TEMP D (INDEX :ARRAY 1) (MAPC * ALIST-ENTRY A) (SETQ LENGTH (SUB1 (INDEX : ARRAY) ) STACK-ADDRESS (SUB LWA-ADAGE LENGTH) ) (MAPC ' (LAMBDA (X) (ADDPROP (CAR X) •ALIST-ADDR (ADD STACK-ADDRESS (CDR X ) ) ) ) 92 ADDR-LIST) (AND (ZEROP LENGTH) (•SYMBOL STACK-X BOTTOM-OF-FILM ii j 11 TXTHT) (SETQ Y-STACK (ADD Y-STACK LINE-SKIP) STACK-ADDRESS (SOB STACK-ADDRESS PAREN-LEN) LENGTH PAREN-LEN)) (AGTDSP STACK-ADDRESS NIL FOLLMODE LENGTH : ARRAY) {AGTCON JUMP STACK-ADDRESS 0 :ARRAY 1) (AGTDSP STACK-JUMP NIL FULLMODE 1 .:ARRAY) (AGTDSP ALIST-LPAREN NIL FULLMODE PAREN-LEN : TEMP) ) ) (INDEX : ARRAY 1) (PROG 1 {•EVAL (ARG 1) (COND ((EQ N 1) •ALIST) ((ARG 2))) NEG-SCREEN-LIMIT TOP—SCREEN-AGT 0 (LIST FWA-EVAL) (LIST STACK-ADDRESS) (LIST Y-STACK) T) (AGTRD 0 NORMAL-BUTTONS) (SETQ EVALING? NIL FREE TEMP-FREE))) (SETQ •ALIST »(•(!. . T) ) *GOLIST NIL) ;FORM TO BE EVALED A THE ALIST X & Y SCREEN COORDINATES ;LEVEL* NUMBER OF LEVELS OF •EVAL ; LOCLIST LIST OF ADAGE ADDRESSES OF BEGINNING ,OF EACH •EVAL DISPLAY STACKLIST LIST OF ADDRESSES OF STACK DISPLAY ;STACK-Y LIST OF Y-COORDINATES OF STACK TOP DISP? NO DISPLAY IF NIL (DEFUN •EVAL (FORM A X Y LEVELS LOCLIST STACKLIST STACK-Y DISP?) (SETQ LEVELS (ADD LEVEL* 1)) (PROG (RETURN—VALUE BUFLOC OLD-DISP? MIDBOX RGT MID BOT PPSIZE EXIT-FORM STAR-DONE VAR1 VAR2 / #TIMES) (SETQ BUFLOC (CAR LOCLIST) OLD-DISP? DISP?) (AND (EQ LEVEL* (ADD1 tDEPTH) ) 93 (SETQ DISP? NIL) ) -(DO-SPECIALS) (AND DISP? (DO-EXCLUDES)) (SETQ MID (ADD BOXW/2 X) DWN (SOB Y ARBL) PPSIZE 0 BOT (SUB DSN BOXH) RGT (ADD X BOXW) MIDBOX (SUB DSN BOXH/2)) (COND ((OR DISP? OLD-DISP?) (DISPEV-ENTER) (AND STACK-BACKUP (STACK-BACKUP) ) (#WAIT ENTER—WAIT)) (T (SETQ LOCLIST (CONS BUFLOC LOCLIST)))) (SETQ RETURN-VALUE (EVAL1 FORM)) (COND ((OR DISP? OLD-DISP?) (DISPEV-EXIT) (#WAIT EXIT-WAIT) ) ) (EVAL EXIT-FORM) (RETURN RETURN-VALUE) ) ) (DEFUN EVAL 1 (FORM) (COND ( (NULL FORM) NIL) ((NUMBERP FORM) FORM) ((ATOM FORM) (*VALUE FORM A *(ERRMSG UNDEFINED ATOM: (FORM)))) ((ATOM (CAR FORM)) (SELECTQ (CAR FORM) • (CADR FORM) (COND (*EVCON (CDR FORM) A)) (OR (*OH (CDR FORM) ) ) (AND (*AND (CDR FORM))) (PROG (PROGl (*PROG (CDR FORM) A) (UNBIND-DISP (CADR FORM)))) (PROGN (*EVALIST (CDR FORM) A)) (SETQ (FOLLOW (ADD X BOXW FOLLOWER-SIZE DONT-TOUCH) (SUB (ADD Y DY-EVAL) EVAL-BLK-HT) ) (PROG1 (*SETQ (CDR FORM) A) (FOLLOW-OFF))) (SET (FOLLOW (ADD X BOXW FOLLOWER-SIZE DONT-TOUCH) (SUB (ADD Y DY-EVAL) EVAL-BLK-HT)) (PSOG1 (*SET (CDR FORM) 94 A) (FOLLOW-OFF))) (ARG (*VALUE (MKATOM '"ARG " (*EVAL (CADR FORM) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) ) A •(ERRMSG ARG ((CADR FORM)) IS UNDEFINED) )•)• (RETURN (RETURN (*EVAL (CADR FORM) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) »*PROG)) (GO (SETQ PROGFORM (ASSOC (CADR FORM) *GOLIST ' (ERRMSG NO ' LABEL: ( (CADR IN PROG))) FORM) ) *" ") (SELECT (*SELECT (SELECT-THING) (CDDR FORM) ) ) (SELECTQ (*SELECTQ (SELECT-THING) (CDDR FORM) ) ) (APPLY (APPLY »*APPLY (NCONC (*EVLIS (CDR FORM) A) A) ) ) (EVAL (*EVAL (PROG 1 (*EVAL (CADR FORM) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) (WIPE-OUT) ) A X 95 (DOWN) LEVEL* LOCLIST STACKLIST STACK-Y DISP?}) (PROG (EXP) (COND ((SETQ EXP (OR (GET (CAR FORM) * STAR) (GET (CAR FORM) »EXPR) ) ) (*APPLY EXP (PROG1 (COND ((EQ (CAR EXP) (DISP-NF ((EQ (CAR (DISP-NF (T (*EVLIS * NLAMBDA) (CDR FORM)),) EXP) •FLAMBDA) (LIST (CDR FORM)))) (CDR FORM) A) ) ) (AND (MEMQ (CAR FORM) BRIEF-FNS) (SETQ DISP? NIL) ) ) A)) ( (GET (CAR FORM) «SOBR) (APPLY (CAR FORM) (*EVLIS (CDR FORM) A)}) ( (GET (CAR FORM) ' NSOBR) (ERRMSG NSUBR: ((CAR FORM))) (APPLY (CAR FORM) (CDR FORM))) ({GET (CAR FORM) * FSDBR) (ERRMSG FSOBR: ({CAR FORM)}) {APPLY (CAR FORM) (LIST (CDR FORM) ) ) ) ( (CAR FORM) (*EVAL (CONS (*VALUE (CAR FORM) A » (ERRMSG UNDEFINED FUNCTION: {(CAE FORM)))) (CDR FORM) ) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?)))))) ( (EQ (CAAR FORM) * NLAMBDA) (•APPLY (CAR FORM) (CDR FORM) A)) { (EQ (CAAR FORM) 'FLAMBDA) (•APPLY (CAR FORM) (LIST (CDR FORM)) A)) (T (•APPLY (CAR FORM) (•EVLIS (CDR FORM) A) A)) ) ) (DEFUN •APPLY (FN ARGS A) (COND ( (NULL FN) NIL) {(ATOB FN) (PROG (EXP) (COND ((SETQ EXP (OR (GET FN »STAfl) (GET FN »EXPR)) ) (AND (MEMQ FN BRIEF-FNS) (SETQ DISP? NIL)) (•APPLY EXP ARGS A)) ((GET FN ((GET FN (APPLY ((GET FN (APPLY •SUBR) (APPLY FN ARGS)) • FSUBR) FN ARGS)) 'NSUBR) FN ARGS)) (T (•APPLY (•VALUE FN A » (ERRMSG ARGS A))))) ((EQ (CAR FN) STAR-FORM) (DO-STAR (CADR FN) ) (•APPLY (CADDR FN) ARGS A) ) ((MEMQ (CAR FN) •(LAMBDA NLAMBDA FLAMBDA)) (COND ( (AND (LISTP (CADR FN)) (N EQ (LENGTH (CADR FN) ) (LENGTH ARGS))) (ERRMSG WRONG NUMBER OF ARGUMENTS TO: (FN))) (T (PROG 1 {•EV ALIST UNDEFINED FUNCTION (FN))) (CADR FN) (CDDR FN) (NCONC (STACK-DISP (•PAIR 97 ARGS) ) A)-) (UNBIND-DISP (CADR FN}))))) (T {*APPLY (*EVAL FN A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) ARGS A) ) ) ) (DEFUN *EVCON (C A) (COND ( (NULL C) NIL) {{NULL (CDAR C)) (COND ( (NULL (CDR C)) (*EVAL (CAAR C) A X (DOWN) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) ) ( (*EVAL (CAAR C) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) ) (T (WIPE-OUT) (*EVCON (CDR C) A)))) ((*EVAL (CAAR C) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) (WIPE-OUT) (*EVALIST (CDAR C) A) ) (T (WIPE-OUT) (*EVCON (CDR C) A)))) (DEFUN *OR (L) (COND ( (NULL L) NIL) ((*EVAL (CAR L) A 98 (SIGHT) (EIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) ) (T (WIPE-OUT) (*OR (CDS L) ) ) ) ) (DEFUN *AND (L) (COND ( (NULL (CDS L) ) (*EVAL (CAR L) A (SIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?)) ((*EVAL (CAR L) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y , DISP?) (WIPE-OUT) (*AND (CDR L) ) ) ) ) (DEFUN *EVLIS (H A) (COND ((AND DISP? EVLIS? EVLIS-MOVE?) (PROG (EV-LOC EVLIS-Y EV-RIGHT) (SETQ EVLIS-Y (SUB Y (ADD LINE-SKIP < EVAL-BLK-HT)) EV-LOC LOCLIST EV-RIGHT RIGHT-X) (PROG1 (MAPLIST 1(LAMBDA (J) (DISP-EVLIS (*EVAL (CAR J) A (RIGHT EV-EIGHT) (RIGHTY) LEVEL* EV-LOC STACKLIST 99 STACK-Y DISP?))) M) (REALWAIT SHORT-WAIT)))) (T (MAPLIST • (LAMBDA (J) (PROG 1 (*EVAL (CAR J) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y (AND EVLIS? DISP?)) (WIPE-OUT) ) ) M) )) ) ;RETURNS THE VALUE OF ATOM. IF NO VALUE ; IS FOUND, ERROR IS EVALED (DEFUN *VALUE (ATOM ALIST ERROR) (PROG (V AL) (COND {(NULL ATOM) NIL) {(SETQ VAL (ASSOC ATOM ALIST)) (AND REFS? (MEMQ ATOM DISP-VARS) (PROG (HIT) (FOLLOW (ADD X BOXW FOLLOWER-SIZE DONT-TOUCH) (SUB (ADD Y DY-EVAL) EVAL-BLK-HT) ) (FOLLOW X-FOLLOW-VARS Y-FOLLOW-VARS) (FOLLOW-OFF) (AGTDSP (SETQ HIT (ADD FWA-VARS (GET ATOM •BEGIN) -1) ) NIL FULLMODE 1 :BRIGHT) (REALWAIT MEDIUM-WAIT) (AGTDSP HIT NIL FULLMODE 1 : NORMAL) (REALWAIT SHORT-WAIT))) (CDR VAL)) f (T (EVAL ERROR)} ) ) ) 100 ;PAIR ATOMS WITH VALUES FOR ALIST. ALSO DOES NO-SPREAD BINDING (DEEUN *PAIR (W Z) (COND ((LISTP W) (PAIR 1 W Z) ) ( (NULL W) NIL) (T (PROG (N) (SETQ N 0) (CONS (CONS W (LENGTH Z)) (MAPCAR •(LAMBDA (X) (ADD 1 N))) Z) )•)•))) (CONS (MKATOM '"ARG " (SETQ N X) ) (DEFUN PAIR 1 (W Z) (COND { (NULL W) NIL) (T (CONS (CONS (PAIR (CAR W) (CAR Z)) (CDR W) (CDR Z)))))) ;EVALS A LIST RETURNING THE LAST (DEFUN *EVALIST (L A) (COND { (NULL (CDR L) ) (*EVAL (CAR L) A X (DOWN) LEVEL* LOCLIST STACKLIST STACK-Y DISP?)) (T (*EVAL (CAR L) A X (DOWN) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) (WIPE-GUT) (*EVALIST (CDR L) A) ) ) ) (DEFUN *PROG (D A) (PROG (*GOLIST) (SETQ *GOLIST (*GETLABELS (CDR D)) ) (*EVALPROG (CDR D) (NCONC (STACK-DISP (*PAIRNIL (CAR D) )) A)))) ;PAIRS A LIST OF PROG VARIABLES WITH NIL (DEFUN *PAIRNIL (W) 101 (COND ( (NULL W) NIL) (T (CONS (CONS (CAB W) NIL) (*PAIRNIL (CDR H) ) ) ) )•) ;FIND LABELS IN A PROG. BETUBNS LIST: {(LABEL . FORM) ( . .),) (DEFUN *GETLABELS (W) (COND {(NULL K) NIL) ({LISTP (CAR W)) (*GETLABELS (CDR W))) (T (CONS {CONS (CAR W) (CDR H) ) (*GETLABELS (CDR W) ) ) ) ) ) ;LIKE EVALIST, BUT IGNORES ATOMS. MTS STYLE PBOG. EVAL CHANGES ; PBOGFOBM WHEN A "GO" IS DONE. (DEFUN *EVALPROG (PROGFORM A) (COND ({NULL (CDS PROGFORM) ) (COND ({ATOM (CAR PROGFORM)) PROGFORM) (T (*EVAL (CAR PROGFORM) A X (D08N) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) (COND ( (CDR PROGFORM) (*EVALPROG (CDR PBOGFOBM) A)))))) (T (COND ((LISTP (CAR PROGFORM)) (*EVAL (CAB PBOGFOBM) A X (DOWN) LEVEL* LOCLIST STACKLIST STACK-Y DISP?) (WIPE-OUT) ) ) (*EVALPRGG (CDR PROGFORM) A)))) (DEFUN *SETQ (Q A) (COND ( (LISTP (CAB Q) ) (ERRMSG ATTEMPT TO SETQ: ((CAB Q) )•) ) ({NULL (CDDR Q)) (*SETQ1 (CAR Q) (*EVAL (CADR Q) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y 102 DISP?) A)) (T {•SETQI (CAE Q) (•EVAL (CADR Q) A (RIGHT) (RIGHTY) LEVELS LOCLIST STACKLIST STACK-Y DISP?) A) (WIPE-OOT) (•SETQ (CDDR Q) A) ) ) ) (DEFUN •SET (Q A) (PROG (AT) (SETQ AT (*EVAL (CAR Q) A (RIGHT) (RIGHTY) LEVELS LOCLIST STACKLIST STACK-Y DISP?)) (WIPE-OUT) (COND ( (LISTP (CAR Q) ) (ERRMSG ATTEMPT TO SET: (AT))) ((NULL (CDDR Q)) (•SETQ1 AT (•EVAL (CADR Q) A (RIGHT) (RIGHTY) LEVELS LOCLIST STACKLIST STACK-Y DISP?) A)) (T {•SETQ1 AT (•EVAL (CADR Q) A (RIGHT) (RIGHTY) LEVELS LOCLIST STACKLIST STACK-Y DISP?) A))))) A) (WIPE-OUT) (•SET (CDDR Q) 103 ;USED BY *SET *SETQ #SET #SETQ & CHANGE-VAR (DEFUN *SETQ1 (W Z A) (COND ( (EQ ST (CAAR A)) (RPLACD (CAR A) Z) (VAR-CHANGE W Z) (COND ((AND ALIST? (GET « . •ALIST-X)) (PROG (LENGTH ADDR Y) (INDEX : ARRAY 1) (PPD (CAR A) STACK-X (SETQ Y (GET H »ALIST-Y)) VALUE-LENGTH VAR-PPLEV 0) (SETQ LENGTH (SUB1 (INDEX :ARRAY))) (FOLLOW (SUB STACK-X (ADD FOLLOWER-SIZE DONT-TOUCH)) Y) (COND { (EQ Y BOTTOM-OF-FILM) (AND (LESSP LENGTH (SUB AGT-VALUE-LENGTH PAREN-LEN) ) (AGTCON JUMPR (SUB AGT-VALUE-LENGTH (ADD LENGTH PAREN-LEN) ) 0 : ARRAY) ) (AGTEXT "+X+" (ADD Y-ALIST LINE-SKIP) TXTHT HJ n : ARRAY (ADD1 (SUB AGT-VALUE-LENGTH, PAREN-LEN)) ) ) { (LESSP LENGTH AGT-VALUE-LENGTH) (AGTCON JUMPR (SUB AGT-VALUE-LENGTH LENGTH) 0 :ARRAY) ) ) (AGTDSP (SETQ ADDR (SUB1 (GET W »ALIST-ADDR)}) NIL FULLMODE 1 :SKIP-VAL) (AGTDSP (ADD 1 ADDR) NIL FULLMODE (SUB 1 AGT-VALUE-LENGTH) ;ARRAY 2) (AGTDSP ADDR NIL FULLMODE 1 : ARRAY) (FOLLOW-OFF) (REALWAIT SHORT-WAIT)))) Z) ( (NULL (CDR A) ) (NCONC A (CONS (CONS W Z) NIL)) (VAR-CHANGE W Z) Z) (T (*SETQ1 W Z (CDR A) ) ) ) ) (DEFUN SELECT-THING () (SETQ EV-LOC LOCLIST) (COND (DISP? (PROG (EVLIS-Y) (SETQ EVLIS-Y (SUB Y (ADD LINE-SKIP EVAL-BLK-HT) ) ) (PROG 1 (DISP-EVLIS (*EVAL (CADR FORM) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?)) (REALWAIT SHORT-WAIT)))) (T (*EVAL (CADR FORM) A (RIGHT) (RIGHTY) LEVEL* LOCLIST STACKLIST STACK-Y DISP?)))) (DEFUN *SELECT (THING CHOICES) (COND ({NULL (CDR CHOICES)) (*EVAL (CAR CHOICES) A X (DOWN) LEVEL* EV-LOC STACKLIST STACK-Y DISP?)) ((EQUAL THING (•EVAL-(CAAE CHOICES) A (SIGHT) (EIGHTY) LEVELS EV-LOC STACKLIST STACK-Y DISP?) ) (WIPE-OUT) (•EVALIST (CDAE CHOICES) A) ) (T (WIPE-OUT) (•SELECT THING (CDS CHOICES))})) (DEFUN •SELECTQ (THING CHOICES) (COND ( (NULL (CDS CHOICES) ) {•EVAL (CAR CHOICES) A X (DOWN) LEVELS EV-LOC STACKLIST STACK-Y DISP?)) ({COND { (ATOM (CAAR CHOICES) ) (EQ THING {CAAE CHOICES))) ( (MEMQ THING (CAAR CHOICES)))) {•EVALIST (CDAR CHOICES) A) ) ({•SELECTQ THING (CDR CHOICES))))) ;***************** DISPLAY ***************** DISPLAYS :ARRAY FOLLOWED BY EOL. RETURNS FWA (DEFUN DISPL () (PROG (N) (SETQ N (INDEX : ARRAY) ) (AGTCVT 0 0 NIL T :ARRAY) (AGTDSP FREE NIL FULLMODE 1 :EOL) (AGTDSP (ADD1 FREE) NIL FULLMODE (SUB1 N) :ARRAY 2) (AGTDSP FREE NIL FULLMODE 1 (PROG1 FREE (SETQ FREE {ADD : ARRAY) FREE N -1) ) } ) ) ;DISPLAYS :ARRAY FOLLOWED BY A JUMP TO THE STACK (DEFUN DSP-EVAL (LOC LEN) (JUMP EVAL-RETURN) (AGTDSP (ADD 1 LOC) NIL FULLMODE (SUB1 LEN) : ARRAY 2) (AGTDSP LOC NIL FULLMODE 1 : ARRAY)) ;ROLLS THE EVAL DISPLAY THE GIVEN DISTANCE (+=OP) ;ROLL-RATE IS DISPLAY-UNITS / SECOND (DEFUN ROLL-EVAL (DIST) (PROG (SECS NFRAMES) (SETQ DY-EVAL (ADD DIST DY-EVAL) BOTTOM-EVAL (SUB BOTTOM-EVAL DIST) SECS (DIVIDE (ABS DIST) ROLL-RATE) DIST (TIMES DIST DY-DX-SCALE) NFRAMES (TIMES SECS FRAMES/SEC}) (AGTCON INCR 0 (DIVIDE DIST NFRAMES) :TEMP 2) (SETQ NFRAMES (FIX (ABS (DIVIDE DIST (DIVIDE (CVT-AGTNUM (CADR (CONAGT :TEMP 2))) 8192.))))) (AGTCON SKIPZ NFRAMES 0 :TEMP 1) (AGTDSP EVAL-ROLL NIL FULLMODE 2 :TEMP) (AND RETURNS? (AGTDSP (ADD FWA-RETVAL U) NIL FULLMODE 2 : TEMP)) (REALWAIT (DIVIDE NFRAMES FRAMES/SEC)))) ;CONVERT AGT NUMBER TO SIGNED INTEGER (DEFUN CVT-AGTNUM (X) (COND ( (GREATERP X 8192) (SUB X 16383)) (X))) ;CHANGE A DISPLAYED ATOMIC VALUE (DEFUN VAR-CHANGE (AT VAL) (COND ( (AND (MEMQ AT DISP-VARS) (NEQ VAL (GET AT 'VALUE '"*UNDEF* "))) (PROG (LENGTH ADDR) (AND (NUMBERP AT) (SETQ AT (MKATOM '"ARG " AT))) (AND FOLLOW-X (FOLLOW X-FOLLOW-VARS Y-FOLLOW-VARS)) (PUT AT 'VALUE VAL) (INDEX : ARRAY 1) (PPD VAL (GET AT «X) (GET AT «Y) VALUE-LENGTH VAR-PPLEV 0) (SETQ LENGTH (SUB1 (INDEX :ARRAY))) (AND (LESSP LENGTH AGT-VALUE-LENGTH) (AGTCON JUMPR 107 (SOB AGT-VALOE-LENGTH LENGTH) 0 :ARRAY) ) (SETQ ADDR (ADD FWA-VARS (GET AT * VAL-ADDfi) -1) ) (AGTDSP ADDR NIL FULLMODE 1 :SKIP-VAL) (AGTDSP (ADD1 ADDR) NIL FOLLHODE (SIN LENGTH (SUB1 AGT-VALUE-LENGTH) ) :ARRAY 2) (AGTDSP ADDR NIL FULLMODE 1 :ARRAY) (REALWAIT MEDIUM-WAIT))))) ;DISPLAY NEW STACK BLOCK ; THE NULL- WORD IS TO STORE AN EOL WHEN ROLLED OFF SCREEN (DEFUN STACK-DISP (L) (COND { (AND STACK? DISP?) (PROG (LENGTH ADDR ADDR-LIST) (SETQ Y-STACK (ADD DONT-TOUCH (CAR STACK-Y) ) ) X BOXW FOLLOWER-SIZE DONT-TOUCH) (ADD Y DY-EVAL) EVAL-BLK-HT)) STACK-X (ADD FOLLOWER-SIZE DONT-TOUCH)) Y-STACK FOLLOWER-SIZE DY-STACK}) (REALWAIT SHORT-WAIT) (AGTCVT 0 0 NIL NIL :ARRAY 1) (COND (ALIST? (SETQ Y-STACK (ADD (CAR STACK-Y) (A-HEIGHT L)) Y-ALIST (SUB Y-STACK LINE-SKIP)) (AGTEXT (SUB STACK-X TXTHT) Y-ALIST TXTHT : TEMP D (AND L (MAPC 'ALIST-ENTRY I.))) (T (AND L (MAPC * STACK-ENTRY L)) (*DASH) (*GOTO STACK-X (FOLLOW (ADD (SUB (FOLLOW (SUB (ADD 108 (SETQ Y-STACK (ADD DONT-TOUCH Y-STACK))) (*PLOT SCBEEN-LIMIT Y-STACK) (*UNDASH) ) ) (SETQ LENGTH (SUB1 (INDEX :ABBAY)) STACKLIST (CONS (SETQ ADDR (SUB (CAB STACKLIST) LENGTH) ) STACKLIST) STACK-Y (CONS Y-STACK STACK-Y)) (AND (GBEATERP Y-STACK STACK-TOP) (STACK-BOLL) ) (AGTDSP ADDR NIL FULLMODE LENGTH ; ABBAY) (AGTCON JUMP ADDR 0 :ARRAY 1) (AND ALIST? (AGTDSP ALIST-LPAREN NIL FULLMODE PABEN-LEN : TEMP) (MAPC *(LAMBDA (X) (ADDPBOP (CAB X) 'ALIST-ADDB (ADD ADDB (CDB X)))) ADDR-LIST) ) (AGTDSP STACK-JUMP NIL FULLMODE 1 ; ABBAY) (AND L (MAPC • (LAMBDA (X) (VAB-CHANGE (CAB X) (CDR X))) L)) (FOLLOW-OFF) ) ) (T (COND ((AND DISP? L) (FOLLOW (ADD X BOXW FOLLOWER-SIZE DONT-TOUCH) (SUB (ADD Y DY-EVAL) EVAL-BLK-HT)) (MAPC ' (LAMBDA (X) (VAfi-CHANGE (CAB X) (CDB X))) L) (FOLLOW-OFF) ) ) (SETQ STACKLIST (CONS (CAB STACKLIST) STACKLIST) STACK-Y (CONS (CAB STACK-Y) STACK-Y)))) I) ;PUT A VALUE ON THE STACK (DEFUN STACK-ENTRY (AT) (SETQ AT (CAR AT) ) (COND ((OR (EQ STACK-VARS T) (MEMQ AT STACK-VARS)) (AGTEXT STACK-X Y-STACK TXTHT (MKATOM AT '" =") : ARRAY) (PPD (*VALUE AT A *"*UNDEF* ») (ADD STACK-X (TIMES TXTHT (ADD 3 (PLEN AT)))) Y-STACK VALUE-LENGTH VAR-PPLEV 0) (SETQ.Y-STACK (ADD Y-STACK LINE-SKIP))))) ;MAKE A-LIST ENTRY ON STACK DISPLAY (DEFUN ALIST-ENTRY (L) (COND ((OR (EQ STACK-VARS T) (MEMQ (CAR L) STACK-VARS)) (SETQ.ADDR (INDEX :ARRAY)) (PPD L STACK-X Y-ALIST VALUE-LENGTH VAR-PPLEV 0) (SETQ A DDR-LIST (CONS (CONS (CAR L) ADDR) ADDR-LIST)) (ADDPROP (CAR L) 'ALIST-Y Y-ALIST) (SETQ LENGTH (SUB (INDEX : ARRAY) ADDR) Y-ALIST (SUB Y-ALIST LINE-SKIP)) (COND ((LESSP Y-ALIST BOTTOM-OF-FILM) (AND (LESSP LENGTH (SUB AGT-VALUE-LENGTH PAREN-LEN) ) (AGTCON JUMPR (SUB AGT-VALUE-LENGTH (ADD LENGTH PAREN-LEN) ) 0 : ARRAY)) (AGTEXT "+X+" (ADD Y-ALIST LINE-SKIP) TXTHT II :ARRAY (ADD ADDR (SUB AGT-VALUE-LENGTH PAREN-LEN) ) ) ) ((LESSP LENGTH AGT-VALUE-LENGTH) (AGTCON JUMPR (SUB AGT-VALUE-LENGTH LENGTH) 0 : ARRAY) )•) (INDEX :ARRAY (ADD ADDR AGT-VALUE-LENGTH))))) ;DETERMINE THE HEIGHT OF AN ALIST DISPLAY ENTRY (DEFUN A-HEIGHT (L) (PROG (N) (AND (EQ STACK-VARS T) (RETURN (TIMES LINE-SKIP (LENGTH L) ) )) (SETQ N 0) (MAPC » (LAMBDA (X) (AND (MEMQ (CAR X) STACK-VARS) (SETQ N (ADD N LINE-SKIP)))) (RETURN N))) ;DECIDES HOW MUCH TO ROLL THE STACK (DEFUN STACK-ROLL () (PROG (N LIST OLD) (SETQ LIST STACK-Y N 1 OLD STACK-CHOP) LOOP (AND (MINUSP (ADD (CAR LIST) DY-STACK)) (GO DONE)) (SETQ N (ADD1 N) LIST (CDR LIST)) (GO LOOP) DONE (AGTDSP (SETQ STACK-CHOP (CAR (NTH STACKLIST N))) NIL FULLMODE 1 :EOL) (AND OLD (AGTDSP OLD NIL FULLMODE 1 :NOP)) (ROLL-STACK (SUB BOTTOM-OF-FILM (ADD DY-STACK (CAR LIST)))))) ;ROLL THE STACK DISPLAY (DEFUN ROLL-STACK (DIST) (PROG (SECS NFRAMES) (SETQ DY-STACK (ADD DY-STACK DIST) SECS (DIVIDE (ABS DIST) ROLL-RATE) STACK-TOP (SUB STACK-TOP DIST) DIST (TIMES DIST DY-DX-SCALE) NFRAMES (TIMES SECS FRAMES/SEC)) (COND ( (NEQ 0 NFRAMES) (AGTCON INCR 0 (DIVIDE DIST NFRAMES) :TEMP 2) (SETQ NFRAMES (FIX (ABS (DIVIDE DIST (DIVIDE (CVT-AGTNUM (CADE (CONAGT :TEMP 2)}) 8192.))))) (AGTCON SKIPZ NFRAMES 0 :TEMP 1) (AGTDSP STACK—ROLL-ADDR NIL FOLLMODE 2 :TEMP) (REALSAIT (DIVIDE NFRAMES FRAMES/SEC)))))) ;CHANGE DISPLAY AS STACK POPS (DEFON ONBIND-DISP (LIST) (AND LIST (ATOM LIST) (PROG (N L) (SETQ N 0 L NIL) (REPEAT 1 (SETQ L (CONS (MKATOM '"ARG." (SETQ N (ADD1 N) L}) (LENGTH ARGS)) (SETQ LIST (CONS LIST 1) ) )•)• (COND ( (AND STACK? DISP?) (FOLLOW-OFF) (FOLLOW (ADD X BOXW FOLLOWER-SIZE DONT-TOUCH) (SUB (ADD Y DY-EVAL) EVAL-BLK-HT)) (FOLLOW (SUB STACK-X (ADD FOLLOWER-SIZE DONT-TOUCH)) (ADD (CAR STACK-Y) FOLLOWER-SIZE DY-STACK) ) (COND (ALIST? (MAPC 1(LAMBDA (AT) (REM AT 'ALIST-ADDR) (REM AT •ALIST-Y)) LIST) (AGTEXT (SUB STACK-X TXTHT) (SUB (CADR STACK-Y) LINE-SKIP) TXTHT ii (ii : TEMP D (AGTDSP ALIST-LPAREN NIL FULLMODE PAREN-LEN : TEMP) ) ) (AGTCON JUMP (CADR STACKLIST) 0 :TEMP 1) (AGTDSP STACK-JUMP NIL FULLMODE 1 :TEMP) 112 (SETQ STACK-Y (CDR STACK-Y) STACKLIST (CDR STACKLIST)) (ROLL-ST ACK-BACK) (MAPC • (LAMBDA (AT) (VAR-CHANGE AT (•VALUE AT A '"*UNDEF* "))) LIST) (FOLLOW-OFF) ) ((AND LIST DISP?) (FOLLOW-OFF) (FOLLOW (ADD X BOXW FOLLOWER-SIZE DONT-TOUCH) (SUB (ADD Y DY-EVAL) EVAL-BLK-HT)) (MAPC » (LAMBDA (AT) (VAR-CHANGE AT (•VALUE AT A • "*UNDEF* ") ) ) LIST) (FOLLOW-OFF) )) ) (DEFUN ROLL-STACK-BACK () (COND ((AND {LESSP (ADD DY-STACK DONT-TOUCH) 0.) (LESSP (CAR STACK-Y) (SUB STACK-TOP STACK-HEIGHT))) (ROLL-STACK (MIN STACK-HEIGHT (MINUS DY-STACK))) (PROG (N LIST OLD) (SETQ LIST STACK-Y N 1 OLD STACK-CHOP) LOOP (OR (GREATERP (ADD (CAR LIST) DY-STACK) BOTTOM-OF-FILM) (GO DONE) ) (SETQ N (ADD1 N) LIST (CDR LIST)) (GO LOOP) DONE (AGTDSP (SETQ STACK-CHOP (CAR (NTH STACKLIST N))) NIL FULLMODE 1 :EOL) (AND OLD (AGTDSP OLD NIL FULLMODE 1 : NOP) ))>.))) ;RESTORE THE STACK IF WE BACK UP (DEFUN STACK-BACKUP () (SETQ STACK-BACKUP NIL) (AGTCON JUMP (CAS STACKLIST) 0 : TEMP 1) (AGTDSP STACK-JUMP NIL FULLMODE 1 :TEMP) {ROLL-STACK-BACK) (DISP-ALL-VABS) ) ;HAKE SORE ALL DISPLAYED VARIABLES ARE CORRECT (DEFUN DISP-ALL-VARS () (MAPC »(LAMBDA (AT) (VAR-CHANGE AT (•VALUE AT A «»*UNDEF* "))) DISP-VARS)) ;THIS CLEARS THE RETURN VALUE (DEFUN WIPE-VAL () (COND ((AND RETURNS? (NEQ LAST-RETVAL »)) (AGTDSP FWA-RETVAL NIL FOLLMODE 1 :SKIP-VAL) (SETQ LAST-RETVAL ") ) ) ) (DEFUN WIPE-OUT () (AND DISP? (REALWAIT SHORT-WAIT) (WIPE-VAL))) ;CALCULATE POSITION OF EVAL BLOCK TO THE RIGHT, AND DRAW AN ; ARROW (DEFUN RIGHT N (INDEX : ARRAY 1) (COND (DISP? {•GOTO RGT MIDBOX) (•PLOT (SETQ X-ARROW (ADD X (COND ((ZEROP N) RIGHT-X) ((MAX (ARG 1) RIGHT-X))))) (SETQ Y-ARROW (SUB Y (ADD PPSIZE DONT-TOUCH)))) (SETQ SLOPE (DIVIDE (SUB MIDBOX Y-ARROW) (SUB RGT X-ARROW) ) ) {•PLOT (SUB X-ARROW (TIMES (ADD 1. SLOPE) BARBSIZE)) (ADD Y-ARROW (TIMES (SUB 1 . (TIMES SLOPE 0.5)) BARBSIZE))) {•GOTO (SUB X-ARROW (TIMES (SUB 1. (TIHES SLOPE 0.5)) BARBSIZE)) (SUB Y-ARROW (TIMES (ADD 1. SLOPE) BARBSIZE) ) ) (•PLOT X-ARROW Y-ARROW) 114 (ADD X-ARROW DONT-TOUCH)) (X) ) ) ;CALCULATE THE "Y" POSITION OF AN EVAL BLOCK PLACED TO THE ; RIGHT (DEFUN RIGHTY () (COND (DISP? (SUB Y (ADD PPSIZE TXTHT DONT-TOUCH))) am ;CALCULATE POSITION OF EVAL BLOCK DOWNWARDS, AND DRAW AN ARROW (DEPUN DOWN () (INDEX : ARRAY 1) (COND (DISP? {•GOTO MID BOT) {•PLOT MID (SETQ Y-ARROW (MIN (SUB Y (ADD PPSIZE TXTHT DONT-TOUCH) ) (ADD TXTHT (SUB Y (ADD DOWN-Y EVAL-BLK-HT) ) )) ) ) {•PLOT (ADD MID BARBSIZE) (ADD Y-ARROW BARBSIZE)) {•GOTO (SUB MID BARBSIZE) (ADD Y-ARROW BARBSIZE)) (•PLOT MID Y-ARROW) (SUB Y-ARROW TXTHT) ) ;CALLED WHEN •EVAL IS ENTERED ;IF DISP? WAS JUST CHANGED TO NIL, MAKE THREE DOTS ;IF WE JUST STARTED DISPLAYING AFTER OMITTING SOME, UPDATE ALL ; DISPLAYED VALUES (DEFUN DISPEV-ENTER () (COND (OLD-DISP?) (T (DISP-ALL-VARS) (SETQ Y (DOWN)))) (COND (DISP? (COND ((LESSP Y BOTTOM-EVAL) (AGTCON JUMP (CAR (NTH LOCLIST (ADD1 (SUB NBLOCKS NROLL)))) 0 : TEMP D (AGTDSP JUMP-ROLL NIL FULLMODE 1 : TEMP) (ROLL-EVAL ROLL-DIST))) . (SETQ PPSIZE (TIMES LINE-SKIP (PPD FORM 115 (MAX X (SUB (COND { (ATOM FORM) FORM) ((CAR FORM))))))) Y (FIX (DIVIDE RMARGIN EVAL-PPLEV LINE-SKIP) ) LEN1 (INDEX :ARRAY}) (AGTDSP BUFLOC NIL FULLMODE 1 :STACK) (DSP-EVAL BUFLOC LEN1) (REALWAIT SHORT-WAIT) (INDEX : ARRAY 1) MID (SUB Y ITSY-BITSY)) (ADD X BOXW/2) (TIMES TXTHT/2 (PL EN (SUB X) TXTHT)) MID DWN) (ADD MID (ADD DWN (SUB MID (ADD DWN MID DWN) RGT DWN) RGT BOT) X BOT) X DWN) MID DWN) BARBSIZE) BARBSIZE) ) BARBSIZE) BARBSIZE) ) (•GOTO (*PLOT (•PLOT {•GOTO (•PLOT (•PLOT (•PLOT (*PLOT (•PLOT (*PLOT (•SYMBOL (ADD X EV-HT) (ADD BOT EV-*) 'EVAL EV-HT) (SETQ LEN2 (INDEX :ARRAY)) (DSP-EVAL (ADD BUFLOC LEN1 -1) LEN2) (SETQ LOCLIST (CONS (ADD BUFLOC LEN2 LEN1 -2) LOCLIST))) {•GOTO X Y) {•PLOT X Y) {•GOTO (ADD X BOXW/2) Y) (•PLOT (ADD X BOXW/2) Y) (•GOTO (ADD X BOXW) Y) (•PLOT (ADD X BOXW) Y) (SETQ LEN1 (INDEX :ARRAY) PPSIZE 0 MIDBOX (SUB (SUB Y ARRL) BOXH/2)) (DSP-EVAL BUFLOC LEN1) (SETQ LOCLIST (CONS (ADD BUFLOC LEN 1 -1) LOCLIST) } )•) ) 116 ;CALLED WHEN EVAL EXITS ;BLANKS OUT EVAL BLOCK, MOVES OB DISPLAYS RETURN VALUE, AND ; BOLLS IF NECESSABY ;IF WE WEBE NOT PREVIOUSLY DISPLAYING, UPDATE ALL VABIABLES (DEFUN DISPEV-EXIT {) (AGTDSP BUFLOC NIL FULLMODE 1 :STACK) (AND STAB-DONE LAST-STAR (AGTDSP LAST-STAB NIL FULLMODE 1 ;NORMAL) (SETQ LAST-STAB NIL)) (COND (8ETUBNS? (PBOG (L) (COND ( (EQ BETUBN-VALUE LAST—BETVAL) (MOVE-VAL X Y) (SETQ 1AST-RETVAL-X X LAST-RETVAL-Y Y) ) (T (WIPE-VAL) (AGTCON INT 0 BRIGHT :ARRAY D (AGTCON SKIPZ 0 0 : ARRAY) (AGTCON INCR 0 0 : ARRAY) (AGTCON DX 0 0 : ARRAY) (AGTCON SKIPZ 0 0 : ARRAY) (AGTCON INCR 0 0 :ARRAY) (AGTCON DY 0 (TIMES DY-EVAL DY-DX-SCALE) :ARRAY) (AGTCVT 0 0 NIL NIL ; ARRAY) (PPD RETURN-VALUE (SETQ LAST-RETVAL-X X) (SETQ LAST-RETVAL-Y 117 flIOBOX) VALOE-LENGTH VAR-PPLEV 0) (SETQ L (SOB1 (INDEX : ARRAY)) LAST-RETVAL RETURN-VALUE) (AND (LESSP L AGT-V ALOE-LENGTH) (AGTCON JUMPR (SOB AGT-VALOE-LENGTH L) 0 : ARRAY) ) (AGTDSP (ADD1 FWA-RETVAL) NIL FULLMODE (SUB1 (MIN (ADD 1 L) AGT-VALUE-LENGTH)) :ARRAY 2) (AGTDSP FWA-RETVAL NIL FULLMODE .1 ;ARRAY) (OR DISP? (DISP-ALL-VARS))))))) (COND ((AND (GREATERP DY-EVAL DONT-TOUCH) (GREATERP Y (ADD BOTTOM-EVAL ROLL-DIST))) (ROLL-EVAL (MINUS (MIN DY-EVAL ROLL-DIST))) (AGTCON JUMP (CAR (COND ((EQ DY-EVAL 0.) (LAST LOCLIST)) ( (NTH LOCLIST (MIN (LENGTH LOCLIST) (ADD1 NBLOCKS)))))) 0 :ARRAY 1) (AGTDSP JUMP-ROLL NIL FULLMODE 1 ;ARRAY)))) ;MOVE THE RETURN VALUE TO X Y. (DEFUN MOVE-VAL (X Y) (PROG (SECS NFRAMES DIST) (SETQ DIST (MAX (ABS (SUB X LAST-RETVAL-X) ) (ABS (SUB Y LAST-RETVAL-Y) ) ) SECS (DIVIDE DIST MOVE-RATE) NFRAMES (FIX (TIMES SECS FRAMES/SEC))) (COND ( (NEQ NFRAMES 0) (AGTCON SKIPZ NFRAMES 0 :TEMP 1) (AGTCON INCR 0 (TIMES DY-DX-SCALE (DIVIDE (SUB X LAST-RETVAL NFRAMES) ) :TEMP) (AGTDSP (ADD 1 FWA-RETVAL) NIL FULLMODE 2 :TEMP) (AGTCON INCB 0 (TIMES DY-DX-SCALE (DIVIDE (SUB Y LAST-BETVAL NFRAMES)) :TEMP 2) (AGTDSP (ADD U FWA-RETVAL) NIL FULLMODE 2 :TEMP) (REALWAIT SECS) ) ) ) ) ;DISPLAY A LIST OF EVLIS VALUES (DEFUN DISP-EVLIS (VAL) (PROG (L) (COND {{EQ VAL LAST-BETVAL) (MOVE-VAL X EVLIS-Y))) (INDEX : ABBAY 1) (PPD VAL X EVLIS-Y EVLIS-PPLEN VAB-PPLEV 0) (SETQ EV-BIGHT (SUB "+X+" X) L {INDEX :ABBAY) EVLIS-Y (SUB EVLIS-Y LINE-SKIP)) (JUMP EVAL-BETURN) (AGTDSP (ADD1 (CAR EV-LOC)) NIL FULLMODE (SUB1 L) ;ARRAY 2) (WIPE-VAL) (AGTDSP (CAR EV-LOC) NIL FULLMODE 1 :ARRAY) (SETQ EV-LOC (CONS (ADD (CAR EV-LOC) L -1) (CDR EV-LOC)}) ) VAL) ;DISPLAY N OR FLAMBDA EVLIS (DEFUN DISP-NF (VAL) (AND DISP? EVLIS? EVLIS-MOVE? (PROG (EVLIS-Y) (SETQ EVLIS-Y {SUB Y (ADD LINE-SKIP EVAL-BLK-HT)) 119 EV-LOC LOCLIST) (DISP-EVLIS VAL) (REALWAIT SHORT-WAIT) ) } VAL) ;TAKE CARE OE SPECIAL FORMS INTERSPERSED WITH FUNCTION ; DEFINITIONS ; (# (ENTRY-FORM) (FORM) (EXIT-FORM)) ; THIS IS A USER INSERTION. ENTRY-FORM IS EVALED (BY ; MTS LISP, NOT ; BY THE ANIMATION LISP) BEFORE FORM IS EVALED FOR ; ANIMATION. ; EXIT-FORM IS EVALED UPON EXIT. ; BOTH FORMS ARE INVISIBLE TO THE ANIMATION.. ; (* ADDR (FORM)) ; ADDR IS ADAGE LOCATION TO BE FILLED WITH AN ; INTENSIFY INSTRUCTION (DEFUN DO-SPECIALS () (COND ((AND (ATOM (CAR FORM)) (EQNAME (CAR FORM) USER-FORM)) (SETQ #TIMES (COND ((EQ (CAR FORM) USER-FORM) (RPLACA FORM (COPY USER-FORM) ) (SET (CAR FORM) (ADD1 EVAL-COUNTER)) 1) ( (LESSP (CAAR FORM) EVAL-COUNTER) (SET (CAR FORM) (ADD1 EVAL-COUNTER)) D (T (SET (CAR FORM) (ADD 1 (CAAR FORM) ) ) (SUB (CAAR FORM) EVAL-COUNTER)))) (PROG (RET) (SETQ RET (EVAL (CADR FORM))) (OR (CDDR FORM) {RETURN RET «*EVAL))) (SETQ EXIT-FORM (CADDDR FORM) FORM (CADDR FORM) ) (DO-SPECIALS)) ({EQ (CAR FORM) STAR-FORM) (DO-STAR (CADR FORM) ) (SETQ FORM (CADDR FORM)) (DO-SPECIALS) ) )) (DEFUN DO-STAR (ADDR) (AND LAST-STAR (AGTDSP LAST-STAR NIL FULLMODE 1 :NORMAL) ) (COND ((AND DISP? ADDR) (AGTDSP (SETQ STAR-DONE T LAST-STAR (ADD FWA-STAR ADDR)) NIL FULLMODE 120 1 :BRIGHT)) (T (SETQ LAST-STAR NIL) ) ) ) ;PROCESS EXCLUDED ATOMS AND FUNCTIONS (DEFUN DO-EXCLUDES () (COND ({AND (ATOM FORM) (MEMQ FORM EXCLUDE-ATOMS)) (RETURN (*VALUE FORM A '(ERRMSG UNDEFINED ATOM: (FORM))) '*EVAL)) {{AND {ATOM (CAR FORM)) (MEMQ (CAR FORM) EXCLUDE-FNS)) (SETQ DISP? NIL OLD-DISP? NIL)))) ;THIS ALLOWS FUNCTIONS WITH BREAKPOINTS TO BE EVALED BY MTS ; LISP FOR TESTING (DEFUN # FEXPR (L) (OR (CDR L) (PRINT '"WARNING-BREAKPOINT WITH ENTRY-FORM ONLY")) (EVAL {CADR L) ) ) ;THIS IS USED TO DISPLAY THINGS IN THE EXIT FORM (DEFUN #EXIT-DISP FEXPR (L) (INDEX :ARRAY 1) (EVLIS (CDR L) ) (DSP-EVAL BUFLOC (INDEX :ARRAY)) (REALWAIT (EVAL (CAR L))) ) ;MOVE FOLLOWER TO X, Y ;DISPLAY AT X, Y IF NOT ON ALREADY ;IT DOES NOT APPEAR UNTIL IT STARTS TO MOVE (DEFUN FOLLOW (X Y) (AND DISP? FOLLOW? (COND (FOLLOW-X (PROG (SECS NFRAMES DIST) (SETQ DIST (MAX (ABS (SUB X FOLLOW-X) ) (ABS (SUB Y FOLLOW-Y))) SECS (DIVIDE DIST FOLLOW-RATE) NFRAMES (FIX (TIMES SECS FRAMES/SEC))) (COND ( (NEQ NFRAMES 0) (AGTCON SKIPZ NFRAMES 0 121 X FOLLOW-X) NFRAMES)) Y FOLLOW-Y) NFRAMES)) : TEMP D (AGTCON INCR 0 (TIMES DY-DX-SCALE (DIVIDE (SOB : TEMP) (AGTDSP (ADD 1 FWA-FOLLOW) NIL FULLMODE 2 :TEMP) (AGTCON INCR 0 (TIMES DY-DX-SCALE (DIVIDE (SUB : TEMP 2) (AGTDSP (ADD 4 FWA-FOLLOW) NIL FULLMODE 2 ; TEMP) (AGTDSP FWA-FOLLOW NIL FULLMODE 1 :BRIGHT) (REALWAIT SECS) ) ).) ) (AGTCON DY 0 (TIMES Y DY-DX-SCALE) :TEMP D (AGTDSP (ADD FWA-FOLLOW 6) NIL FULLMODE 1 : TEMP) (AGTCON DX 0 (TIMES X DY-DX-SCALE) :TEMP 1) (AGTDSP (ADD FWA-FOLLOW 3) NIL FULLMODE 1 :TEMP) ) ) (SETQ FOLLOW-X X FOLLOW-Y Y)) ) ;TUSN OFF FOLLOWER (DEFUN FOLLOW-OFF () (AND FOLLOW? FOLLOW-X (AGTDSP FWA-FOLLOW NIL FULLMODE 1 :FOLLOW) (SETQ FOLLOW-X NIL))) .************** ; SHOW - ************** ; (#SHOW S <X < Y » ) DISPLAY CONS CELLS OF S (DEFUN tSHOW FEXPR (F) (PROG (X Y) (SETQ X (OR (EVAL (CADR F) ) NEG-SCREEN-LIMIT) Y (OR (EVAL (CADDR F) ) (SUB SCREEN-LIMIT ATMHT))) (INDEX :ARRAY 1) (SHW1 (EVAL (CAR F) ) X Y) (DISPL) ) ) ; (#SHOWFN FN <X <Y») SHOW FUNCTION FN (DEFUN tSHOWFN FEXPR (L) (INDEX : ARRAY 1) (•INTENSITY BRIGHT) (AGTCVT 0 0 NIL NIL :ARRAY) (PROG (X Y) (SETQ X (OR (EVAL (CADR L)) NEG-SCREEN-LIMIT) Y (OR (EVAL (CADDR L) ) (SUB SCREEN-LIMIT TXTHT*2)}) (•SYMBOL X Y (MKATOM (FNAME (CAR L) ) •:) TXTHT) (•INTENSITY NORMAL) (SHW1 (GET (CAR L) • EXPR) X (SUB Y TXTHT^2)) (DISPL) ) ) (DEFUN SHW1 (F X Y) (PROG (FROMLIST-CAR TOLIST-CAR FROMLIST-CDR TOLIST-CDR DONELIST CAR-COUNT) (SETQ CAR-COUNT 0) (AND LOOPS? (LISTP F) (SCAN-LOOPS F)) (SHW F X Y) (DRAW-LOOPS FROMLIST-CAR TOLIST-CAR LOOPDEC) (DRAW-LOOPS FROMLIST-CDR TOLIST-CDR (ADD LOOPDEC SOMESPACE)))) ;LOOK FOR LOOPS IN SHOW DISPLAY (DEFUN SCAN-LOOPS (F) (AND (ATOM (CAR F) ) (EQNAME (CAR F) USER-FORM) (SETQ F (CADDR F) ) ) (SETQ DONELIST (CONS F DONELIST)) (COND ( (ATOM (CAR F) ) ) { (MEMQ (CAR F) DONELIST) (SETQ FROMLIST-CAR (CONS F FROMLIST—CAR)) (SETQ TOLIST-CAR (CONS (LIST (CAR F) ) TOLIST-CAR))) (T (SCAN-LOOPS (CAR F) ) ) ) (COND { (ATOM (CDR F) ) ) ( (MEMQ (CDR F) DONELIST) (SETQ FROMLIST—CDR (CONS F FROMLIST—CDR)) (SETQ TOLIST-CDR (CONS (LIST (CDR F) ) TOLIST-CDR)}) (T (SCAN-LOOPS (CDR F) )))•)• ;SAVE THE "TO" COORDINATES IN TOLIST (DEFUN DO-TOLIST (ENT) (AND (EQ F (CAR ENT) ) (RPLACD ENT (LIST X (ADD Y CONSIZE/2))))) ; DRAW ANY LOOPS IN THE SHOW DISPLAY (DEFUN DRAW-LOOPS (FROM TO LOOPDEC) (COND ((NULL FROM)) (T (PROG (A Y Y2 X2) (SETQ X (CADAR FROM) Y (*GOTO X Y) (•PLOT X (SETQ Y2 (ADD (SETQ X (CADAR TO)) (COND {CADDAR FROM) ) Y LOOPDEC) ) ) ((LESSP (CADDAR TO) Y) (SETQ X2 (SUB X CONSIZE) Y (ADD (CADDAR TO) CONSIZE/2) ) ) { (SETQ X2 (SUB X (SUB CONSIZE SOMESPACE) ) Y (SUB (CADDAR TO) CONSIZE/2) ) ) ) {•PLOT X2 Y2) (•PLOT X2 Y) {•PLOT {•PLOT (•GOTO X Y) (SUB (SUB (SUB (ADD (•PLOT X Y) (DRAW-LOOPS X SHOW-BARBSIZE) Y SHOW-BARBSIZE) ) X SHOW-BARBSIZE) Y SHOW-BARBSIZE) ) (CDR FROM) (CDR TO) LOOPDEC))))) 124 ;THIS DOES THE WORK RECURSIVELY. IT RETURNS (X Y) , THE ; DIMENSIONS OF THE DISPLAY CREATED (DEFUN SHW (F X Y) (COND ( (AND (ATOM (CAAR F) ) (EQNAME (CAAR F) USER-FORM)) (COND ( (CDDAR F) (SETQ F (CONS (CADDAR F) (CDR F) )) ) {(SETQ F (CDR F)))))) (COND ((AND (NULL F) (NOT SHOWNIL?) ) • (0. 0.),) ((OR (MAPC VDO-TOLIST TOLIST-CAR) (MAPC 'DO-TOLIST TOLIST-CDR))) ((OR (GREATERP (ADD X MINCONSWIDTH) X^-LIMIT) (LESSP (ADD Y YDEC) Y-LIMIT) ) (OFFSCREEN) ) ( (ATOM F) (DISPATM (COND ((MINUSP CAR-COUNT) (FNAME F) ) (F)) * ) ) {T {PROG (SIZEA SIZED XD TEMP 1 TEMP2) (SETQ CAR-COUNT (SUB1 CAR-COUNT) SIZEA (COND ({CAR F) (COND ({SETQ TEMPI (MEMQ F FROMLIST-CAR)) (RPLACA TEMPI (LIST (CAR TEMPI) (ADD X CONSIZE/2) Y)) 1(0- 0.)) (T (SHH (CAR F) X (ADD Y YDEC))))) (T (DISPATM (CAR F) (ADD Y YDEC) ) ) ) ) (COND (TEMP 1 (CONSBOX) ) ( (DISPCONS) ) ) (SETQ XD (COND ( (LISTP (CDR F) ) {ADD X (CAR SIZEA) ) ) {(ADD X MINCONSWIDTH)) ) ) (SETQ CAR-COUNT 1 SIZED (COND ( (AND (CDR F) (SETQ TEMP2 (MEMQ F FROMLIST-CDR))) (RPLACA TEMP2 (LIST (CAR TEMP2) (ADD CONSIZE CONSIZE/2 125 . X) Y) ) ' (0. 0.)) (T (SHW (CDR F) XD Y)))) (OR TEMP2 (RABROW (COND ( (EQ (CAR SIZED) 0) (ADD X MINCONSWIDTH)) (XD)))) (LIST (MAX (CAR SIZEA) (SUB (ADD XD (CAR SIZED) ) X)) (MAX (ADD YDEC (CADR SIZEA) ) (CADR SIZED))))))) ;DISPLAY AN ATOM (DEFUN DISPATM (F Y) (COND (DETAILATOM? (CONSBOX) (•SYMBOL (ADD X CONSIZE*2 SOMESPACE) Y F ATMHT) (COND ( (EQ F (CAR F)) (•GOTO DWNt Y) (•PLOT DWN# (SUB Y CONSIZE) ) (COND ( (EQ F (CDR F) ) (•GOTO (ADD DWNt CONSIZE) Y) (•PLOT (ADD DWNt CONSIZE) (SUB Y CONSIZE)) (•PLOT DWN# (SUB Y CONSIZE) ) (•PLOT (ADD DWNt SHOW-BARBSIZE) (ADD (SUB Y CONSIZE) SHOW-BARBSIZE) ) (•GOTO (ADD DWNt SHOW-BARBSIZE) (SUB (SUB Y CONSIZE) SHOW-BARBSIZE)) (•PLOT DWNt (SUB Y CONSIZE)))) (•PLOT (SUB DWNt CONSIZE) (SUB Y CONSIZE) ) (•PLOT (SUB DWNt CON SIZE) *) (•PLOT X Y) {•PLOT (SOB X SHOW-•BARBSIZE) (SUB Y SHOW-•BARBSIZE) ) (•GOTO (SUB X SHOW-•BARBSIZE) (ADD Y SHOW-BARBSIZE) ) (*PLOT X Y))) (LIST (ADD CONSIZE*2 (TIMES (PLEN F) ATMHT) ) ATMHT) ) (T (•SYMBOL (ADD X SOMESPACE) Y F ATMHT) (LIST (MAX MINCONSWIDTH (TIMES ATMHT (PLEN F) ) ) ATMHT)))) ;DISPLAY A CONS CELL (DEFUN DISPCONS () (CONSBOX) (*GOTO DHN# Y) (•PLOT D»N# BOTt) (•PLOT (SUB D»N# SHOW-BARBSIZE) (ADD BOT# SHOW-BARBSIZE)) (•GOTO (ADD DWN# SHOW-BARBSIZE) (ADD BOTt SHOW-BARBSIZE) ) (•PLOT DWNt BOTt)) (DEFUN CONSBOX () (SETQ TOPt (ADD Y CONSIZE) MIDt (ADD X CONSIZE) RIGHTt (ADD X CONSIZE^2) DSN# (ADD X CONSIZE/2) BOTt (ADD Y YDEC CONSIZE) ) (•GOTO X Y) (•PLOT X TOPt) (•PLOT RIGHTt TOPt) {•PLOT RIGHTt Y) (•PLOT X Y) (•GOTO MID# TOPt) (•PLOT MID# Y) ) ;DRAW AN ARROW TO RIGHT AND SLASH CONS BOXES IF CDR=NIL (DEFUN RARROW (RIGHT) (COND ({OR SHOWNIL? (CDR F) ) (SETQ MID (ADD Y CONSIZE/2)) (•GOTO (ADD X CONSIZE^2) MID) {•PLOT RIGHT MID) (•PLOT (SUB RIGHT SHOW-BARBSIZE) (ADD MID SHOW-BARBSIZE) ) (•GOTO (SUB RIGHT SHOW-BARBSIZE) (SOB MID SHOW-BARBSIZE) ) (*PLOT RIGHT HID) ) (T (*GOTO (ADD X CONSIZE) Y) (*PLOT (ADD X CONSIZE*2) (ADD Y CONSIZE))))) ;IF SIZEA=NIL WE RAN OFF BOTTOM (CAR) OTHERWISE OFF RIGHT (DEFUN OFFSCREEN () (COND (CONTINOE? (PPD F X Y (FIX (DIVIDE (SOB SCREEN-LIMIT X) ATMHT)) 5 LINE-SKIP) } ) «(0. 0.1) - *********************** ; PRETIYPRINTER .*********************** ; PPD RETURNS THE # OF LINES DISPLAYED ;IF LINE-SKIP IS 0, ONLY ONE LINE WILL BE PRINTED (DEFUN PPD (FORM PX PY MAXWIDTH LEVEL LINE-SKIP) (PROG (*PLEN TEST-FLAG " + Y+" ,,+SIZE+»' Y-DEC SINGLE-FLAG) (SETQ *PLEN 0 "+X+" PX "+Y+" PY) (SETQ Y-DEC LINE-SKIP "+SIZE+" (TIMES TXTHT 0.857}) (*PPFORM1 FORM LEVEL) (*TERPRI*) (ABS (DIVIDE (SUB "+Y+" PY) (COND ({EQ Y-DEC 0) 1) (Y-DEC)))))) (DEFUN *PPF0RM1 (FORM LEV) (SETQ LEV (SUB1 LEV) ) (COND { (ATOM FORM) (WR FORM)) ( (LESSP LEV 1) (WR •&) ) ((AND SHORTQUOTE (EQ (CAR FORM) 'QUOTE)} (WR '»*") (*PPF0RM1 (CADR FORM) LEV)) ( (AND (ATOM (CAR FORM) ) (EQNAME (CAR FORM) USER-FORM) ) (AND (CDDR FORM) (*PPFORM 1 (CADDR FORM) LEV))) ((EQ (CAR FORM) STAR-FOfiM) (SET-STAR FORM * (*PPF0RH1 (CADDR FORM) LEV))) ( (AND (OR (LESSP LEV 2) (NOT (HEHQ (CAR FORK) 1 (COND DEFUN)))) (*PPFIT FORM))) ({*PPSPECIAL FORM)) ({PROG (CARFORM TAB) (SETQ CARFORM (UNCONS FORM FORM)) (WR "(»») (COND ( (ATOM CARFORM) (WB (FNAME CABFOEM)) (•SKIP* 1) (SETQ TAB (ADD1 *PLEN)) (COND ((LISTP FOBM) (*PPF0BM1 (ONCONS FOBM FOBM) LEV) ) (FOBM (WB ".") (*SKIP* 1) (WB FOBM) (SETQ FOBM NIL)) (T (*SKIP* -1)))) (T (SETQ TAB (PLUS 2 *PLEN) ) (*PPFOBM1 CABFOBM LEV))) (MAPC ' (LAMBDA (CABFOEM) (*TEBPBI*) (•TAB* TAB) (*PPF0RM1 CABFOBM LEV) ) FOBM) (AND (CDE (LAST FOBM) ) (*SKIP* 1) (WE ".") (*SKIP* 1) (WB (CDE (LAST. FOBM) ) ) ) (MB »)»))))) (DEFUN *PPFIT (FOBM) (COND ( (GEEATEBP MAXWIBTB (PLUS *PLEN (TESTLEN FOBM PX PY 0 T))) (•PRIN1* FOBM LEV) T))) (DEFUN *PPSPECIAL (FOBM) (COND ({AND (ATOM (CAB FOEM) ) (NOT (NUMBEBP (CAR FOEM)))) (APPLY 1 (GET (CAB FORM) '*PPSPECIAL * (RETURN NIL •*PPSPECIAL)) FORM) T))) {DEFUN *PPPBOG (FOBM) (WE » (") (WE (UNCONS FOBM FOBM) ) (•SKIP* 1) (PEOG (TAB VABS) (SETQ TAB (ADD 1 *PLEN)) (COND ({*PPFIT (CAB FOBM))) (T (SETQ VABS (CAR FORM)) (WE " (") (*PRIN1* (CAB VABS) LEV) (MAPC • (LAMBDA (CAEFORM) (•SKIP* 1) (COND ( (*PPFIT CABFOBM) ) (T (*TERPBI*) (*TAB* TAB) (*PBIN1* CABFOBM LEV) ) ) ) (CDB VABS)) (WE «)«))) (MAPC '(LAMBDA (FOBM) (*TEBPRI*) (•TAB^ TAB) (COND ((ATOM FOBM) (•SKIP+ -2) (WB FOBM)) ((•PPFOEM1 FORM LEV)))) (CDB FOBM) ) (WB ")"))) (DEFUN •PPSETQ (FOBM) (WB "(") (WB (CAB FOBM) ) (•SKIP^ 1) (PBOG (TAB SW) (SETQ TAB (ADD1 •PLEN) SW T FOBM (CDB FOEM)) (BEPEAT • (PBOGN (OB SW (•TEBPBI^) (•TAB^ TAB)) (•PPFOBM1 (CAE FOBM) LEV) (•SKIP^ 1) (•PPFOBM1 (CADE FOBM) LEV) (SETQ FOBM (CDDR FOBM) SW NIL)) (SHIFT (LENGTH FOEM) -1))) (WB ") ») ) (DEFUN •PPDEFUN (FOBM) (WB " (") (WE (UNCONS FOBM FOEM) ) (•SKIP^ 1) (WB (FNAME (UNCONS FOBM FOBM))) (•SKIP^ 1) (COND ( (MEMQ (CAB FOBM) > (EXPB FEXPE NEXPB)) (WB (UNCONS FOBM FOBM)) {•SKIP^ 1))) (PBOG (VABS) (SETQ VABS (UNCONS FOBM FOBM)) (COND (VABS (•PPFOEM1 VAES LEV) ) {(WE {)»)))) (MAPC • (LAMBDA (CAEFOBM) (•TEEPEI^) {•TAB* 3) (•PPFOBM1 CABFOBM LEV)) FOBM) (WB ") ") ) (DEFPEOP DEFUN •PPSPECIAL *PPDEFUN) (DEFPROP PROG *PPSPECIAL •PPPROG) (DEFPROP (SETQ SET) •PPSPECIAL •PPSETQ) (DEFUN *TAB* (N) (OR SINGLE-FLAG (SETQ "+X + " (ADD PX (TIMES (SOB1 N) "+SIZE+")) •PLEN (MAX (SUB1 N) *PLEN) ) ) ) (DEFUN *TERPRI^ () (COND ({EQ 0 LINE-SKIP) (SETQ SINGLE-FLAG T)) (T (SETQ •PLEN 0 "+X+" PX "+¥+" (SUB "+Y + " Y-DEC)))) NIL) (DEFUN *SKIP^ (N) (AND (GREATERP N 0) (SETQ BLANK "+X+") ) (SETQ "+X+" (ADD "+X+" (TIMES N "+SIZE+")) •PLEN (ADD •PLEN N))) (DEFUN TESTLEN (F +X+ +Y+ •PLEN TEST-FLAG) (•PRIN1^ F LEV) •PLEN) (DEFUN *PRIH1* (F LEV) (COND ((ATOM F) (WR F) ) ((AND (ATOM (CAR F) ) (EQNAME (CAR F) USER-FORM)) (AND (CDDR F) (*PRIN1* (CADDR F) LEV) ) ) {(EQ (CAR F) STAR-FORM) (SET-STAR F ' (*PRIN1* (CADDR F) LEV))) ((AND SHORTQUOTE (EQ (CAR F) 'QUOTE)) (WR "««) (•PRIN1+ (CADR F) (SUB 1 LEV))) ( (LESSP LEV 1) (WR '&) ) ( (AND (ATOM (CAR F) ) (GET (CAR F) 'ALIAS)) (WR " («) (WR (FNAME (CAR F) ) ) (AND (CDR F) (•SKIP^ 1) {•PRIN2 (CDR F)) ) (WR ") ") ) (T (WR "(") (*PRIN2 F) (WR ")") ) ) ) (DEFUN •PRIN2 (F) (COND ({NULL F) ) ((NULL (CDR F) ) (•PRINI* {CAR F) (SUB1 LEV))) ( (ATOM (CDR F)) {•PAIN1* (CAR F) (SUB 1 LEV)) (•SKIP+ 1) 131 (MS ".») (•SKIP* 1) (*PRIN1* (CDS F) (SUB1 LEV))) (T (*PRIN1* (CAR F) (SUB1 LEV)) (*SKIP* 1) (*PRIN2 (CDR F) ) ) ) ) ;WRITE AN ATOM ON THE SCREEN (DEFUN WR (F) (COND ( (NOT TEST-FLAG) (AND SINGLE-FLAG (SETQ F •" ..."}) (AND (NUMBERP F) (SETQ F (MKATOM F) ) ) (AGTEXT "+X + " "+Y + " "+SIZE+" F : ARRAY) (AND SINGLE-FLAG (RETURN 1 *PPD)))) (SETQ *PLEN (ADD *PLEN (PLEN F) ) " + X + " (ADD "+X + M (TIMES "+SIZE+" (PLEN F) ) ) ) ) ;PLACE ADAGE ADDR IN STAR-FORM AND INSERT INTENSIFY INSTRUCTION (DEFUN SET-STAR (FRM EXP) (COND {{AND (NOT TEST-FLAG) STAR-FLAG) (SETQ LAST-INTS T) (RPLACA (CDR FRM) (SUB 1 (INDEX : ARRAY) ) ) (•INTENSITY NORMAL) (EVAL EXP) (COND (LAST-INTS (*INTENSITY NORMAL) (SETQ LAST-INTS NIL)})) (T (EVAL EXP)))) .********************* ; GRAPHICS PRIMITIVES .********************* (DEFUN #DISP FEXPR (L) (INDEX : ARRAY 1) (EVLIS L) (DISPL) ) (DEFUN *PLOT (X Y) (AGTCVT X Y T NIL : ARRAY) ) (DEFUN *JUMP NEXPR (LABEL) {PROG (L) (SETQ L (COND ( (ASSQ LABEL LABELS)) (T (SETQ LABELS (CONS (LIST LABEL NIL) LABELS) ) (CAR LABELS)))) (NCONC L (LIST (CONS JUMPR (INDEX :ARRAY (ADD1 (INDEX :ARRAY)))))})) i 132 (DEFUN JUMP (N) (AGTCON JUMP N 0 : ARRAY)) (DEFUN *GOTO (X Y) (AGTCVT X Y NIL NIL :ARRAY)) (DEFUN *SKIPNZ (COUNT) (AGTCON SKIPNZ COUNT 0 :ARRAY)) (DEFUN *SKIPZ (COUNT) (AGTCON SKIPZ COUNT 0 :ABBAY)) (DEFUN *SYHBOL (X Y STBING SIZE) (AND (NUMBEBP STRING) (SETQ STBING (J3KATOH STBING))) (AGTEXT X Y SIZE STBING : ABB AY) ) (DEFUN *INTENSITY (V) (AGTCON INT 0 V :ARRAY)) (DEFUN *DASH () (AGTCON DASH 0 0 : ARBAY) ) (DEFUN *UNDASH () (AGTCON UNDASH 0 0 : ABBAY)) (DEFUN FOB FEXPR (L) (GPROG (*SKIPNZ (FIX (TIMES FRAMES/SEC (EVAL (CAR 1) } ) ) ) (*JUMP OUT) (EVLIS (CDR L)) OUT) ) ;THIS ACCEPTS A GLISP SUBROUTINE AND DISPLAYS IT IMMEDIATELY (DEFUN SUBROUTINE FEXPR (L) (INDEX :ARBAY 1) (AGTCON SCALE 0 GLISP-SCALE :ARRAY) (SETQ SUBROUTINE? T) (EVLIS (CDR L) ) (SETQ SUBROUTINE? NIL) (AGTCON SCALE 0 *SCALE : ABBAY) (DISPL) ) ;THIS IS SIMILAB TO GLISP ADJ EXCEPT THAT DIALS ABE NOT ALLOWED (DEFUN ADJ FEXPB (L) (OB FADE? (AGTCON INT 0 (TIMES (EVAL (CADDAR L) ) 0.1) : ARRAY) ) (AGTCON DX 0 (TIMES (EVAL (CAAR L)) 0.1) :ARRAY) (AGTCON DY 0 (TIMES (EVAL (CADAR L)) 0.1) :ARRAY) (AGTCON SCALE 0 (TIMES (EVAL (CAR (CDDDAR L))) 0.1) : ARRAY) (EVLIS (CDR L)) (OR FADE? (AGTCON INT 0 NORMAL :ARRAY)) (AGTCON DX 0 0 : ARRAY) (AGTCON DY 0 0 : ARRAY) (AGTCON SCALE 0 (COND (SUBROUTINE? GLISP-SCALE) (•SCALE) ) :ARRAY) ) ;DRAM THE VECTORS GENERATED BY PRIMITIVES ONE AT A TIME (DEFUN #DRAW FEXPR (L) (AGTCON SCALE 0 GLISP-SCALE :ARRAY 1) (EVLIS (CDR L) ) (AGTCON SCALE 0 *SCALE :ARRAY) (AGTCVT 0 0 NIL T :ARRAY) (PROG (Z N LIM) (SETQ Z 1 LIM (INDEX :ARRAY) N (FIX (EVAL (CAR L) ) ) ) (COND ( (GREATERP N 0) (PROG NIL LOOP (AGTDSP FREE NIL FULLMODE 1 :ARRAY Z) (RTHAIT N) (SETQ FREE (ADD1 FREE) Z (ADD 1 Z)) (AND (LESSP Z LIM) (GO LOOP)))) (T (PROG NIL (SETQ N (MAX 1 (ABS N) ) ) LOOP (AGTDSP FREE NIL FULLMODE N :ARRAY Z) (SETQ FREE (ADD N FREE) Z (ADD N Z) ) (AND (LESSP Z LIM) (GO LOOP))))))) (DEFUN GPROG FEXPR (GPROG) 134 (PROG (LABELS) (HAPC •(LAMBDA (GPROG) (COND { (ATOM GPROG) (LABL GPROG)) ( (EVAL GPROG) ) ) ) GPROG) i (RESOLVELABELS) ) ) {DEFUN RESOLVELABELS () (PROG (LOC SAVEINDEX REFS) (SETQ SAVEINDEX (INDEX :ARRAY)) (MAPC » (LAMBDA (L) (COND ((SETQ LOC (CADR L) ) (MAPC • (LAMBDA (REF) (AGTCON (CAR REF) (SOB LOC (CDR REF) ) 0 :ARRAY (CDR REF) ) ) (CDDR L) ) ) (T (ERRMSSG "UNKNOWN LABEL" ((CAR L))) (RETURN NIL}))) LABELS) (INDEX :ARRAY SAVEINDEX)) ) (DEFUN LABL (LABEL) (PROG (L) (SETQ L (COND ( (ASSQ LABEL LABELS)) (T {SETQ LABELS (CONS (LIST LABEL NIL) LABELS)) (CAR LABELS)})) (AND (CADR L) (PROGN (ERRMSSG (LABEL) "IS MULTIPLY DEFINED") {RETURN NIL) )•) (RPLACA (CDR L) (INDEX :ARRAY) ) ) ) (SETQ LABELS NIL) ; (FADE HOLDTIME FADETIME DISPLAY-CODE) (DEFUN FADE FEXPR (L) (SETQ FADEFRAMES (FIX (TIMES FRAMES/SEC (EVAL (CADR L)))) HOLDFRAMES (FIX (TIMES FRAMES/SEC (EVAL (CAR L) ) ) ) ) (GPROG (*SKIPNZ (ADD FADEFRAMES HOLDFRAMES)) (*JUMP OUT) (*SKIPNZ HOLDFRAMES) (AGTCON INCH 0 (MINUS (DIVIDE NORMAL FADEFRAMES) ) : ARRAY) (•INTENSITY NORMAL) (SETQ FADE? T) (EVLIS (CDDR L)) (SETQ FADE? NIL) (•INTENSITY NORMAL) OUT) ) (DEFUN ERRMSG FEXPR #L# (TERPRI) (PRIN1 '•••ERROR:) (MESSAGE) (TERPRI) (AND EVALING? (PRIN1 'FORM:) (PRIN1 FORM) (TERPRI))) (DEFUN MSSG (TERPRI) (MESSAGE) (TERPRI) ) FEXPR #L# (DEFUN MESSAGE () (MAPC « (LAMBDA (#X#) (ARG 1))) (COND ((EQ #X# ':) (TERPRI) (TAB 5)) ((ATOM #X#) (PRIN 1 #X#) ) ( (MAPC • (LAMBDA (#X#) (PRIN1 (EVAL #X#))) #X#)))) (AND ATAGT? (#START)) 136 PRINT OFF SCONTINUE WITH LISP:LISPSTART RETURN PRINT ON *LISP MACROS WERE READ IN ABOVE BUT NOT PRINTED * * IFADG RETURN T IF AT THE ADAGE, NIL OTHERWISE IFADG CSECT BALR 8,0 USING *,8 STM 13,6,SAVE CALL GUINFO, (C74,RNAM) LM 13,6,SAVE LR PDS,D LR A,NILE L 9,RNAM GET THE DEVICE NAME C 9,ADAGE SEE IF DS27 BNE OUT RETURN NIL IF NOT L A,TRUEATOM RETURN T—DEFINED IN LISP MACROS OUT BR RET ADAGE DC C * DS27 * RNAM DS 6F ROOM FOR NAME AND USER COMMENT C1H DC F t 741 CODE FOR DEVICE NAME SAVE DS 10F REGISTER SAVE AREA END 

Cite

Citation Scheme:

        

Citations by CSL (citeproc-js)

Usage Statistics

Share

Embed

Customize your widget with the following options, then copy and paste the code below into the HTML of your page to embed this item in your website.
                        
                            <div id="ubcOpenCollectionsWidgetDisplay">
                            <script id="ubcOpenCollectionsWidget"
                            src="{[{embed.src}]}"
                            data-item="{[{embed.item}]}"
                            data-collection="{[{embed.collection}]}"
                            data-metadata="{[{embed.showMetadata}]}"
                            data-width="{[{embed.width}]}"
                            data-media="{[{embed.selectedMedia}]}"
                            async >
                            </script>
                            </div>
                        
                    
IIIF logo Our image viewer uses the IIIF 2.0 standard. To load this item in other compatible viewers, use this url:
https://iiif.library.ubc.ca/presentation/dsp.831.1-0051764/manifest

Comment

Related Items