|
|
1.1 root 1:
2:
3:
4:
5:
6:
7:
8: CHAPTER 12
9:
10:
11: Liszt - the lisp compiler
12:
13:
14:
15:
16:
17:
18: 12.1. General strategy of the compiler
19:
20: The purpose of the lisp compiler, Liszt, is to
21: create an object module which when brought into the
22: lisp system using _f_a_s_l will have the same effect as
23: bringing in the corresponding lisp coded source module
24: with _l_o_a_d with one important exception, functions will
25: be defined as sequences of machine language instruc-
26: tions, instead of lisp S-expressions. Liszt is not a
27: function compiler, it is a _f_i_l_e compiler. Such a file
28: can contain more than function definitions; it can
29: contain other lisp S-expressions which are evaluated
30: at load time. These other S-expressions will also be
31: stored in the object module produced by Liszt and will
32: be evaluated at fasl time.
33:
34: As is almost universally true of Lisp compilers,
35: the main pass of Liszt is written in Lisp. A subse-
36: quent pass is the assembler, for which we use the
37: standard UNIX assembler.
38:
39:
40:
41: 12.2. Running the compiler
42:
43: The compiler is normally run in this manner:
44: % liszt foo
45: will compile the file foo.l or foo (the preferred way
46: to indicate a lisp source file is to end the file name
47: with `.l'). The result of the compilation will be
48: placed in the file foo.o if no fatal errors were
49: detected. All messages which Liszt generates go to
50: the standard output. Normally each function name is
51: printed before it is compiled (the -q option
52: suppresses this).
53:
54:
55:
56: 12.3. Special forms
57:
58: Liszt makes one pass over the source file. It
59: processes each form in this way:
60: 9
61:
62: 9Liszt - the lisp compiler 12-1
63:
64:
65:
66:
67:
68:
69:
70: Liszt - the lisp compiler 12-2
71:
72:
73: 12.3.1. macro expansion
74:
75: If the form is a macro invocation (i.e it is a
76: list whose car is a symbol whose function binding
77: is a macro), then that macro invocation is
78: expanded. This is repeated until the top level
79: form is not a macro invocation. When Liszt begins,
80: there are already some macros defined, in fact some
81: functions (such as defun) are actually macros. The
82: user may define his own macros as well. For a
83: macro to be used it must be defined in the Lisp
84: system in which Liszt runs.
85:
86:
87:
88: 12.3.2. classification
89:
90: After all macro expansion is done, the form is
91: classified according to its _c_a_r (if the form is not
92: a list, then it is classified as an _o_t_h_e_r).
93:
94:
95:
96: 12.3.2.1. eval-when
97:
98: The form of eval-when is (_e_v_a_l-
99: _w_h_e_n (_t_i_m_e_1 _t_i_m_e_2 ...) _f_o_r_m_1 _f_o_r_m_2 ...) where
100: the time_i are one of _e_v_a_l, _c_o_m_p_i_l_e, or _l_o_a_d.
101: The compiler examines the form_i in sequence and
102: the action taken depends on what is in the time
103: list. If _c_o_m_p_i_l_e is in the list then the com-
104: piler will invoke _e_v_a_l on each form_i as it exam-
105: ines it. If _l_o_a_d is in the list then the com-
106: pile will recursively call itself to compile
107: each form_i as it examines it. Note that if _c_o_m_-
108: _p_i_l_e and _l_o_a_d are in the time list, then the
109: compiler will both evaluate and compile each
110: form. This is useful if you need a function to
111: be defined in the compiler at both compile time
112: (perhaps to aid macro expansion) and at run time
113: (after the file is _f_a_s_led in).
114:
115:
116:
117: 12.3.2.2. declare
118:
119: Declare is used to provide information
120: about functions and variables to the compiler.
121: It is (almost) equivalent to (_e_v_a_l-
122: _w_h_e_n (_c_o_m_p_i_l_e) ...). You may declare functions
123: to be one of three types: lambda (*expr),
124: nlambda (*fexpr), lexpr (*lexpr). The names in
125: parenthesis are the Maclisp names and are
126:
127:
128: Printed: August 5, 1983
129:
130:
131:
132:
133:
134:
135:
136: Liszt - the lisp compiler 12-3
137:
138:
139: accepted by the compiler as well (and not just
140: when the compiler is in Maclisp mode). Func-
141: tions are assumed to be lambdas until they are
142: declared otherwise or are defined differently.
143: The compiler treats calls to lambdas and lexprs
144: equivalently, so you needn't worry about declar-
145: ing lexprs either. It is important to declare
146: nlambdas or define them before calling them.
147: Another attribute you can declare for a function
148: is localf which makes the function `local'. A
149: local function's name is known only to the func-
150: tions defined within the file itself. The
151: advantage of a local function is that is can be
152: entered and exited very quickly and it can have
153: the same name as a function in another file and
154: there will be no name conflict.
155:
156: Variables may be declared special or unspe-
157: cial. When a special variable is lambda bound
158: (either in a lambda, prog or do expression), its
159: old value is stored away on a stack for the
160: duration of the lambda, prog or do expression.
161: This takes time and is often not necessary.
162: Therefore the default classification for vari-
163: ables is unspecial. Space for unspecial vari-
164: ables is dynamically allocated on a stack. An
165: unspecial variable can only be accessed from
166: within the function where it is created by its
167: presence in a lambda, prog or do expression
168: variable list. It is possible to declare that
169: all variables are special as will be shown
170: below.
171:
172: You may declare any number of things in
173: each declare statement. A sample declaration is
174: (_d_e_c_l_a_r_e
175: (_l_a_m_b_d_a _f_u_n_c_1 _f_u_n_c_2)
176: (*_f_e_x_p_r _f_u_n_c_3)
177: (*_l_e_x_p_r _f_u_n_c_4)
178: (_l_o_c_a_l_f _f_u_n_c_5)
179: (_s_p_e_c_i_a_l _v_a_r_1 _v_a_r_2 _v_a_r_3)
180: (_u_n_s_p_e_c_i_a_l _v_a_r_4))
181:
182: You may also declare all variables to be
183: special with (_d_e_c_l_a_r_e (_s_p_e_c_i_a_l_s _t)). You may
184: declare that macro definitions should be com-
185: piled as well as evaluated at compile time by
186: (_d_e_c_l_a_r_e (_m_a_c_r_o_s _t)). In fact, as was mentioned
187: above, declare is much like (_e_v_a_l-
188: _w_h_e_n (_c_o_m_p_i_l_e) ...). Thus if the compiler sees
189: (_d_e_c_l_a_r_e (_f_o_o _b_a_r)) and foo is defined, then it
190: will evaluate (_f_o_o _b_a_r). If foo is not defined
191: then an undefined declare attribute warning will
192:
193:
194: Printed: August 5, 1983
195:
196:
197:
198:
199:
200:
201:
202: Liszt - the lisp compiler 12-4
203:
204:
205: be issued.
206:
207:
208:
209: 12.3.2.3. (progn 'compile form1 form2 ... formn)
210:
211: When the compiler sees this it simply com-
212: piles form1 through formn as if they too were
213: seen at top level. One use for this is to allow
214: a macro at top-level to expand into more than
215: one function definition for the compiler to com-
216: pile.
217:
218:
219:
220: 12.3.2.4. include/includef
221:
222: _I_n_c_l_u_d_e and _i_n_c_l_u_d_e_f cause another file to
223: be read and compiled by the compiler. The
224: result is the same as if the included file were
225: textually inserted into the original file. The
226: only difference between _i_n_c_l_u_d_e and _i_n_c_l_u_d_e_f is
227: that include doesn't evaluate its argument and
228: includef does. Nested includes are allowed.
229:
230:
231:
232: 12.3.2.5. def
233:
234: A def form is used to define a function.
235: The macros _d_e_f_u_n and _d_e_f_m_a_c_r_o expand to a def
236: form. If the function being defined is a
237: lambda, nlambda or lexpr then the compiler con-
238: verts the lisp definition to a sequence of
239: machine language instructions. If the function
240: being defined is a macro, then the compiler will
241: evaluate the definition, thus defining the macro
242: withing the running Lisp compiler. Furthermore,
243: if the variable _m_a_c_r_o_s is set to a non nil
244: value, then the macro definition will also be
245: translated to machine language and thus will be
246: defined when the object file is fasled in. The
247: variable _m_a_c_r_o_s is set to t by
248: (_d_e_c_l_a_r_e (_m_a_c_r_o_s _t)).
249:
250: When a function or macro definition is com-
251: piled, macro expansion is done whenever possi-
252: ble. If the compiler can determine that a form
253: would be evaluated if this function were inter-
254: preted then it will macro expand it. It will
255: not macro expand arguments to a nlambda unless
256: the characteristics of the nlambda is known (as
257: is the case with _c_o_n_d). The map functions (
258:
259:
260: Printed: August 5, 1983
261:
262:
263:
264:
265:
266:
267:
268: Liszt - the lisp compiler 12-5
269:
270:
271: _m_a_p, _m_a_p_c, _m_a_p_c_a_r, and so on) are expanded to a
272: _d_o statement. This allows the first argument to
273: the map function to be a lambda expression which
274: references local variables of the function being
275: defined.
276:
277:
278:
279: 12.3.2.6. other forms
280:
281: All other forms are simply stored in the
282: object file and are evaluated when the file is
283: _f_a_s_led in.
284:
285:
286:
287: 12.4. Using the compiler
288:
289: The previous section describes exactly what the
290: compiler does with its input. Generally you won't
291: have to worry about all that detail as files which
292: work interpreted will work compiled. Following is a
293: list of steps you should follow to insure that a file
294: will compile correctly.
295:
296: [1] Make sure all macro definitions precede their use
297: in functions or other macro definitions. If you
298: want the macros to be around when you _f_a_s_l in the
299: object file you should include this statement at
300: the beginning of the file: (_d_e_c_l_a_r_e (_m_a_c_r_o_s _t))
301:
302: [2] Make sure all nlambdas are defined or declared
303: before they are used. If the compiler comes
304: across a call to a function which has not been
305: defined in the current file, which does not
306: currently have a function binding, and whose type
307: has not been declared then it will assume that
308: the function needs its arguments evaluated (i.e.
309: it is a lambda or lexpr) and will generate code
310: accordingly. This means that you do not have to
311: declare nlambda functions like _s_t_a_t_u_s since they
312: have an nlambda function binding.
313:
314: [3] Locate all variables which are used for communi-
315: cating values between functions. These variables
316: must be declared special at the beginning of a
317: file. In most cases there won't be many special
318: declarations but if you fail to declare a vari-
319: able special that should be, the compiled code
320: could fail in mysterious ways. Let's look at a
321: common problem, assume that a file contains just
322: these three lines:
323: 9
324:
325: 9 Printed: August 5, 1983
326:
327:
328:
329:
330:
331:
332:
333: Liszt - the lisp compiler 12-6
334:
335:
336: (_d_e_f _a_a_a (_l_a_m_b_d_a (_g_l_o_b _l_o_c) (_b_b_b _l_o_c)))
337: (_d_e_f _b_b_b (_l_a_m_b_d_a (_m_y_l_o_c) (_a_d_d _g_l_o_b _m_y_l_o_c)))
338: (_d_e_f _c_c_c (_l_a_m_b_d_a (_g_l_o_b _l_o_c) (_b_b_b _l_o_c)))
339:
340:
341: We can see that if we load in these two defini-
342: tions then (aaa 3 4) is the same as (add 3 4) and
343: will give us 7. Suppose we compile the file con-
344: taining these definitions. When Liszt compiles
345: aaa, it will assume that both glob and loc are
346: local variables and will allocate space on the
347: temporary stack for their values when aaa is
348: called. Thus the values of the local variables
349: glob and loc will not affect the values of the
350: symbols glob and loc in the Lisp system. Now
351: Liszt moves on to function bbb. Myloc is assumed
352: to be local. When it sees the add statement, it
353: find a reference to a variable called glob. This
354: variable is not a local variable to this function
355: and therefore glob must refer to the value of the
356: symbol glob. Liszt will automatically declare
357: glob to be special and it will print a warning to
358: that effect. Thus subsequent uses of glob will
359: always refer to the symbol glob. Next Liszt com-
360: piles ccc and treats glob as a special and loc as
361: a local. When the object file is _f_a_s_l'ed in, and
362: (ccc 3 4) is evaluated, the symbol glob will be
363: lambda bound to 3 bbb will be called and will
364: return 7. However (aaa 3 4) will fail since when
365: bbb is called, glob will be unbound. What should
366: be done here is to put (_d_e_c_l_a_r_e (_s_p_e_c_i_a_l _g_l_o_b) at
367: the beginning of the file.
368:
369: [4] Make sure that all calls to _a_r_g are within the
370: lexpr whose arguments they reference. If _f_o_o is
371: a compiled lexpr and it calls _b_a_r then _b_a_r cannot
372: use _a_r_g to get at _f_o_o's arguments. If both _f_o_o
373: and _b_a_r are interpreted this will work however.
374: The macro _l_i_s_t_i_f_y can be used to put all of some
375: of a lexprs arguments in a list which then can be
376: passed to other functions.
377:
378:
379:
380: 12.5. Compiler options
381:
382: The compiler recognizes a number of options which
383: are described below. The options are typed anywhere
384: on the command line preceded by a minus sign. The
385: entire command line is scanned and all options
386: recorded before any action is taken. Thus
387: % liszt -mx foo
388: % liszt -m -x foo
389:
390:
391: Printed: August 5, 1983
392:
393:
394:
395:
396:
397:
398:
399: Liszt - the lisp compiler 12-7
400:
401:
402: % liszt foo -mx
403: are all equivalent. Before scanning the command line
404: for options, liszt looks for in the environment for
405: the variable LISZT, and if found scans its value as if
406: it was a string of options. The meaning of the
407: options are:
408:
409: C The assembler language output of the compiler is
410: commented. This is useful when debugging the
411: compiler and is not normally done since it slows
412: down compilation.
413:
414: I The next command line argument is taken as a
415: filename, and loaded prior to compilation.
416:
417: e Evaluate the next argument on the command line
418: before starting compilation. For example
419: % liszt -e '(setq foobar "foo string")' foo
420: will evaluate the above s-expression. Note that
421: the shell requires that the arguments be sur-
422: rounded by single quotes.
423:
424: i Compile this program in interlisp compatibility
425: mode. This is not implemented yet.
426:
427: m Compile this program in Maclisp mode. The reader
428: syntax will be changed to the Maclisp syntax and
429: a file of macro definitions will be loaded in
430: (usually named /usr/lib/lisp/machacks). This
431: switch brings us sufficiently close to Maclisp to
432: allow us to compile Macsyma, a large Maclisp pro-
433: gram. However Maclisp is a moving target and we
434: can't guarantee that this switch will allow you
435: to compile any given program.
436:
437: o Select a different object or assembler language
438: file name. For example
439: % liszt foo -o xxx.o
440: will compile foo and into xxx.o instead of the
441: default foo.o, and
442: % liszt bar -S -o xxx.s
443: will compile to assembler language into xxx.s
444: instead of bar.s.
445:
446: p place profiling code at the beginning of each
447: non-local function. If the lisp system is also
448: created with profiling in it, this allows func-
449: tion calling frequency to be determined (see
450: _p_r_o_f(_1))
451:
452: q Run in quiet mode. The names of functions being
453: compiled and various "Note"'s are not printed.
454: 9
455:
456: 9 Printed: August 5, 1983
457:
458:
459:
460:
461:
462:
463:
464: Liszt - the lisp compiler 12-8
465:
466:
467: Q print compilation statistics and warn of strange
468: constructs. This is the inverse of the q switch
469: and is the default.
470:
471: r place bootstrap code at the beginning of the
472: object file, which when the object file is exe-
473: cuted will cause a lisp system to be invoked and
474: the object file _f_a_s_led in. This is known as
475: `autorun' and is described below.
476:
477: S Create an assembler language file only.
478: % liszt -S foo
479: will create the file assembler language file
480: foo.s and will not attempt to assemble it. If
481: this option is not specified, the assembler
482: language file will be put in the temporary disk
483: area under a automatically generated name based
484: on the lisp compiler's process id. Then if there
485: are no compilation errors, the assembler will be
486: invoked to assemble the file.
487:
488: T Print the assembler language output on the stan-
489: dard output file. This is useful when debugging
490: the compiler.
491:
492: u Run in UCI-Lisp mode. The character syntax is
493: changed to that of UCI-Lisp and a UCI-Lisp compa-
494: tibility package of macros is read in.
495:
496: w Suppress warning messages.
497:
498: x Create an cross reference file.
499: % liszt -x foo
500: not only compiles foo into foo.o but also gen-
501: erates the file foo.x . The file foo.x is lisp
502: readable and lists for each function all func-
503: tions which that function could call. The pro-
504: gram lxref reads one or more of these ".x" files
505: and produces a human readable cross reference
506: listing.
507:
508:
509:
510: 12.6. autorun
511:
512: The object file which liszt writes does not con-
513: tain all the functions necessary to run the lisp pro-
514: gram which was compiled. In order to use the object
515: file, a lisp system must be started and the object
516: file _f_a_s_led in. When the -r switch is given to liszt,
517: the object file created will contain a small piece of
518: bootstrap code at the beginning, and the object file
519: will be made executable. Now, when the name of the
520:
521:
522: Printed: August 5, 1983
523:
524:
525:
526:
527:
528:
529:
530: Liszt - the lisp compiler 12-9
531:
532:
533: object file is given to the UNIX command interpreter
534: (shell) to run, the bootstrap code at the beginning of
535: the object file will cause a lisp system to be started
536: and the first action the lisp system will take is to
537: _f_a_s_l in the object file which started it. In effect
538: the object file has created an environment in which it
539: can run.
540:
541: Autorun is an alternative to _d_u_m_p_l_i_s_p. The
542: advantage of autorun is that the object file which
543: starts the whole process is typically small, whereas
544: the minimum _d_u_m_p_l_i_s_ped file is very large (one half
545: megabyte). The disadvantage of autorun is that the
546: file must be _f_a_s_led into a lisp each time it is used
547: whereas the file which _d_u_m_p_l_i_s_p creates can be run as
548: is. liszt itself is a _d_u_m_p_l_i_s_ped file since it is
549: used so often and is large enough that too much time
550: would be wasted _f_a_s_ling it in each time it was used.
551: The lisp cross reference program, lxref, uses _a_u_t_o_r_u_n
552: since it is a small and rarely used program.
553:
554: In order to have the program _f_a_s_led in begin exe-
555: cution (rather than starting a lisp top level), the
556: value of the symbol user-top-level should be set to
557: the name of the function to get control. An example
558: of this is shown next.
559:
560:
561:
562:
563:
564:
565:
566:
567:
568:
569:
570:
571:
572:
573:
574:
575:
576:
577:
578:
579:
580:
581:
582:
583:
584:
585: 9
586:
587: 9 Printed: August 5, 1983
588:
589:
590:
591:
592:
593:
594:
595: Liszt - the lisp compiler 12-10
596:
597:
598:
599: ____________________________________________________
600:
601: _w_e _w_a_n_t _t_o _r_e_p_l_a_c_e _t_h_e _u_n_i_x _d_a_t_e _p_r_o_g_r_a_m _w_i_t_h _o_n_e _w_r_i_t_t_e_n _i_n _l_i_s_p.
602:
603: % cat lispdate.l
604: (defun mydate nil
605: (patom "The date is ")
606: (patom (status ctime))
607: (terpr)
608: (exit 0))
609: (setq user-top-level 'mydate)
610:
611: % liszt -r lispdate
612: Compilation begins with Lisp Compiler 5.2
613: source: lispdate.l, result: lispdate.o
614: mydate
615: %Note: lispdate.l: Compilation complete
616: %Note: lispdate.l: Time: Real: 0:3, CPU: 0:0.28, GC: 0:0.00 for 0 gcs
617: %Note: lispdate.l: Assembly begins
618: %Note: lispdate.l: Assembly completed successfully
619: 3.0u 2.0s 0:17 29%
620:
621: _W_e _c_h_a_n_g_e _t_h_e _n_a_m_e _t_o _r_e_m_o_v_e _t_h_e "._o", (_t_h_i_s _i_s_n'_t _n_e_c_e_s_s_a_r_y)
622: % mv lispdate.o lispdate
623:
624: _N_o_w _w_e _t_e_s_t _i_t _o_u_t
625: % lispdate
626: The date is Sat Aug 1 16:58:33 1981
627: %
628: ____________________________________________________
629:
630:
631:
632:
633:
634:
635: 12.7. pure literals
636:
637: Normally the quoted lisp objects (literals) which
638: appear in functions are treated as constants. Consider
639: this function:
640:
641: (_d_e_f _f_o_o
642: (_l_a_m_b_d_a _n_i_l (_c_o_n_d ((_n_o_t (_e_q '_a (_c_a_r (_s_e_t_q _x '(_a
643: _b)))))
644: (_p_r_i_n_t '_i_m_p_o_s_s_i_b_l_e!!))
645: (_t (_r_p_l_a_c_a _x '_d)))))
646:
647: At first glance it seems that the first cond clause
648: will never be true, since the _c_a_r of (_a _b) should
649: always be _a. However if you run this function twice,
650: it will print 'impossible!!' the second time. This is
651:
652:
653: Printed: August 5, 1983
654:
655:
656:
657:
658:
659:
660:
661: Liszt - the lisp compiler 12-11
662:
663:
664: because the following clause modifies the 'constant'
665: list (_a _b) with the _r_p_l_a_c_a function. Such modifica-
666: tion of literal lisp objects can cause programs to
667: behave strangely as the above example shows, but more
668: importantly it can cause garbage collection problems
669: if done to compiled code. When a file is _f_a_s_led in,
670: if the symbol $purcopylits is non nil, the literal
671: lisp data is put in 'pure' space, that is it put in
672: space which needn't be looked at by the garabage col-
673: lector. This reduces the work the garbage collector
674: must do but it is dangerous since if the literals are
675: modified to point to non pure objects, the marker may
676: not mark the non pure objects. If the symbol $pur-
677: copylits is nil then the literal lisp data is put in
678: impure space and the compiled code will act like the
679: interpreted code when literal data is modified. The
680: default value for $purcopylits is t.
681:
682:
683:
684: 12.8. transfer tables
685:
686: A transfer table is setup by _f_a_s_l when the object
687: file is loaded in. There is one entry in the transfer
688: table for each function which is called in that object
689: file. The entry for a call to the function _f_o_o has
690: two parts whose contents are:
691:
692: [1] function address - This will initially point to
693: the internal function _q_l_i_n_k_e_r. It may some time
694: in the future point to the function _f_o_o if cer-
695: tain conditions are satisfied (more on this
696: below).
697:
698: [2] function name - This is a pointer to the symbol
699: _f_o_o. This will be used by _q_l_i_n_k_e_r.
700:
701:
702:
703: When a call is made to the function _f_o_o the call will
704: actually be made to the address in the transfer table
705: entry and will end up in the _q_l_i_n_k_e_r function.
706: _Q_l_i_n_k_e_r will determine that _f_o_o was the function being
707: called by locating the function name entry in the
708: transfer table[]. If the function being called is not
709: compiled then _q_l_i_n_k_e_r just calls _f_u_n_c_a_l_l to perform
710: ____________________
711: 9 []_Q_l_i_n_k_e_r does this by tracing back the call stack until
712: it finds the _c_a_l_l_s machine instruction which called it. The
713: address field of the _c_a_l_l_s contains the address of the
714: transfer table entry.
715:
716:
717:
718: 9 Printed: August 5, 1983
719:
720:
721:
722:
723:
724:
725:
726: Liszt - the lisp compiler 12-12
727:
728:
729: the function call. If _f_o_o is compiled and if
730: (_s_t_a_t_u_s _t_r_a_n_s_l_i_n_k) is non nil, then _q_l_i_n_k_e_r will
731: modify the function address part of the transfer table
732: to point directly to the function _f_o_o. Finally
733: _q_l_i_n_k_e_r will call _f_o_o directly . The next time a call
734: is made to _f_o_o the call will go directly to _f_o_o and
735: not through _q_l_i_n_k_e_r. This will result in a substan-
736: tial speedup in compiled code to compiled code
737: transfers. A disadvantage is that no debugging infor-
738: mation is left on the stack, so _s_h_o_w_s_t_a_c_k and _b_a_k_t_r_a_c_e
739: are useless. Another disadvantage is that if you
740: redefine a compiled function either through loading in
741: a new version or interactively defining it, then the
742: old version may still be called from compiled code if
743: the fast linking described above has already been
744: done. The solution to these problems is to use
745: (_s_s_t_a_t_u_s _t_r_a_n_s_l_i_n_k _v_a_l_u_e). If value is
746:
747: _n_i_l All transfer tables will be cleared, i.e. all
748: function addresses will be set to point to
749: _q_l_i_n_k_e_r. This means that the next time a func-
750: tion is called _q_l_i_n_k_e_r will be called and will
751: look at the current definition. Also, no fast
752: links will be set up since (_s_t_a_t_u_s _t_r_a_n_s_l_i_n_k)
753: will be nil. The end result is that _s_h_o_w_s_t_a_c_k
754: and _b_a_k_t_r_a_c_e will work and the function defini-
755: tion at the time of call will always be used.
756:
757: _o_n This causes the lisp system to go through all
758: transfer tables and set up fast links wherever
759: possible. This is normally used after you have
760: _f_a_s_led in all of your files. Furthermore since
761: (_s_t_a_t_u_s _t_r_a_n_s_l_i_n_k) is not nil, _q_l_i_n_k_e_r will make
762: new fast links if the situation arises (which
763: isn't likely unless you _f_a_s_l in another file).
764:
765: _t This or any other value not previously mentioned
766: will just make (_s_t_a_t_u_s _t_r_a_n_s_l_i_n_k) be non nil, and
767: as a result fast links will be made by _q_l_i_n_k_e_r
768: if the called function is compiled.
769:
770:
771:
772: 12.9. Fixnum functions
773:
774: The compiler will generate inline arithmetic code
775: for fixnum only functions. Such functions include +,
776: -, *, /, \, 1+ and 1-. The code generated will be
777: much faster than using _a_d_d, _d_i_f_f_e_r_e_n_c_e, etc. However
778: it will only work if the arguments to and results of
779: the functions are fixnums. No type checking is done.
780:
781: 9
782:
783: 9 Printed: August 5, 1983
784:
785:
786:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.