*** empty log message ***
[bpt/emacs.git] / lispref / compile.texi
CommitLineData
53f60086
RS
1@c -*-texinfo-*-
2@c This is part of the GNU Emacs Lisp Reference Manual.
a0acfc98 3@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
53f60086
RS
4@c See the file elisp.texi for copying conditions.
5@setfilename ../info/compile
a9f0a989 6@node Byte Compilation, Advising Functions, Loading, Top
53f60086
RS
7@chapter Byte Compilation
8@cindex byte-code
9@cindex compilation
10
969fe9b5 11 Emacs Lisp has a @dfn{compiler} that translates functions written
53f60086
RS
12in Lisp into a special representation called @dfn{byte-code} that can be
13executed more efficiently. The compiler replaces Lisp function
14definitions with byte-code. When a byte-code function is called, its
15definition is evaluated by the @dfn{byte-code interpreter}.
16
17 Because the byte-compiled code is evaluated by the byte-code
18interpreter, instead of being executed directly by the machine's
19hardware (as true compiled code is), byte-code is completely
20transportable from machine to machine without recompilation. It is not,
21however, as fast as true compiled code.
22
a9f0a989
RS
23 Compiling a Lisp file with the Emacs byte compiler always reads the
24file as multibyte text, even if Emacs was started with @samp{--unibyte},
25unless the file specifies otherwise. This is so that compilation gives
26results compatible with running the same file without compilation.
27@xref{Loading Non-ASCII}.
28
53f60086 29 In general, any version of Emacs can run byte-compiled code produced
969fe9b5
RS
30by recent earlier versions of Emacs, but the reverse is not true. A
31major incompatible change was introduced in Emacs version 19.29, and
32files compiled with versions since that one will definitely not run
33in earlier versions unless you specify a special option.
bfe721d1
KH
34@iftex
35@xref{Docs and Compilation}.
36@end iftex
969fe9b5
RS
37In addition, the modifier bits in keyboard characters were renumbered in
38Emacs 19.29; as a result, files compiled in versions before 19.29 will
39not work in subsequent versions if they contain character constants with
40modifier bits.
53f60086
RS
41
42 @xref{Compilation Errors}, for how to investigate errors occurring in
43byte compilation.
44
45@menu
a0acfc98 46* Speed of Byte-Code:: An example of speedup from byte compilation.
53f60086 47* Compilation Functions:: Byte compilation functions.
22697dac
KH
48* Docs and Compilation:: Dynamic loading of documentation strings.
49* Dynamic Loading:: Dynamic loading of individual functions.
53f60086
RS
50* Eval During Compile:: Code to be evaluated when you compile.
51* Byte-Code Objects:: The data type used for byte-compiled functions.
52* Disassembly:: Disassembling byte-code; how to read byte-code.
53@end menu
54
a0acfc98
RS
55@node Speed of Byte-Code
56@section Performance of Byte-Compiled Code
53f60086
RS
57
58 A byte-compiled function is not as efficient as a primitive function
59written in C, but runs much faster than the version written in Lisp.
a0acfc98 60Here is an example:
53f60086
RS
61
62@example
63@group
64(defun silly-loop (n)
65 "Return time before and after N iterations of a loop."
66 (let ((t1 (current-time-string)))
67 (while (> (setq n (1- n))
68 0))
69 (list t1 (current-time-string))))
70@result{} silly-loop
71@end group
72
73@group
74(silly-loop 100000)
a0acfc98
RS
75@result{} ("Fri Mar 18 17:25:57 1994"
76 "Fri Mar 18 17:26:28 1994") ; @r{31 seconds}
53f60086
RS
77@end group
78
79@group
80(byte-compile 'silly-loop)
81@result{} @r{[Compiled code not shown]}
82@end group
83
84@group
85(silly-loop 100000)
a0acfc98
RS
86@result{} ("Fri Mar 18 17:26:52 1994"
87 "Fri Mar 18 17:26:58 1994") ; @r{6 seconds}
53f60086
RS
88@end group
89@end example
90
a0acfc98
RS
91 In this example, the interpreted code required 31 seconds to run,
92whereas the byte-compiled code required 6 seconds. These results are
53f60086
RS
93representative, but actual results will vary greatly.
94
a0acfc98
RS
95@node Compilation Functions
96@comment node-name, next, previous, up
97@section The Compilation Functions
98@cindex compilation functions
99
100 You can byte-compile an individual function or macro definition with
101the @code{byte-compile} function. You can compile a whole file with
102@code{byte-compile-file}, or several files with
103@code{byte-recompile-directory} or @code{batch-byte-compile}.
104
9e2b495b
RS
105 The byte compiler produces error messages and warnings about each file
106in a buffer called @samp{*Compile-Log*}. These report things in your
107program that suggest a problem but are not necessarily erroneous.
a0acfc98
RS
108
109@cindex macro compilation
969fe9b5
RS
110 Be careful when writing macro calls in files that you may someday
111byte-compile. Macro calls are expanded when they are compiled, so the
112macros must already be defined for proper compilation. For more
113details, see @ref{Compiling Macros}.
a0acfc98
RS
114
115 Normally, compiling a file does not evaluate the file's contents or
bfe721d1
KH
116load the file. But it does execute any @code{require} calls at top
117level in the file. One way to ensure that necessary macro definitions
118are available during compilation is to require the file that defines
119them (@pxref{Named Features}). To avoid loading the macro definition files
120when someone @emph{runs} the compiled program, write
121@code{eval-when-compile} around the @code{require} calls (@pxref{Eval
122During Compile}).
a0acfc98 123
53f60086 124@defun byte-compile symbol
a0acfc98 125This function byte-compiles the function definition of @var{symbol},
53f60086
RS
126replacing the previous definition with the compiled one. The function
127definition of @var{symbol} must be the actual code for the function;
128i.e., the compiler does not follow indirection to another symbol.
a0acfc98
RS
129@code{byte-compile} returns the new, compiled definition of
130@var{symbol}.
131
22697dac 132 If @var{symbol}'s definition is a byte-code function object,
a0acfc98
RS
133@code{byte-compile} does nothing and returns @code{nil}. Lisp records
134only one function definition for any symbol, and if that is already
135compiled, non-compiled code is not available anywhere. So there is no
136way to ``compile the same definition again.''
53f60086
RS
137
138@example
139@group
140(defun factorial (integer)
141 "Compute factorial of INTEGER."
142 (if (= 1 integer) 1
143 (* integer (factorial (1- integer)))))
a0acfc98 144@result{} factorial
53f60086
RS
145@end group
146
147@group
148(byte-compile 'factorial)
a0acfc98 149@result{}
53f60086
RS
150#[(integer)
151 "^H\301U\203^H^@@\301\207\302^H\303^HS!\"\207"
152 [integer 1 * factorial]
153 4 "Compute factorial of INTEGER."]
154@end group
155@end example
156
157@noindent
a0acfc98
RS
158The result is a byte-code function object. The string it contains is
159the actual byte-code; each character in it is an instruction or an
160operand of an instruction. The vector contains all the constants,
161variable names and function names used by the function, except for
162certain primitives that are coded as special instructions.
53f60086
RS
163@end defun
164
165@deffn Command compile-defun
166This command reads the defun containing point, compiles it, and
167evaluates the result. If you use this on a defun that is actually a
168function definition, the effect is to install a compiled version of that
169function.
170@end deffn
171
172@deffn Command byte-compile-file filename
a9f0a989
RS
173This function compiles a file of Lisp code named @var{filename} into a
174file of byte-code. The output file's name is made by changing the
175@samp{.el} suffix into @samp{.elc}; if @var{filename} does not end in
176@samp{.el}, it adds @samp{.elc} to the end of @var{filename}.
53f60086 177
a0acfc98 178Compilation works by reading the input file one form at a time. If it
53f60086
RS
179is a definition of a function or macro, the compiled function or macro
180definition is written out. Other forms are batched together, then each
181batch is compiled, and written so that its compiled code will be
182executed when the file is read. All comments are discarded when the
183input file is read.
184
a0acfc98 185This command returns @code{t}. When called interactively, it prompts
53f60086
RS
186for the file name.
187
188@example
189@group
190% ls -l push*
191-rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el
192@end group
193
194@group
195(byte-compile-file "~/emacs/push.el")
196 @result{} t
197@end group
198
199@group
200% ls -l push*
201-rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el
202-rw-rw-rw- 1 lewis 638 Oct 8 20:25 push.elc
203@end group
204@end example
205@end deffn
206
207@deffn Command byte-recompile-directory directory flag
208@cindex library compilation
a0acfc98 209This function recompiles every @samp{.el} file in @var{directory} that
53f60086
RS
210needs recompilation. A file needs recompilation if a @samp{.elc} file
211exists but is older than the @samp{.el} file.
212
969fe9b5
RS
213When a @samp{.el} file has no corresponding @samp{.elc} file, @var{flag}
214says what to do. If it is @code{nil}, these files are ignored. If it
215is non-@code{nil}, the user is asked whether to compile each such file.
53f60086 216
a0acfc98 217The returned value of this command is unpredictable.
53f60086
RS
218@end deffn
219
220@defun batch-byte-compile
a0acfc98
RS
221This function runs @code{byte-compile-file} on files specified on the
222command line. This function must be used only in a batch execution of
223Emacs, as it kills Emacs on completion. An error in one file does not
f9f59935
RS
224prevent processing of subsequent files, but no output file will be
225generated for it, and the Emacs process will terminate with a nonzero
226status code.
53f60086
RS
227
228@example
229% emacs -batch -f batch-byte-compile *.el
230@end example
231@end defun
232
233@defun byte-code code-string data-vector max-stack
234@cindex byte-code interpreter
a0acfc98 235This function actually interprets byte-code. A byte-compiled function
53f60086 236is actually defined with a body that calls @code{byte-code}. Don't call
969fe9b5 237this function yourself---only the byte compiler knows how to generate
53f60086
RS
238valid calls to this function.
239
969fe9b5
RS
240In Emacs version 18, byte-code was always executed by way of a call to
241the function @code{byte-code}. Nowadays, byte-code is usually executed
242as part of a byte-code function object, and only rarely through an
243explicit call to @code{byte-code}.
53f60086
RS
244@end defun
245
22697dac
KH
246@node Docs and Compilation
247@section Documentation Strings and Compilation
248@cindex dynamic loading of documentation
249
250 Functions and variables loaded from a byte-compiled file access their
251documentation strings dynamically from the file whenever needed. This
cc8c51f1 252saves space within Emacs, and makes loading faster because the
22697dac
KH
253documentation strings themselves need not be processed while loading the
254file. Actual access to the documentation strings becomes slower as a
255result, but this normally is not enough to bother users.
256
257 Dynamic access to documentation strings does have drawbacks:
258
259@itemize @bullet
260@item
261If you delete or move the compiled file after loading it, Emacs can no
262longer access the documentation strings for the functions and variables
263in the file.
264
265@item
266If you alter the compiled file (such as by compiling a new version),
267then further access to documentation strings in this file will give
268nonsense results.
269@end itemize
270
271 If your site installs Emacs following the usual procedures, these
272problems will never normally occur. Installing a new version uses a new
273directory with a different name; as long as the old version remains
274installed, its files will remain unmodified in the places where they are
275expected to be.
276
89dbfd18 277 However, if you have built Emacs yourself and use it from the
22697dac
KH
278directory where you built it, you will experience this problem
279occasionally if you edit and recompile Lisp files. When it happens, you
280can cure the problem by reloading the file after recompiling it.
281
969fe9b5
RS
282 Byte-compiled files made with recent versions of Emacs (since 19.29)
283will not load into older versions because the older versions don't
284support this feature. You can turn off this feature at compile time by
285setting @code{byte-compile-dynamic-docstrings} to @code{nil}; then you
286can compile files that will load into older Emacs versions. You can do
287this globally, or for one source file by specifying a file-local binding
288for the variable. One way to do that is by adding this string to the
289file's first line:
22697dac
KH
290
291@example
292-*-byte-compile-dynamic-docstrings: nil;-*-
293@end example
294
295@defvar byte-compile-dynamic-docstrings
296If this is non-@code{nil}, the byte compiler generates compiled files
297that are set up for dynamic loading of documentation strings.
298@end defvar
299
300@cindex @samp{#@@@var{count}}
301@cindex @samp{#$}
302 The dynamic documentation string feature writes compiled files that
303use a special Lisp reader construct, @samp{#@@@var{count}}. This
304construct skips the next @var{count} characters. It also uses the
305@samp{#$} construct, which stands for ``the name of this file, as a
969fe9b5
RS
306string.'' It is usually best not to use these constructs in Lisp source
307files, since they are not designed to be clear to humans reading the
308file.
22697dac
KH
309
310@node Dynamic Loading
311@section Dynamic Loading of Individual Functions
312
313@cindex dynamic loading of functions
314@cindex lazy loading
315 When you compile a file, you can optionally enable the @dfn{dynamic
316function loading} feature (also known as @dfn{lazy loading}). With
317dynamic function loading, loading the file doesn't fully read the
318function definitions in the file. Instead, each function definition
319contains a place-holder which refers to the file. The first time each
320function is called, it reads the full definition from the file, to
321replace the place-holder.
322
323 The advantage of dynamic function loading is that loading the file
324becomes much faster. This is a good thing for a file which contains
969fe9b5
RS
325many separate user-callable functions, if using one of them does not
326imply you will probably also use the rest. A specialized mode which
327provides many keyboard commands often has that usage pattern: a user may
328invoke the mode, but use only a few of the commands it provides.
22697dac
KH
329
330 The dynamic loading feature has certain disadvantages:
331
332@itemize @bullet
333@item
334If you delete or move the compiled file after loading it, Emacs can no
335longer load the remaining function definitions not already loaded.
336
337@item
338If you alter the compiled file (such as by compiling a new version),
969fe9b5 339then trying to load any function not already loaded will yield nonsense
22697dac
KH
340results.
341@end itemize
342
969fe9b5
RS
343 These problems will never happen in normal circumstances with
344installed Emacs files. But they are quite likely to happen with Lisp
345files that you are changing. The easiest way to prevent these problems
346is to reload the new compiled file immediately after each recompilation.
22697dac
KH
347
348 The byte compiler uses the dynamic function loading feature if the
349variable @code{byte-compile-dynamic} is non-@code{nil} at compilation
350time. Do not set this variable globally, since dynamic loading is
351desirable only for certain files. Instead, enable the feature for
969fe9b5
RS
352specific source files with file-local variable bindings. For example,
353you could do it by writing this text in the source file's first line:
22697dac
KH
354
355@example
356-*-byte-compile-dynamic: t;-*-
357@end example
358
359@defvar byte-compile-dynamic
360If this is non-@code{nil}, the byte compiler generates compiled files
361that are set up for dynamic function loading.
362@end defvar
363
364@defun fetch-bytecode function
365This immediately finishes loading the definition of @var{function} from
366its byte-compiled file, if it is not fully loaded already. The argument
367@var{function} may be a byte-code function object or a function name.
368@end defun
369
53f60086
RS
370@node Eval During Compile
371@section Evaluation During Compilation
372
22697dac 373 These features permit you to write code to be evaluated during
53f60086
RS
374compilation of a program.
375
376@defspec eval-and-compile body
377This form marks @var{body} to be evaluated both when you compile the
378containing code and when you run it (whether compiled or not).
379
380You can get a similar result by putting @var{body} in a separate file
969fe9b5
RS
381and referring to that file with @code{require}. That method is
382preferable when @var{body} is large.
53f60086
RS
383@end defspec
384
385@defspec eval-when-compile body
f9f59935 386This form marks @var{body} to be evaluated at compile time but not when
78c71a98 387the compiled program is loaded. The result of evaluation by the
f9f59935
RS
388compiler becomes a constant which appears in the compiled program. If
389you load the source file, rather than compiling it, @var{body} is
390evaluated normally.
53f60086 391
969fe9b5
RS
392@strong{Common Lisp Note:} At top level, this is analogous to the Common
393Lisp idiom @code{(eval-when (compile eval) @dots{})}. Elsewhere, the
394Common Lisp @samp{#.} reader macro (but not when interpreting) is closer
395to what @code{eval-when-compile} does.
53f60086
RS
396@end defspec
397
398@node Byte-Code Objects
bfe721d1 399@section Byte-Code Function Objects
53f60086
RS
400@cindex compiled function
401@cindex byte-code function
402
403 Byte-compiled functions have a special data type: they are
404@dfn{byte-code function objects}.
405
406 Internally, a byte-code function object is much like a vector;
407however, the evaluator handles this data type specially when it appears
408as a function to be called. The printed representation for a byte-code
409function object is like that for a vector, with an additional @samp{#}
410before the opening @samp{[}.
411
53f60086 412 A byte-code function object must have at least four elements; there is
969fe9b5 413no maximum number, but only the first six elements have any normal use.
53f60086
RS
414They are:
415
416@table @var
417@item arglist
418The list of argument symbols.
419
420@item byte-code
421The string containing the byte-code instructions.
422
423@item constants
78c71a98
RS
424The vector of Lisp objects referenced by the byte code. These include
425symbols used as function names and variable names.
53f60086
RS
426
427@item stacksize
428The maximum stack size this function needs.
429
430@item docstring
bfe721d1
KH
431The documentation string (if any); otherwise, @code{nil}. The value may
432be a number or a list, in case the documentation string is stored in a
433file. Use the function @code{documentation} to get the real
434documentation string (@pxref{Accessing Documentation}).
53f60086
RS
435
436@item interactive
437The interactive spec (if any). This can be a string or a Lisp
438expression. It is @code{nil} for a function that isn't interactive.
439@end table
440
441Here's an example of a byte-code function object, in printed
442representation. It is the definition of the command
443@code{backward-sexp}.
444
445@example
446#[(&optional arg)
447 "^H\204^F^@@\301^P\302^H[!\207"
448 [arg 1 forward-sexp]
449 2
450 254435
451 "p"]
452@end example
453
454 The primitive way to create a byte-code object is with
455@code{make-byte-code}:
456
457@defun make-byte-code &rest elements
458This function constructs and returns a byte-code function object
459with @var{elements} as its elements.
460@end defun
461
a0acfc98
RS
462 You should not try to come up with the elements for a byte-code
463function yourself, because if they are inconsistent, Emacs may crash
78c71a98 464when you call the function. Always leave it to the byte compiler to
a0acfc98 465create these objects; it makes the elements consistent (we hope).
53f60086
RS
466
467 You can access the elements of a byte-code object using @code{aref};
468you can also use @code{vconcat} to create a vector with the same
469elements.
470
471@node Disassembly
472@section Disassembled Byte-Code
473@cindex disassembled byte-code
474
475 People do not write byte-code; that job is left to the byte compiler.
476But we provide a disassembler to satisfy a cat-like curiosity. The
477disassembler converts the byte-compiled code into humanly readable
478form.
479
480 The byte-code interpreter is implemented as a simple stack machine.
a0acfc98 481It pushes values onto a stack of its own, then pops them off to use them
78c71a98
RS
482in calculations whose results are themselves pushed back on the stack.
483When a byte-code function returns, it pops a value off the stack and
484returns it as the value of the function.
53f60086 485
78c71a98 486 In addition to the stack, byte-code functions can use, bind, and set
a0acfc98
RS
487ordinary Lisp variables, by transferring values between variables and
488the stack.
53f60086
RS
489
490@deffn Command disassemble object &optional stream
491This function prints the disassembled code for @var{object}. If
492@var{stream} is supplied, then output goes there. Otherwise, the
493disassembled code is printed to the stream @code{standard-output}. The
494argument @var{object} can be a function name or a lambda expression.
495
496As a special exception, if this function is used interactively,
497it outputs to a buffer named @samp{*Disassemble*}.
498@end deffn
499
500 Here are two examples of using the @code{disassemble} function. We
501have added explanatory comments to help you relate the byte-code to the
502Lisp source; these do not appear in the output of @code{disassemble}.
503These examples show unoptimized byte-code. Nowadays byte-code is
504usually optimized, but we did not want to rewrite these examples, since
505they still serve their purpose.
506
507@example
508@group
509(defun factorial (integer)
510 "Compute factorial of an integer."
511 (if (= 1 integer) 1
512 (* integer (factorial (1- integer)))))
513 @result{} factorial
514@end group
515
516@group
517(factorial 4)
518 @result{} 24
519@end group
520
521@group
522(disassemble 'factorial)
523 @print{} byte-code for factorial:
524 doc: Compute factorial of an integer.
525 args: (integer)
526@end group
527
528@group
5290 constant 1 ; @r{Push 1 onto stack.}
530
5311 varref integer ; @r{Get value of @code{integer}}
532 ; @r{from the environment}
533 ; @r{and push the value}
534 ; @r{onto the stack.}
535@end group
536
537@group
5382 eqlsign ; @r{Pop top two values off stack,}
539 ; @r{compare them,}
540 ; @r{and push result onto stack.}
541@end group
542
543@group
5443 goto-if-nil 10 ; @r{Pop and test top of stack;}
545 ; @r{if @code{nil}, go to 10,}
546 ; @r{else continue.}
547@end group
548
549@group
5506 constant 1 ; @r{Push 1 onto top of stack.}
551
5527 goto 17 ; @r{Go to 17 (in this case, 1 will be}
553 ; @r{returned by the function).}
554@end group
555
556@group
55710 constant * ; @r{Push symbol @code{*} onto stack.}
558
55911 varref integer ; @r{Push value of @code{integer} onto stack.}
560@end group
561
562@group
56312 constant factorial ; @r{Push @code{factorial} onto stack.}
564
56513 varref integer ; @r{Push value of @code{integer} onto stack.}
566
56714 sub1 ; @r{Pop @code{integer}, decrement value,}
568 ; @r{push new value onto stack.}
569@end group
570
571@group
572 ; @r{Stack now contains:}
573 ; @minus{} @r{decremented value of @code{integer}}
574 ; @minus{} @r{@code{factorial}}
575 ; @minus{} @r{value of @code{integer}}
576 ; @minus{} @r{@code{*}}
577@end group
578
579@group
58015 call 1 ; @r{Call function @code{factorial} using}
581 ; @r{the first (i.e., the top) element}
582 ; @r{of the stack as the argument;}
583 ; @r{push returned value onto stack.}
584@end group
585
586@group
587 ; @r{Stack now contains:}
78c71a98 588 ; @minus{} @r{result of recursive}
53f60086
RS
589 ; @r{call to @code{factorial}}
590 ; @minus{} @r{value of @code{integer}}
591 ; @minus{} @r{@code{*}}
592@end group
593
594@group
59516 call 2 ; @r{Using the first two}
596 ; @r{(i.e., the top two)}
597 ; @r{elements of the stack}
598 ; @r{as arguments,}
599 ; @r{call the function @code{*},}
600 ; @r{pushing the result onto the stack.}
601@end group
602
603@group
60417 return ; @r{Return the top element}
605 ; @r{of the stack.}
606 @result{} nil
607@end group
608@end example
609
610The @code{silly-loop} function is somewhat more complex:
611
612@example
613@group
614(defun silly-loop (n)
615 "Return time before and after N iterations of a loop."
616 (let ((t1 (current-time-string)))
617 (while (> (setq n (1- n))
618 0))
619 (list t1 (current-time-string))))
620 @result{} silly-loop
621@end group
622
623@group
624(disassemble 'silly-loop)
625 @print{} byte-code for silly-loop:
626 doc: Return time before and after N iterations of a loop.
627 args: (n)
628
6290 constant current-time-string ; @r{Push}
630 ; @r{@code{current-time-string}}
631 ; @r{onto top of stack.}
632@end group
633
634@group
6351 call 0 ; @r{Call @code{current-time-string}}
636 ; @r{ with no argument,}
637 ; @r{ pushing result onto stack.}
638@end group
639
640@group
6412 varbind t1 ; @r{Pop stack and bind @code{t1}}
642 ; @r{to popped value.}
643@end group
644
645@group
6463 varref n ; @r{Get value of @code{n} from}
647 ; @r{the environment and push}
648 ; @r{the value onto the stack.}
649@end group
650
651@group
6524 sub1 ; @r{Subtract 1 from top of stack.}
653@end group
654
655@group
6565 dup ; @r{Duplicate the top of the stack;}
a0acfc98 657 ; @r{i.e., copy the top of}
53f60086
RS
658 ; @r{the stack and push the}
659 ; @r{copy onto the stack.}
660@end group
661
662@group
6636 varset n ; @r{Pop the top of the stack,}
664 ; @r{and bind @code{n} to the value.}
665
666 ; @r{In effect, the sequence @code{dup varset}}
667 ; @r{copies the top of the stack}
668 ; @r{into the value of @code{n}}
669 ; @r{without popping it.}
670@end group
671
672@group
6737 constant 0 ; @r{Push 0 onto stack.}
674@end group
675
676@group
6778 gtr ; @r{Pop top two values off stack,}
678 ; @r{test if @var{n} is greater than 0}
679 ; @r{and push result onto stack.}
680@end group
681
682@group
78c71a98
RS
6839 goto-if-nil-else-pop 17 ; @r{Goto 17 if @code{n} <= 0}
684 ; @r{(this exits the while loop).}
53f60086
RS
685 ; @r{else pop top of stack}
686 ; @r{and continue}
53f60086
RS
687@end group
688
689@group
69012 constant nil ; @r{Push @code{nil} onto stack}
691 ; @r{(this is the body of the loop).}
692@end group
693
694@group
69513 discard ; @r{Discard result of the body}
696 ; @r{of the loop (a while loop}
697 ; @r{is always evaluated for}
698 ; @r{its side effects).}
699@end group
700
701@group
70214 goto 3 ; @r{Jump back to beginning}
703 ; @r{of while loop.}
704@end group
705
706@group
70717 discard ; @r{Discard result of while loop}
708 ; @r{by popping top of stack.}
78c71a98
RS
709 ; @r{This result is the value @code{nil} that}
710 ; @r{was not popped by the goto at 9.}
53f60086
RS
711@end group
712
713@group
71418 varref t1 ; @r{Push value of @code{t1} onto stack.}
715@end group
716
717@group
71819 constant current-time-string ; @r{Push}
719 ; @r{@code{current-time-string}}
720 ; @r{onto top of stack.}
721@end group
722
723@group
72420 call 0 ; @r{Call @code{current-time-string} again.}
725@end group
726
727@group
72821 list2 ; @r{Pop top two elements off stack,}
729 ; @r{create a list of them,}
730 ; @r{and push list onto stack.}
731@end group
732
733@group
73422 unbind 1 ; @r{Unbind @code{t1} in local environment.}
735
73623 return ; @r{Return value of the top of stack.}
737
738 @result{} nil
739@end group
740@end example
741
742