Fix a comment whitespace typo.
[emacs.git] / doc / lispref / compile.texi
blob201d9fc2fa5eeb17cdaab407a05f08a06567cc85
1 @c -*-texinfo-*-
2 @c This is part of the GNU Emacs Lisp Reference Manual.
3 @c Copyright (C) 1990-1994, 2001-2017 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 @vindex byte-compile-debug
92   Sometimes, the byte compiler produces warning and/or error messages
93 (@pxref{Compiler Errors}, for details).  These messages are normally
94 recorded in a buffer called @file{*Compile-Log*}, which uses
95 Compilation mode.  @xref{Compilation Mode,,,emacs, The GNU Emacs
96 Manual}.  However, if the variable @code{byte-compile-debug} is
97 non-nil, error message will be signaled as Lisp errors instead
98 (@pxref{Errors}).
100 @cindex macro compilation
101   Be careful when writing macro calls in files that you intend to
102 byte-compile.  Since macro calls are expanded when they are compiled,
103 the macros need to be loaded into Emacs or the byte compiler will not
104 do the right thing.  The usual way to handle this is with
105 @code{require} forms which specify the files containing the needed
106 macro definitions (@pxref{Named Features}).  Normally, the
107 byte compiler does not evaluate the code that it is compiling, but it
108 handles @code{require} forms specially, by loading the specified
109 libraries.  To avoid loading the macro definition files when someone
110 @emph{runs} the compiled program, write @code{eval-when-compile}
111 around the @code{require} calls (@pxref{Eval During Compile}).  For
112 more details, @xref{Compiling Macros}.
114   Inline (@code{defsubst}) functions are less troublesome; if you
115 compile a call to such a function before its definition is known, the
116 call will still work right, it will just run slower.
118 @defun byte-compile symbol
119 This function byte-compiles the function definition of @var{symbol},
120 replacing the previous definition with the compiled one.  The function
121 definition of @var{symbol} must be the actual code for the function;
122 @code{byte-compile} does not handle function indirection.  The return
123 value is the byte-code function object which is the compiled
124 definition of @var{symbol} (@pxref{Byte-Code Objects}).
126 @example
127 @group
128 (defun factorial (integer)
129   "Compute factorial of INTEGER."
130   (if (= 1 integer) 1
131     (* integer (factorial (1- integer)))))
132 @result{} factorial
133 @end group
135 @group
136 (byte-compile 'factorial)
137 @result{}
138 #[(integer)
139   "^H\301U\203^H^@@\301\207\302^H\303^HS!\"\207"
140   [integer 1 * factorial]
141   4 "Compute factorial of INTEGER."]
142 @end group
143 @end example
145 If @var{symbol}'s definition is a byte-code function object,
146 @code{byte-compile} does nothing and returns @code{nil}.  It does not
147 compile the symbol's definition again, since the original
148 (non-compiled) code has already been replaced in the symbol's function
149 cell by the byte-compiled code.
151 The argument to @code{byte-compile} can also be a @code{lambda}
152 expression.  In that case, the function returns the corresponding
153 compiled code but does not store it anywhere.
154 @end defun
156 @deffn Command compile-defun &optional arg
157 This command reads the defun containing point, compiles it, and
158 evaluates the result.  If you use this on a defun that is actually a
159 function definition, the effect is to install a compiled version of that
160 function.
162 @code{compile-defun} normally displays the result of evaluation in the
163 echo area, but if @var{arg} is non-@code{nil}, it inserts the result
164 in the current buffer after the form it compiled.
165 @end deffn
167 @deffn Command byte-compile-file filename &optional load
168 This function compiles a file of Lisp code named @var{filename} into a
169 file of byte-code.  The output file's name is made by changing the
170 @samp{.el} suffix into @samp{.elc}; if @var{filename} does not end in
171 @samp{.el}, it adds @samp{.elc} to the end of @var{filename}.
173 Compilation works by reading the input file one form at a time.  If it
174 is a definition of a function or macro, the compiled function or macro
175 definition is written out.  Other forms are batched together, then each
176 batch is compiled, and written so that its compiled code will be
177 executed when the file is read.  All comments are discarded when the
178 input file is read.
180 This command returns @code{t} if there were no errors and @code{nil}
181 otherwise.  When called interactively, it prompts for the file name.
183 If @var{load} is non-@code{nil}, this command loads the compiled file
184 after compiling it.  Interactively, @var{load} is the prefix argument.
186 @example
187 @group
188 $ ls -l push*
189 -rw-r--r-- 1 lewis lewis 791 Oct  5 20:31 push.el
190 @end group
192 @group
193 (byte-compile-file "~/emacs/push.el")
194      @result{} t
195 @end group
197 @group
198 $ ls -l push*
199 -rw-r--r-- 1 lewis lewis 791 Oct  5 20:31 push.el
200 -rw-rw-rw- 1 lewis lewis 638 Oct  8 20:25 push.elc
201 @end group
202 @end example
203 @end deffn
205 @deffn Command byte-recompile-directory directory &optional flag force
206 @cindex library compilation
207 This command recompiles every @samp{.el} file in @var{directory} (or
208 its subdirectories) that needs recompilation.  A file needs
209 recompilation if a @samp{.elc} file exists but is older than the
210 @samp{.el} file.
212 When a @samp{.el} file has no corresponding @samp{.elc} file,
213 @var{flag} says what to do.  If it is @code{nil}, this command ignores
214 these files.  If @var{flag} is 0, it compiles them.  If it is neither
215 @code{nil} nor 0, it asks the user whether to compile each such file,
216 and asks about each subdirectory as well.
218 Interactively, @code{byte-recompile-directory} prompts for
219 @var{directory} and @var{flag} is the prefix argument.
221 If @var{force} is non-@code{nil}, this command recompiles every
222 @samp{.el} file that has a @samp{.elc} file.
224 The returned value is unpredictable.
225 @end deffn
227 @defun batch-byte-compile &optional noforce
228 This function runs @code{byte-compile-file} on files specified on the
229 command line.  This function must be used only in a batch execution of
230 Emacs, as it kills Emacs on completion.  An error in one file does not
231 prevent processing of subsequent files, but no output file will be
232 generated for it, and the Emacs process will terminate with a nonzero
233 status code.
235 If @var{noforce} is non-@code{nil}, this function does not recompile
236 files that have an up-to-date @samp{.elc} file.
238 @example
239 $ emacs -batch -f batch-byte-compile *.el
240 @end example
241 @end defun
243 @node Docs and Compilation
244 @section Documentation Strings and Compilation
245 @cindex dynamic loading of documentation
247   When Emacs loads functions and variables from a byte-compiled file,
248 it normally does not load their documentation strings into memory.
249 Each documentation string is dynamically loaded from the
250 byte-compiled file only when needed.  This saves memory, and speeds up
251 loading by skipping the processing of the documentation strings.
253   This feature has a drawback: if you delete, move, or alter the
254 compiled file (such as by compiling a new version), Emacs may no
255 longer be able to access the documentation string of previously-loaded
256 functions or variables.  Such a problem normally only occurs if you
257 build Emacs yourself, and happen to edit and/or recompile the Lisp
258 source files.  To solve it, just reload each file after recompilation.
260   Dynamic loading of documentation strings from byte-compiled files is
261 determined, at compile time, for each byte-compiled file.  It can be
262 disabled via the option @code{byte-compile-dynamic-docstrings}.
264 @defopt byte-compile-dynamic-docstrings
265 If this is non-@code{nil}, the byte compiler generates compiled files
266 that are set up for dynamic loading of documentation strings.
268 To disable the dynamic loading feature for a specific file, set this
269 option to @code{nil} in its header line (@pxref{File Variables, ,
270 Local Variables in Files, emacs, The GNU Emacs Manual}), like this:
272 @smallexample
273 -*-byte-compile-dynamic-docstrings: nil;-*-
274 @end smallexample
276 This is useful mainly if you expect to change the file, and you want
277 Emacs sessions that have already loaded it to keep working when the
278 file changes.
279 @end defopt
281 @cindex @samp{#@@@var{count}}
282 @cindex @samp{#$}
283 Internally, the dynamic loading of documentation strings is
284 accomplished by writing compiled files with a special Lisp reader
285 construct, @samp{#@@@var{count}}.  This construct skips the next
286 @var{count} characters.  It also uses the @samp{#$} construct, which
287 stands for the name of this file, as a string.  Do not use these
288 constructs in Lisp source files; they are not designed to be clear to
289 humans reading the file.
291 @node Dynamic Loading
292 @section Dynamic Loading of Individual Functions
294 @cindex dynamic loading of functions
295 @cindex lazy loading
296   When you compile a file, you can optionally enable the @dfn{dynamic
297 function loading} feature (also known as @dfn{lazy loading}).  With
298 dynamic function loading, loading the file doesn't fully read the
299 function definitions in the file.  Instead, each function definition
300 contains a place-holder which refers to the file.  The first time each
301 function is called, it reads the full definition from the file, to
302 replace the place-holder.
304   The advantage of dynamic function loading is that loading the file
305 becomes much faster.  This is a good thing for a file which contains
306 many separate user-callable functions, if using one of them does not
307 imply you will probably also use the rest.  A specialized mode which
308 provides many keyboard commands often has that usage pattern: a user may
309 invoke the mode, but use only a few of the commands it provides.
311   The dynamic loading feature has certain disadvantages:
313 @itemize @bullet
314 @item
315 If you delete or move the compiled file after loading it, Emacs can no
316 longer load the remaining function definitions not already loaded.
318 @item
319 If you alter the compiled file (such as by compiling a new version),
320 then trying to load any function not already loaded will usually yield
321 nonsense results.
322 @end itemize
324   These problems will never happen in normal circumstances with
325 installed Emacs files.  But they are quite likely to happen with Lisp
326 files that you are changing.  The easiest way to prevent these problems
327 is to reload the new compiled file immediately after each recompilation.
329   The byte compiler uses the dynamic function loading feature if the
330 variable @code{byte-compile-dynamic} is non-@code{nil} at compilation
331 time.  Do not set this variable globally, since dynamic loading is
332 desirable only for certain files.  Instead, enable the feature for
333 specific source files with file-local variable bindings.  For example,
334 you could do it by writing this text in the source file's first line:
336 @example
337 -*-byte-compile-dynamic: t;-*-
338 @end example
340 @defvar byte-compile-dynamic
341 If this is non-@code{nil}, the byte compiler generates compiled files
342 that are set up for dynamic function loading.
343 @end defvar
345 @defun fetch-bytecode function
346 If @var{function} is a byte-code function object, this immediately
347 finishes loading the byte code of @var{function} from its
348 byte-compiled file, if it is not fully loaded already.  Otherwise,
349 it does nothing.  It always returns @var{function}.
350 @end defun
352 @node Eval During Compile
353 @section Evaluation During Compilation
354 @cindex eval during compilation
356   These features permit you to write code to be evaluated during
357 compilation of a program.
359 @defspec eval-and-compile body@dots{}
360 This form marks @var{body} to be evaluated both when you compile the
361 containing code and when you run it (whether compiled or not).
363 You can get a similar result by putting @var{body} in a separate file
364 and referring to that file with @code{require}.  That method is
365 preferable when @var{body} is large.  Effectively @code{require} is
366 automatically @code{eval-and-compile}, the package is loaded both when
367 compiling and executing.
369 @code{autoload} is also effectively @code{eval-and-compile} too.  It's
370 recognized when compiling, so uses of such a function don't produce
371 ``not known to be defined'' warnings.
373 Most uses of @code{eval-and-compile} are fairly sophisticated.
375 If a macro has a helper function to build its result, and that macro
376 is used both locally and outside the package, then
377 @code{eval-and-compile} should be used to get the helper both when
378 compiling and then later when running.
380 If functions are defined programmatically (with @code{fset} say), then
381 @code{eval-and-compile} can be used to have that done at compile-time
382 as well as run-time, so calls to those functions are checked (and
383 warnings about ``not known to be defined'' suppressed).
384 @end defspec
386 @defspec eval-when-compile body@dots{}
387 This form marks @var{body} to be evaluated at compile time but not when
388 the compiled program is loaded.  The result of evaluation by the
389 compiler becomes a constant which appears in the compiled program.  If
390 you load the source file, rather than compiling it, @var{body} is
391 evaluated normally.
393 @cindex compile-time constant
394 If you have a constant that needs some calculation to produce,
395 @code{eval-when-compile} can do that at compile-time.  For example,
397 @lisp
398 (defvar my-regexp
399   (eval-when-compile (regexp-opt '("aaa" "aba" "abb"))))
400 @end lisp
402 @cindex macros, at compile time
403 If you're using another package, but only need macros from it (the
404 byte compiler will expand those), then @code{eval-when-compile} can be
405 used to load it for compiling, but not executing.  For example,
407 @lisp
408 (eval-when-compile
409   (require 'my-macro-package))
410 @end lisp
412 The same sort of thing goes for macros and @code{defsubst} functions
413 defined locally and only for use within the file.  They are needed for
414 compiling the file, but in most cases they are not needed for
415 execution of the compiled file.  For example,
417 @lisp
418 (eval-when-compile
419   (unless (fboundp 'some-new-thing)
420     (defmacro 'some-new-thing ()
421       (compatibility code))))
422 @end lisp
424 @noindent
425 This is often good for code that's only a fallback for compatibility
426 with other versions of Emacs.
428 @strong{Common Lisp Note:} At top level, @code{eval-when-compile} is analogous to the Common
429 Lisp idiom @code{(eval-when (compile eval) @dots{})}.  Elsewhere, the
430 Common Lisp @samp{#.} reader macro (but not when interpreting) is closer
431 to what @code{eval-when-compile} does.
432 @end defspec
434 @node Compiler Errors
435 @section Compiler Errors
436 @cindex compiler errors
438   Error and warning messages from byte compilation are printed in a
439 buffer named @file{*Compile-Log*}.  These messages include file names
440 and line numbers identifying the location of the problem.  The usual
441 Emacs commands for operating on compiler output can be used on these
442 messages.
444   When an error is due to invalid syntax in the program, the byte
445 compiler might get confused about the error's exact location.  One way
446 to investigate is to switch to the buffer @w{@file{ *Compiler
447 Input*}}.  (This buffer name starts with a space, so it does not show
448 up in the Buffer Menu.)  This buffer contains the program being
449 compiled, and point shows how far the byte compiler was able to read;
450 the cause of the error might be nearby.  @xref{Syntax Errors}, for
451 some tips for locating syntax errors.
453   A common type of warning issued by the byte compiler is for
454 functions and variables that were used but not defined.  Such warnings
455 report the line number for the end of the file, not the locations
456 where the missing functions or variables were used; to find these, you
457 must search the file manually.
459   If you are sure that a warning message about a missing function or
460 variable is unjustified, there are several ways to suppress it:
462 @itemize @bullet
463 @item
464 You can suppress the warning for a specific call to a function
465 @var{func} by conditionalizing it on an @code{fboundp} test, like
466 this:
468 @example
469 (if (fboundp '@var{func}) ...(@var{func} ...)...)
470 @end example
472 @noindent
473 The call to @var{func} must be in the @var{then-form} of the
474 @code{if}, and @var{func} must appear quoted in the call to
475 @code{fboundp}.  (This feature operates for @code{cond} as well.)
477 @item
478 Likewise, you can suppress the warning for a specific use of a
479 variable @var{variable} by conditionalizing it on a @code{boundp}
480 test:
482 @example
483 (if (boundp '@var{variable}) ...@var{variable}...)
484 @end example
486 @noindent
487 The reference to @var{variable} must be in the @var{then-form} of the
488 @code{if}, and @var{variable} must appear quoted in the call to
489 @code{boundp}.
491 @item
492 You can tell the compiler that a function is defined using
493 @code{declare-function}. @xref{Declaring Functions}.
495 @item
496 Likewise, you can tell the compiler that a variable is defined using
497 @code{defvar} with no initial value.  (Note that this marks the
498 variable as special.)  @xref{Defining Variables}.
499 @end itemize
501   You can also suppress any and all compiler warnings within a certain
502 expression using the construct @code{with-no-warnings}:
504 @c This is implemented with a defun, but conceptually it is
505 @c a special form.
507 @defspec with-no-warnings body@dots{}
508 In execution, this is equivalent to @code{(progn @var{body}...)},
509 but the compiler does not issue warnings for anything that occurs
510 inside @var{body}.
512 We recommend that you use this construct around the smallest
513 possible piece of code, to avoid missing possible warnings other than
514 one you intend to suppress.
515 @end defspec
517   Byte compiler warnings can be controlled more precisely by setting
518 the variable @code{byte-compile-warnings}.  See its documentation
519 string for details.
521 @node Byte-Code Objects
522 @section Byte-Code Function Objects
523 @cindex compiled function
524 @cindex byte-code function
525 @cindex byte-code object
527   Byte-compiled functions have a special data type: they are
528 @dfn{byte-code function objects}.  Whenever such an object appears as
529 a function to be called, Emacs uses the byte-code interpreter to
530 execute the byte-code.
532   Internally, a byte-code function object is much like a vector; its
533 elements can be accessed using @code{aref}.  Its printed
534 representation is like that for a vector, with an additional @samp{#}
535 before the opening @samp{[}.  It must have at least four elements;
536 there is no maximum number, but only the first six elements have any
537 normal use.  They are:
539 @table @var
540 @item argdesc
541 The descriptor of the arguments.  This can either be a list of
542 arguments, as described in @ref{Argument List}, or an integer encoding
543 the required number of arguments.  In the latter case, the value of
544 the descriptor specifies the minimum number of arguments in the bits
545 zero to 6, and the maximum number of arguments in bits 8 to 14.  If
546 the argument list uses @code{&rest}, then bit 7 is set; otherwise it's
547 cleared.
549 If @var{argdesc} is a list, the arguments will be dynamically bound
550 before executing the byte code.  If @var{argdesc} is an integer, the
551 arguments will be instead pushed onto the stack of the byte-code
552 interpreter, before executing the code.
554 @item byte-code
555 The string containing the byte-code instructions.
557 @item constants
558 The vector of Lisp objects referenced by the byte code.  These include
559 symbols used as function names and variable names.
561 @item stacksize
562 The maximum stack size this function needs.
564 @item docstring
565 The documentation string (if any); otherwise, @code{nil}.  The value may
566 be a number or a list, in case the documentation string is stored in a
567 file.  Use the function @code{documentation} to get the real
568 documentation string (@pxref{Accessing Documentation}).
570 @item interactive
571 The interactive spec (if any).  This can be a string or a Lisp
572 expression.  It is @code{nil} for a function that isn't interactive.
573 @end table
575 Here's an example of a byte-code function object, in printed
576 representation.  It is the definition of the command
577 @code{backward-sexp}.
579 @example
580 #[256
581   "\211\204^G^@@\300\262^A\301^A[!\207"
582   [1 forward-sexp]
583   3
584   1793299
585   "^p"]
586 @end example
588   The primitive way to create a byte-code object is with
589 @code{make-byte-code}:
591 @defun make-byte-code &rest elements
592 This function constructs and returns a byte-code function object
593 with @var{elements} as its elements.
594 @end defun
596   You should not try to come up with the elements for a byte-code
597 function yourself, because if they are inconsistent, Emacs may crash
598 when you call the function.  Always leave it to the byte compiler to
599 create these objects; it makes the elements consistent (we hope).
601 @node Disassembly
602 @section Disassembled Byte-Code
603 @cindex disassembled byte-code
605   People do not write byte-code; that job is left to the byte
606 compiler.  But we provide a disassembler to satisfy a cat-like
607 curiosity.  The disassembler converts the byte-compiled code into
608 human-readable form.
610   The byte-code interpreter is implemented as a simple stack machine.
611 It pushes values onto a stack of its own, then pops them off to use them
612 in calculations whose results are themselves pushed back on the stack.
613 When a byte-code function returns, it pops a value off the stack and
614 returns it as the value of the function.
616   In addition to the stack, byte-code functions can use, bind, and set
617 ordinary Lisp variables, by transferring values between variables and
618 the stack.
620 @deffn Command disassemble object &optional buffer-or-name
621 This command displays the disassembled code for @var{object}.  In
622 interactive use, or if @var{buffer-or-name} is @code{nil} or omitted,
623 the output goes in a buffer named @file{*Disassemble*}.  If
624 @var{buffer-or-name} is non-@code{nil}, it must be a buffer or the
625 name of an existing buffer.  Then the output goes there, at point, and
626 point is left before the output.
628 The argument @var{object} can be a function name, a lambda expression
629 (@pxref{Lambda Expressions}), or a byte-code object (@pxref{Byte-Code
630 Objects}).  If it is a lambda expression, @code{disassemble} compiles
631 it and disassembles the resulting compiled code.
632 @end deffn
634   Here are two examples of using the @code{disassemble} function.  We
635 have added explanatory comments to help you relate the byte-code to the
636 Lisp source; these do not appear in the output of @code{disassemble}.
638 @example
639 @group
640 (defun factorial (integer)
641   "Compute factorial of an integer."
642   (if (= 1 integer) 1
643     (* integer (factorial (1- integer)))))
644      @result{} factorial
645 @end group
647 @group
648 (factorial 4)
649      @result{} 24
650 @end group
652 @group
653 (disassemble 'factorial)
654      @print{} byte-code for factorial:
655  doc: Compute factorial of an integer.
656  args: (integer)
657 @end group
659 @group
660 0   varref   integer      ; @r{Get the value of @code{integer} and}
661                           ;   @r{push it onto the stack.}
662 1   constant 1            ; @r{Push 1 onto stack.}
663 @end group
664 @group
665 2   eqlsign               ; @r{Pop top two values off stack, compare}
666                           ;   @r{them, and push result onto stack.}
667 @end group
668 @group
669 3   goto-if-nil 1         ; @r{Pop and test top of stack;}
670                           ;   @r{if @code{nil}, go to 1, else continue.}
671 6   constant 1            ; @r{Push 1 onto top of stack.}
672 7   return                ; @r{Return the top element of the stack.}
673 @end group
674 @group
675 8:1 varref   integer      ; @r{Push value of @code{integer} onto stack.}
676 9   constant factorial    ; @r{Push @code{factorial} onto stack.}
677 10  varref   integer      ; @r{Push value of @code{integer} onto stack.}
678 11  sub1                  ; @r{Pop @code{integer}, decrement value,}
679                           ;   @r{push new value onto stack.}
680 12  call     1            ; @r{Call function @code{factorial} using first}
681                           ;   @r{(i.e., top) stack element as argument;}
682                           ;   @r{push returned value onto stack.}
683 @end group
684 @group
685 13 mult                   ; @r{Pop top two values off stack, multiply}
686                           ;   @r{them, and push result onto stack.}
687 14 return                 ; @r{Return the top element of the stack.}
688 @end group
689 @end example
691 The @code{silly-loop} function is somewhat more complex:
693 @example
694 @group
695 (defun silly-loop (n)
696   "Return time before and after N iterations of a loop."
697   (let ((t1 (current-time-string)))
698     (while (> (setq n (1- n))
699               0))
700     (list t1 (current-time-string))))
701      @result{} silly-loop
702 @end group
704 @group
705 (disassemble 'silly-loop)
706      @print{} byte-code for silly-loop:
707  doc: Return time before and after N iterations of a loop.
708  args: (n)
709 @end group
711 @group
712 0   constant current-time-string  ; @r{Push @code{current-time-string}}
713                                   ;   @r{onto top of stack.}
714 @end group
715 @group
716 1   call     0            ; @r{Call @code{current-time-string} with no}
717                           ;   @r{argument, push result onto stack.}
718 @end group
719 @group
720 2   varbind  t1           ; @r{Pop stack and bind @code{t1} to popped value.}
721 @end group
722 @group
723 3:1 varref   n            ; @r{Get value of @code{n} from the environment}
724                           ;   @r{and push the value on the stack.}
725 4   sub1                  ; @r{Subtract 1 from top of stack.}
726 @end group
727 @group
728 5   dup                   ; @r{Duplicate top of stack; i.e., copy the top}
729                           ;   @r{of the stack and push copy onto stack.}
730 6   varset   n            ; @r{Pop the top of the stack,}
731                           ;   @r{and bind @code{n} to the value.}
733 ;; @r{(In effect, the sequence @code{dup varset} copies the top of the stack}
734 ;; @r{into the value of @code{n} without popping it.)}
735 @end group
737 @group
738 7   constant 0            ; @r{Push 0 onto stack.}
739 8   gtr                   ; @r{Pop top two values off stack,}
740                           ;   @r{test if @var{n} is greater than 0}
741                           ;   @r{and push result onto stack.}
742 @end group
743 @group
744 9   goto-if-not-nil 1     ; @r{Goto 1 if @code{n} > 0}
745                           ;   @r{(this continues the while loop)}
746                           ;   @r{else continue.}
747 @end group
748 @group
749 12  varref   t1           ; @r{Push value of @code{t1} onto stack.}
750 13  constant current-time-string  ; @r{Push @code{current-time-string}}
751                                   ;   @r{onto the top of the stack.}
752 14  call     0            ; @r{Call @code{current-time-string} again.}
753 @end group
754 @group
755 15  unbind   1            ; @r{Unbind @code{t1} in local environment.}
756 16  list2                 ; @r{Pop top two elements off stack, create a}
757                           ;   @r{list of them, and push it onto stack.}
758 17  return                ; @r{Return value of the top of stack.}
759 @end group
760 @end example