Conflate Qnil and Qunbound for `symbol-function'.
[emacs.git] / doc / lispref / compile.texi
blobf088934f5f1ca51c6821b8bf1b0da097a93964a1
1 @c -*-texinfo-*-
2 @c This is part of the GNU Emacs Lisp Reference Manual.
3 @c Copyright (C) 1990-1994, 2001-2012 Free Software Foundation, Inc.
4 @c See the file elisp.texi for copying conditions.
5 @node Byte Compilation
6 @chapter Byte Compilation
7 @cindex byte compilation
8 @cindex byte-code
9 @cindex compilation (Emacs Lisp)
11   Emacs Lisp has a @dfn{compiler} that translates functions written
12 in Lisp into a special representation called @dfn{byte-code} that can be
13 executed more efficiently.  The compiler replaces Lisp function
14 definitions with byte-code.  When a byte-code function is called, its
15 definition is evaluated by the @dfn{byte-code interpreter}.
17   Because the byte-compiled code is evaluated by the byte-code
18 interpreter, instead of being executed directly by the machine's
19 hardware (as true compiled code is), byte-code is completely
20 transportable from machine to machine without recompilation.  It is not,
21 however, as fast as true compiled code.
23   In general, any version of Emacs can run byte-compiled code produced
24 by recent earlier versions of Emacs, but the reverse is not true.
26 @vindex no-byte-compile
27   If you do not want a Lisp file to be compiled, ever, put a file-local
28 variable binding for @code{no-byte-compile} into it, like this:
30 @example
31 ;; -*-no-byte-compile: t; -*-
32 @end example
34 @menu
35 * Speed of Byte-Code::          An example of speedup from byte compilation.
36 * Compilation Functions::       Byte compilation functions.
37 * Docs and Compilation::        Dynamic loading of documentation strings.
38 * Dynamic Loading::             Dynamic loading of individual functions.
39 * Eval During Compile::         Code to be evaluated when you compile.
40 * Compiler Errors::             Handling compiler error messages.
41 * Byte-Code Objects::           The data type used for byte-compiled functions.
42 * Disassembly::                 Disassembling byte-code; how to read byte-code.
43 @end menu
45 @node Speed of Byte-Code
46 @section Performance of Byte-Compiled Code
48   A byte-compiled function is not as efficient as a primitive function
49 written in C, but runs much faster than the version written in Lisp.
50 Here is an example:
52 @example
53 @group
54 (defun silly-loop (n)
55   "Return the time, in seconds, to run N iterations of a loop."
56   (let ((t1 (float-time)))
57     (while (> (setq n (1- n)) 0))
58     (- (float-time) t1)))
59 @result{} silly-loop
60 @end group
62 @group
63 (silly-loop 50000000)
64 @result{} 10.235304117202759
65 @end group
67 @group
68 (byte-compile 'silly-loop)
69 @result{} @r{[Compiled code not shown]}
70 @end group
72 @group
73 (silly-loop 50000000)
74 @result{} 3.705854892730713
75 @end group
76 @end example
78   In this example, the interpreted code required 10 seconds to run,
79 whereas the byte-compiled code required less than 4 seconds.  These
80 results are representative, but actual results may vary.
82 @node Compilation Functions
83 @section Byte-Compilation Functions
84 @cindex compilation functions
86   You can byte-compile an individual function or macro definition with
87 the @code{byte-compile} function.  You can compile a whole file with
88 @code{byte-compile-file}, or several files with
89 @code{byte-recompile-directory} or @code{batch-byte-compile}.
91   Sometimes, the byte compiler produces warning and/or error messages
92 (@pxref{Compiler Errors}, for details).  These messages are recorded
93 in a buffer called @file{*Compile-Log*}, which uses Compilation mode.
94 @xref{Compilation Mode,,,emacs, The GNU Emacs Manual}.
96 @cindex macro compilation
97   Be careful when writing macro calls in files that you intend to
98 byte-compile.  Since macro calls are expanded when they are compiled,
99 the macros need to be loaded into Emacs or the byte compiler will not
100 do the right thing.  The usual way to handle this is with
101 @code{require} forms which specify the files containing the needed
102 macro definitions (@pxref{Named Features}).  Normally, the
103 byte compiler does not evaluate the code that it is compiling, but it
104 handles @code{require} forms specially, by loading the specified
105 libraries.  To avoid loading the macro definition files when someone
106 @emph{runs} the compiled program, write @code{eval-when-compile}
107 around the @code{require} calls (@pxref{Eval During Compile}).  For
108 more details, @xref{Compiling Macros}.
110   Inline (@code{defsubst}) functions are less troublesome; if you
111 compile a call to such a function before its definition is known, the
112 call will still work right, it will just run slower.
114 @defun byte-compile symbol
115 This function byte-compiles the function definition of @var{symbol},
116 replacing the previous definition with the compiled one.  The function
117 definition of @var{symbol} must be the actual code for the function;
118 @code{byte-compile} does not handle function indirection.  The return
119 value is the byte-code function object which is the compiled
120 definition of @var{symbol} (@pxref{Byte-Code Objects}).
122 @example
123 @group
124 (defun factorial (integer)
125   "Compute factorial of INTEGER."
126   (if (= 1 integer) 1
127     (* integer (factorial (1- integer)))))
128 @result{} factorial
129 @end group
131 @group
132 (byte-compile 'factorial)
133 @result{}
134 #[(integer)
135   "^H\301U\203^H^@@\301\207\302^H\303^HS!\"\207"
136   [integer 1 * factorial]
137   4 "Compute factorial of INTEGER."]
138 @end group
139 @end example
141 If @var{symbol}'s definition is a byte-code function object,
142 @code{byte-compile} does nothing and returns @code{nil}.  It does not
143 ``compile the symbol's definition again'', since the original
144 (non-compiled) code has already been replaced in the symbol's function
145 cell by the byte-compiled code.
147 The argument to @code{byte-compile} can also be a @code{lambda}
148 expression.  In that case, the function returns the corresponding
149 compiled code but does not store it anywhere.
150 @end defun
152 @deffn Command compile-defun &optional arg
153 This command reads the defun containing point, compiles it, and
154 evaluates the result.  If you use this on a defun that is actually a
155 function definition, the effect is to install a compiled version of that
156 function.
158 @code{compile-defun} normally displays the result of evaluation in the
159 echo area, but if @var{arg} is non-@code{nil}, it inserts the result
160 in the current buffer after the form it compiled.
161 @end deffn
163 @deffn Command byte-compile-file filename &optional load
164 This function compiles a file of Lisp code named @var{filename} into a
165 file of byte-code.  The output file's name is made by changing the
166 @samp{.el} suffix into @samp{.elc}; if @var{filename} does not end in
167 @samp{.el}, it adds @samp{.elc} to the end of @var{filename}.
169 Compilation works by reading the input file one form at a time.  If it
170 is a definition of a function or macro, the compiled function or macro
171 definition is written out.  Other forms are batched together, then each
172 batch is compiled, and written so that its compiled code will be
173 executed when the file is read.  All comments are discarded when the
174 input file is read.
176 This command returns @code{t} if there were no errors and @code{nil}
177 otherwise.  When called interactively, it prompts for the file name.
179 If @var{load} is non-@code{nil}, this command loads the compiled file
180 after compiling it.  Interactively, @var{load} is the prefix argument.
182 @example
183 @group
184 % ls -l push*
185 -rw-r--r--  1 lewis     791 Oct  5 20:31 push.el
186 @end group
188 @group
189 (byte-compile-file "~/emacs/push.el")
190      @result{} t
191 @end group
193 @group
194 % ls -l push*
195 -rw-r--r--  1 lewis     791 Oct  5 20:31 push.el
196 -rw-rw-rw-  1 lewis     638 Oct  8 20:25 push.elc
197 @end group
198 @end example
199 @end deffn
201 @deffn Command byte-recompile-directory directory &optional flag force
202 @cindex library compilation
203 This command recompiles every @samp{.el} file in @var{directory} (or
204 its subdirectories) that needs recompilation.  A file needs
205 recompilation if a @samp{.elc} file exists but is older than the
206 @samp{.el} file.
208 When a @samp{.el} file has no corresponding @samp{.elc} file,
209 @var{flag} says what to do.  If it is @code{nil}, this command ignores
210 these files.  If @var{flag} is 0, it compiles them.  If it is neither
211 @code{nil} nor 0, it asks the user whether to compile each such file,
212 and asks about each subdirectory as well.
214 Interactively, @code{byte-recompile-directory} prompts for
215 @var{directory} and @var{flag} is the prefix argument.
217 If @var{force} is non-@code{nil}, this command recompiles every
218 @samp{.el} file that has a @samp{.elc} file.
220 The returned value is unpredictable.
221 @end deffn
223 @defun batch-byte-compile &optional noforce
224 This function runs @code{byte-compile-file} on files specified on the
225 command line.  This function must be used only in a batch execution of
226 Emacs, as it kills Emacs on completion.  An error in one file does not
227 prevent processing of subsequent files, but no output file will be
228 generated for it, and the Emacs process will terminate with a nonzero
229 status code.
231 If @var{noforce} is non-@code{nil}, this function does not recompile
232 files that have an up-to-date @samp{.elc} file.
234 @example
235 % emacs -batch -f batch-byte-compile *.el
236 @end example
237 @end defun
239 @node Docs and Compilation
240 @section Documentation Strings and Compilation
241 @cindex dynamic loading of documentation
243   Functions and variables loaded from a byte-compiled file access their
244 documentation strings dynamically from the file whenever needed.  This
245 saves space within Emacs, and makes loading faster because the
246 documentation strings themselves need not be processed while loading the
247 file.  Actual access to the documentation strings becomes slower as a
248 result, but this normally is not enough to bother users.
250   Dynamic access to documentation strings does have drawbacks:
252 @itemize @bullet
253 @item
254 If you delete or move the compiled file after loading it, Emacs can no
255 longer access the documentation strings for the functions and variables
256 in the file.
258 @item
259 If you alter the compiled file (such as by compiling a new version),
260 then further access to documentation strings in this file will
261 probably give nonsense results.
262 @end itemize
264 @noindent
265 These problems normally occur only if you build Emacs yourself and use
266 it from the directory where you built it, and you happen to edit
267 and/or recompile the Lisp source files.  They can be easily cured by
268 reloading each file after recompiling it.
270 @cindex @samp{#@@@var{count}}
271 @cindex @samp{#$}
272   The dynamic documentation string feature writes compiled files that
273 use a special Lisp reader construct, @samp{#@@@var{count}}.  This
274 construct skips the next @var{count} characters.  It also uses the
275 @samp{#$} construct, which stands for ``the name of this file, as a
276 string''.  It is usually best not to use these constructs in Lisp source
277 files, since they are not designed to be clear to humans reading the
278 file.
280   You can disable the dynamic documentation string feature at compile
281 time by setting @code{byte-compile-dynamic-docstrings} to @code{nil};
282 this is useful mainly if you expect to change the file, and you want
283 Emacs processes that have already loaded it to keep working when the
284 file changes.  You can do this globally, or for one source file by
285 specifying a file-local binding for the variable.  One way to do that
286 is by adding this string to the file's first line:
288 @example
289 -*-byte-compile-dynamic-docstrings: nil;-*-
290 @end example
292 @defopt byte-compile-dynamic-docstrings
293 If this is non-@code{nil}, the byte compiler generates compiled files
294 that are set up for dynamic loading of documentation strings.
295 @end defopt
297 @node Dynamic Loading
298 @section Dynamic Loading of Individual Functions
300 @cindex dynamic loading of functions
301 @cindex lazy loading
302   When you compile a file, you can optionally enable the @dfn{dynamic
303 function loading} feature (also known as @dfn{lazy loading}).  With
304 dynamic function loading, loading the file doesn't fully read the
305 function definitions in the file.  Instead, each function definition
306 contains a place-holder which refers to the file.  The first time each
307 function is called, it reads the full definition from the file, to
308 replace the place-holder.
310   The advantage of dynamic function loading is that loading the file
311 becomes much faster.  This is a good thing for a file which contains
312 many separate user-callable functions, if using one of them does not
313 imply you will probably also use the rest.  A specialized mode which
314 provides many keyboard commands often has that usage pattern: a user may
315 invoke the mode, but use only a few of the commands it provides.
317   The dynamic loading feature has certain disadvantages:
319 @itemize @bullet
320 @item
321 If you delete or move the compiled file after loading it, Emacs can no
322 longer load the remaining function definitions not already loaded.
324 @item
325 If you alter the compiled file (such as by compiling a new version),
326 then trying to load any function not already loaded will usually yield
327 nonsense results.
328 @end itemize
330   These problems will never happen in normal circumstances with
331 installed Emacs files.  But they are quite likely to happen with Lisp
332 files that you are changing.  The easiest way to prevent these problems
333 is to reload the new compiled file immediately after each recompilation.
335   The byte compiler uses the dynamic function loading feature if the
336 variable @code{byte-compile-dynamic} is non-@code{nil} at compilation
337 time.  Do not set this variable globally, since dynamic loading is
338 desirable only for certain files.  Instead, enable the feature for
339 specific source files with file-local variable bindings.  For example,
340 you could do it by writing this text in the source file's first line:
342 @example
343 -*-byte-compile-dynamic: t;-*-
344 @end example
346 @defvar byte-compile-dynamic
347 If this is non-@code{nil}, the byte compiler generates compiled files
348 that are set up for dynamic function loading.
349 @end defvar
351 @defun fetch-bytecode function
352 If @var{function} is a byte-code function object, this immediately
353 finishes loading the byte code of @var{function} from its
354 byte-compiled file, if it is not fully loaded already.  Otherwise,
355 it does nothing.  It always returns @var{function}.
356 @end defun
358 @node Eval During Compile
359 @section Evaluation During Compilation
361   These features permit you to write code to be evaluated during
362 compilation of a program.
364 @defspec eval-and-compile body@dots{}
365 This form marks @var{body} to be evaluated both when you compile the
366 containing code and when you run it (whether compiled or not).
368 You can get a similar result by putting @var{body} in a separate file
369 and referring to that file with @code{require}.  That method is
370 preferable when @var{body} is large.  Effectively @code{require} is
371 automatically @code{eval-and-compile}, the package is loaded both when
372 compiling and executing.
374 @code{autoload} is also effectively @code{eval-and-compile} too.  It's
375 recognized when compiling, so uses of such a function don't produce
376 ``not known to be defined'' warnings.
378 Most uses of @code{eval-and-compile} are fairly sophisticated.
380 If a macro has a helper function to build its result, and that macro
381 is used both locally and outside the package, then
382 @code{eval-and-compile} should be used to get the helper both when
383 compiling and then later when running.
385 If functions are defined programmatically (with @code{fset} say), then
386 @code{eval-and-compile} can be used to have that done at compile-time
387 as well as run-time, so calls to those functions are checked (and
388 warnings about ``not known to be defined'' suppressed).
389 @end defspec
391 @defspec eval-when-compile body@dots{}
392 This form marks @var{body} to be evaluated at compile time but not when
393 the compiled program is loaded.  The result of evaluation by the
394 compiler becomes a constant which appears in the compiled program.  If
395 you load the source file, rather than compiling it, @var{body} is
396 evaluated normally.
398 @cindex compile-time constant
399 If you have a constant that needs some calculation to produce,
400 @code{eval-when-compile} can do that at compile-time.  For example,
402 @lisp
403 (defvar my-regexp
404   (eval-when-compile (regexp-opt '("aaa" "aba" "abb"))))
405 @end lisp
407 @cindex macros, at compile time
408 If you're using another package, but only need macros from it (the
409 byte compiler will expand those), then @code{eval-when-compile} can be
410 used to load it for compiling, but not executing.  For example,
412 @lisp
413 (eval-when-compile
414   (require 'my-macro-package))
415 @end lisp
417 The same sort of thing goes for macros and @code{defsubst} functions
418 defined locally and only for use within the file.  They are needed for
419 compiling the file, but in most cases they are not needed for
420 execution of the compiled file.  For example,
422 @lisp
423 (eval-when-compile
424   (unless (fboundp 'some-new-thing)
425     (defmacro 'some-new-thing ()
426       (compatibility code))))
427 @end lisp
429 @noindent
430 This is often good for code that's only a fallback for compatibility
431 with other versions of Emacs.
433 @strong{Common Lisp Note:} At top level, @code{eval-when-compile} is analogous to the Common
434 Lisp idiom @code{(eval-when (compile eval) @dots{})}.  Elsewhere, the
435 Common Lisp @samp{#.} reader macro (but not when interpreting) is closer
436 to what @code{eval-when-compile} does.
437 @end defspec
439 @node Compiler Errors
440 @section Compiler Errors
441 @cindex compiler errors
443   Byte compilation outputs all errors and warnings into the buffer
444 @file{*Compile-Log*}.  The messages include file names and line
445 numbers that identify the location of the problem.  The usual Emacs
446 commands for operating on compiler diagnostics work properly on these
447 messages.
449   When an error is due to invalid syntax in the program, the byte
450 compiler might get confused about the errors' exact location.  One way
451 to investigate is to switch to the buffer @w{@file{ *Compiler Input*}}.
452 (This buffer name starts with a space, so it does not show up in
453 @kbd{M-x list-buffers}.)  This buffer contains the program being
454 compiled, and point shows how far the byte compiler was able to read;
455 the cause of the error might be nearby.  @xref{Syntax Errors}, for
456 some tips for locating syntax errors.
458   When the byte compiler warns about functions that were used but not
459 defined, it always reports the line number for the end of the file,
460 not the locations where the missing functions were called.  To find
461 the latter, you must search for the function names.
463   You can suppress the compiler warning for calling an undefined
464 function @var{func} by conditionalizing the function call on an
465 @code{fboundp} test, like this:
467 @example
468 (if (fboundp '@var{func}) ...(@var{func} ...)...)
469 @end example
471 @noindent
472 The call to @var{func} must be in the @var{then-form} of the
473 @code{if}, and @var{func} must appear quoted in the call to
474 @code{fboundp}.  (This feature operates for @code{cond} as well.)
476   You can tell the compiler that a function is defined using
477 @code{declare-function} (@pxref{Declaring Functions}).  Likewise, you
478 can tell the compiler that a variable is defined using @code{defvar}
479 with no initial value.
481   You can suppress the compiler warning for a specific use of an
482 undefined variable @var{variable} by conditionalizing its use on a
483 @code{boundp} test, like this:
485 @example
486 (if (boundp '@var{variable}) ...@var{variable}...)
487 @end example
489 @noindent
490 The reference to @var{variable} must be in the @var{then-form} of the
491 @code{if}, and @var{variable} must appear quoted in the call to
492 @code{boundp}.
494   You can suppress any and all compiler warnings within a certain
495 expression using the construct @code{with-no-warnings}:
497 @c This is implemented with a defun, but conceptually it is
498 @c a special form.
500 @defspec with-no-warnings body@dots{}
501 In execution, this is equivalent to @code{(progn @var{body}...)},
502 but the compiler does not issue warnings for anything that occurs
503 inside @var{body}.
505 We recommend that you use this construct around the smallest
506 possible piece of code, to avoid missing possible warnings other than
507 one you intend to suppress.
508 @end defspec
510   More precise control of warnings is possible by setting the variable
511 @code{byte-compile-warnings}.
513 @node Byte-Code Objects
514 @section Byte-Code Function Objects
515 @cindex compiled function
516 @cindex byte-code function
518   Byte-compiled functions have a special data type: they are
519 @dfn{byte-code function objects}.  Whenever such an object appears as
520 a function to be called, Emacs uses the byte-code interpreter to
521 execute the byte-code.
523   Internally, a byte-code function object is much like a vector; its
524 elements can be accessed using @code{aref}.  Its printed
525 representation is like that for a vector, with an additional @samp{#}
526 before the opening @samp{[}.  It must have at least four elements;
527 there is no maximum number, but only the first six elements have any
528 normal use.  They are:
530 @table @var
531 @item arglist
532 The list of argument symbols.
534 @item byte-code
535 The string containing the byte-code instructions.
537 @item constants
538 The vector of Lisp objects referenced by the byte code.  These include
539 symbols used as function names and variable names.
541 @item stacksize
542 The maximum stack size this function needs.
544 @item docstring
545 The documentation string (if any); otherwise, @code{nil}.  The value may
546 be a number or a list, in case the documentation string is stored in a
547 file.  Use the function @code{documentation} to get the real
548 documentation string (@pxref{Accessing Documentation}).
550 @item interactive
551 The interactive spec (if any).  This can be a string or a Lisp
552 expression.  It is @code{nil} for a function that isn't interactive.
553 @end table
555 Here's an example of a byte-code function object, in printed
556 representation.  It is the definition of the command
557 @code{backward-sexp}.
559 @example
560 #[(&optional arg)
561   "^H\204^F^@@\301^P\302^H[!\207"
562   [arg 1 forward-sexp]
563   2
564   254435
565   "^p"]
566 @end example
568   The primitive way to create a byte-code object is with
569 @code{make-byte-code}:
571 @defun make-byte-code &rest elements
572 This function constructs and returns a byte-code function object
573 with @var{elements} as its elements.
574 @end defun
576   You should not try to come up with the elements for a byte-code
577 function yourself, because if they are inconsistent, Emacs may crash
578 when you call the function.  Always leave it to the byte compiler to
579 create these objects; it makes the elements consistent (we hope).
581 @node Disassembly
582 @section Disassembled Byte-Code
583 @cindex disassembled byte-code
585   People do not write byte-code; that job is left to the byte
586 compiler.  But we provide a disassembler to satisfy a cat-like
587 curiosity.  The disassembler converts the byte-compiled code into
588 human-readable form.
590   The byte-code interpreter is implemented as a simple stack machine.
591 It pushes values onto a stack of its own, then pops them off to use them
592 in calculations whose results are themselves pushed back on the stack.
593 When a byte-code function returns, it pops a value off the stack and
594 returns it as the value of the function.
596   In addition to the stack, byte-code functions can use, bind, and set
597 ordinary Lisp variables, by transferring values between variables and
598 the stack.
600 @deffn Command disassemble object &optional buffer-or-name
601 This command displays the disassembled code for @var{object}.  In
602 interactive use, or if @var{buffer-or-name} is @code{nil} or omitted,
603 the output goes in a buffer named @file{*Disassemble*}.  If
604 @var{buffer-or-name} is non-@code{nil}, it must be a buffer or the
605 name of an existing buffer.  Then the output goes there, at point, and
606 point is left before the output.
608 The argument @var{object} can be a function name, a lambda expression
609 or a byte-code object.  If it is a lambda expression, @code{disassemble}
610 compiles it and disassembles the resulting compiled code.
611 @end deffn
613   Here are two examples of using the @code{disassemble} function.  We
614 have added explanatory comments to help you relate the byte-code to the
615 Lisp source; these do not appear in the output of @code{disassemble}.
617 @example
618 @group
619 (defun factorial (integer)
620   "Compute factorial of an integer."
621   (if (= 1 integer) 1
622     (* integer (factorial (1- integer)))))
623      @result{} factorial
624 @end group
626 @group
627 (factorial 4)
628      @result{} 24
629 @end group
631 @group
632 (disassemble 'factorial)
633      @print{} byte-code for factorial:
634  doc: Compute factorial of an integer.
635  args: (integer)
636 @end group
638 @group
639 0   varref   integer      ; @r{Get the value of @code{integer} and}
640                           ;   @r{push it onto the stack.}
641 1   constant 1            ; @r{Push 1 onto stack.}
642 @end group
643 @group
644 2   eqlsign               ; @r{Pop top two values off stack, compare}
645                           ;   @r{them, and push result onto stack.}
646 @end group
647 @group
648 3   goto-if-nil 1         ; @r{Pop and test top of stack;}
649                           ;   @r{if @code{nil}, go to 1, else continue.}
650 6   constant 1            ; @r{Push 1 onto top of stack.}
651 7   return                ; @r{Return the top element of the stack.}
652 @end group
653 @group
654 8:1 varref   integer      ; @r{Push value of @code{integer} onto stack.}
655 9   constant factorial    ; @r{Push @code{factorial} onto stack.}
656 10  varref   integer      ; @r{Push value of @code{integer} onto stack.}
657 11  sub1                  ; @r{Pop @code{integer}, decrement value,}
658                           ;   @r{push new value onto stack.}
659 12  call     1            ; @r{Call function @code{factorial} using first}
660                           ;   @r{(i.e. top) stack element as argument;}
661                           ;   @r{push returned value onto stack.}
662 @end group
663 @group
664 13 mult                   ; @r{Pop top two values off stack, multiply}
665                           ;   @r{them, and push result onto stack.}
666 14 return                 ; @r{Return the top element of the stack.}
667 @end group
668 @end example
670 The @code{silly-loop} function is somewhat more complex:
672 @example
673 @group
674 (defun silly-loop (n)
675   "Return time before and after N iterations of a loop."
676   (let ((t1 (current-time-string)))
677     (while (> (setq n (1- n))
678               0))
679     (list t1 (current-time-string))))
680      @result{} silly-loop
681 @end group
683 @group
684 (disassemble 'silly-loop)
685      @print{} byte-code for silly-loop:
686  doc: Return time before and after N iterations of a loop.
687  args: (n)
688 @end group
690 @group
691 0   constant current-time-string  ; @r{Push @code{current-time-string}}
692                                   ;   @r{onto top of stack.}
693 @end group
694 @group
695 1   call     0            ; @r{Call @code{current-time-string} with no}
696                           ;   @r{argument, push result onto stack.}
697 @end group
698 @group
699 2   varbind  t1           ; @r{Pop stack and bind @code{t1} to popped value.}
700 @end group
701 @group
702 3:1 varref   n            ; @r{Get value of @code{n} from the environment}
703                           ;   @r{and push the value on the stack.}
704 4   sub1                  ; @r{Subtract 1 from top of stack.}
705 @end group
706 @group
707 5   dup                   ; @r{Duplicate top of stack; i.e. copy the top}
708                           ;   @r{of the stack and push copy onto stack.}
709 6   varset   n            ; @r{Pop the top of the stack,}
710                           ;   @r{and bind @code{n} to the value.}
712 ;; @r{(In effect, the sequence @code{dup varset} copies the top of the stack}
713 ;; @r{into the value of @code{n} without popping it.)}
714 @end group
716 @group
717 7   constant 0            ; @r{Push 0 onto stack.}
718 8   gtr                   ; @r{Pop top two values off stack,}
719                           ;   @r{test if @var{n} is greater than 0}
720                           ;   @r{and push result onto stack.}
721 @end group
722 @group
723 9   goto-if-not-nil 1     ; @r{Goto 1 if @code{n} > 0}
724                           ;   @r{(this continues the while loop)}
725                           ;   @r{else continue.}
726 @end group
727 @group
728 12  varref   t1           ; @r{Push value of @code{t1} onto stack.}
729 13  constant current-time-string  ; @r{Push @code{current-time-string}}
730                                   ;   @r{onto the top of the stack.}
731 14  call     0            ; @r{Call @code{current-time-string} again.}
732 @end group
733 @group
734 15  unbind   1            ; @r{Unbind @code{t1} in local environment.}
735 16  list2                 ; @r{Pop top two elements off stack, create a}
736                           ;   @r{list of them, and push it onto stack.}
737 17  return                ; @r{Return value of the top of stack.}
738 @end group
739 @end example