annotate lispref/compile.texi @ 35926:d2997845573f

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