Mercurial > emacs
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 |
rev | line source |
---|---|
5945 | 1 @c -*-texinfo-*- |
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 | 4 @c See the file elisp.texi for copying conditions. |
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 | 7 @chapter Byte Compilation |
8 @cindex byte-code | |
9 @cindex compilation | |
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 | 12 in Lisp into a special representation called @dfn{byte-code} that can be |
13 executed more efficiently. The compiler replaces Lisp function | |
14 definitions with byte-code. When a byte-code function is called, its | |
15 definition is evaluated by the @dfn{byte-code interpreter}. | |
16 | |
17 Because the byte-compiled code is evaluated by the byte-code | |
18 interpreter, instead of being executed directly by the machine's | |
19 hardware (as true compiled code is), byte-code is completely | |
20 transportable from machine to machine without recompilation. It is not, | |
21 however, as fast as true compiled code. | |
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 | 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 | 34 @iftex |
35 @xref{Docs and Compilation}. | |
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 | 41 |
42 @xref{Compilation Errors}, for how to investigate errors occurring in | |
43 byte compilation. | |
44 | |
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 | 47 * Compilation Functions:: Byte compilation functions. |
12067 | 48 * Docs and Compilation:: Dynamic loading of documentation strings. |
49 * Dynamic Loading:: Dynamic loading of individual functions. | |
5945 | 50 * Eval During Compile:: Code to be evaluated when you compile. |
51 * Byte-Code Objects:: The data type used for byte-compiled functions. | |
52 * Disassembly:: Disassembling byte-code; how to read byte-code. | |
53 @end menu | |
54 | |
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 | 95 @node Compilation Functions |
96 @comment node-name, next, previous, up | |
97 @section The Compilation Functions | |
98 @cindex compilation functions | |
99 | |
100 You can byte-compile an individual function or macro definition with | |
101 the @code{byte-compile} function. You can compile a whole file with | |
102 @code{byte-compile-file}, or several files with | |
103 @code{byte-recompile-directory} or @code{batch-byte-compile}. | |
104 | |
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 | 108 |
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 | 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 | 116 load the file. But it does execute any @code{require} calls at top |
117 level in the file. One way to ensure that necessary macro definitions | |
118 are available during compilation is to require the file that defines | |
119 them (@pxref{Named Features}). To avoid loading the macro definition files | |
120 when someone @emph{runs} the compiled program, write | |
121 @code{eval-when-compile} around the @code{require} calls (@pxref{Eval | |
122 During Compile}). | |
5945 | 123 |
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 | 126 replacing the previous definition with the compiled one. The function |
127 definition of @var{symbol} must be the actual code for the function; | |
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 | 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 | 137 |
138 @example | |
139 @group | |
140 (defun factorial (integer) | |
141 "Compute factorial of INTEGER." | |
142 (if (= 1 integer) 1 | |
143 (* integer (factorial (1- integer))))) | |
6452
8c7032348e93
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5945
diff
changeset
|
144 @result{} factorial |
5945 | 145 @end group |
146 | |
147 @group | |
148 (byte-compile 'factorial) | |
6452
8c7032348e93
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
5945
diff
changeset
|
149 @result{} |
5945 | 150 #[(integer) |
151 "^H\301U\203^H^@@\301\207\302^H\303^HS!\"\207" | |
152 [integer 1 * factorial] | |
153 4 "Compute factorial of INTEGER."] | |
154 @end group | |
155 @end example | |
156 | |
157 @noindent | |
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 | 163 @end defun |
164 | |
165 @deffn Command compile-defun | |
166 This command reads the defun containing point, compiles it, and | |
167 evaluates the result. If you use this on a defun that is actually a | |
168 function definition, the effect is to install a compiled version of that | |
169 function. | |
170 @end deffn | |
171 | |
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 | 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 | 179 is a definition of a function or macro, the compiled function or macro |
180 definition is written out. Other forms are batched together, then each | |
181 batch is compiled, and written so that its compiled code will be | |
182 executed when the file is read. All comments are discarded when the | |
183 input file is read. | |
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 | 186 for the file name. |
187 | |
188 @example | |
189 @group | |
190 % ls -l push* | |
191 -rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el | |
192 @end group | |
193 | |
194 @group | |
195 (byte-compile-file "~/emacs/push.el") | |
196 @result{} t | |
197 @end group | |
198 | |
199 @group | |
200 % ls -l push* | |
201 -rw-r--r-- 1 lewis 791 Oct 5 20:31 push.el | |
202 -rw-rw-rw- 1 lewis 638 Oct 8 20:25 push.elc | |
203 @end group | |
204 @end example | |
205 @end deffn | |
206 | |
207 @deffn Command byte-recompile-directory directory flag | |
208 @cindex library compilation | |
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 | 210 needs recompilation. A file needs recompilation if a @samp{.elc} file |
211 exists but is older than the @samp{.el} file. | |
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 | 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 | 218 @end deffn |
219 | |
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 | 227 |
228 @example | |
229 % emacs -batch -f batch-byte-compile *.el | |
230 @end example | |
231 @end defun | |
232 | |
233 @defun byte-code code-string data-vector max-stack | |
234 @cindex byte-code interpreter | |
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 | 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 | 238 valid calls to this function. |
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 | 244 @end defun |
245 | |
12067 | 246 @node Docs and Compilation |
247 @section Documentation Strings and Compilation | |
248 @cindex dynamic loading of documentation | |
249 | |
250 Functions and variables loaded from a byte-compiled file access their | |
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 | 253 documentation strings themselves need not be processed while loading the |
254 file. Actual access to the documentation strings becomes slower as a | |
255 result, but this normally is not enough to bother users. | |
256 | |
257 Dynamic access to documentation strings does have drawbacks: | |
258 | |
259 @itemize @bullet | |
260 @item | |
261 If you delete or move the compiled file after loading it, Emacs can no | |
262 longer access the documentation strings for the functions and variables | |
263 in the file. | |
264 | |
265 @item | |
266 If you alter the compiled file (such as by compiling a new version), | |
267 then further access to documentation strings in this file will give | |
268 nonsense results. | |
269 @end itemize | |
270 | |
271 If your site installs Emacs following the usual procedures, these | |
272 problems will never normally occur. Installing a new version uses a new | |
273 directory with a different name; as long as the old version remains | |
274 installed, its files will remain unmodified in the places where they are | |
275 expected to be. | |
276 | |
12124 | 277 However, if you have built Emacs yourself and use it from the |
12067 | 278 directory where you built it, you will experience this problem |
279 occasionally if you edit and recompile Lisp files. When it happens, you | |
280 can cure the problem by reloading the file after recompiling it. | |
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 | 290 |
291 @example | |
292 -*-byte-compile-dynamic-docstrings: nil;-*- | |
293 @end example | |
294 | |
295 @defvar byte-compile-dynamic-docstrings | |
296 If this is non-@code{nil}, the byte compiler generates compiled files | |
297 that are set up for dynamic loading of documentation strings. | |
298 @end defvar | |
299 | |
300 @cindex @samp{#@@@var{count}} | |
301 @cindex @samp{#$} | |
302 The dynamic documentation string feature writes compiled files that | |
303 use a special Lisp reader construct, @samp{#@@@var{count}}. This | |
304 construct skips the next @var{count} characters. It also uses the | |
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 | 309 |
310 @node Dynamic Loading | |
311 @section Dynamic Loading of Individual Functions | |
312 | |
313 @cindex dynamic loading of functions | |
314 @cindex lazy loading | |
315 When you compile a file, you can optionally enable the @dfn{dynamic | |
316 function loading} feature (also known as @dfn{lazy loading}). With | |
317 dynamic function loading, loading the file doesn't fully read the | |
318 function definitions in the file. Instead, each function definition | |
319 contains a place-holder which refers to the file. The first time each | |
320 function is called, it reads the full definition from the file, to | |
321 replace the place-holder. | |
322 | |
323 The advantage of dynamic function loading is that loading the file | |
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 | 329 |
330 The dynamic loading feature has certain disadvantages: | |
331 | |
332 @itemize @bullet | |
333 @item | |
334 If you delete or move the compiled file after loading it, Emacs can no | |
335 longer load the remaining function definitions not already loaded. | |
336 | |
337 @item | |
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 | 340 results. |
341 @end itemize | |
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 | 347 |
348 The byte compiler uses the dynamic function loading feature if the | |
349 variable @code{byte-compile-dynamic} is non-@code{nil} at compilation | |
350 time. Do not set this variable globally, since dynamic loading is | |
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 | 354 |
355 @example | |
356 -*-byte-compile-dynamic: t;-*- | |
357 @end example | |
358 | |
359 @defvar byte-compile-dynamic | |
360 If this is non-@code{nil}, the byte compiler generates compiled files | |
361 that are set up for dynamic function loading. | |
362 @end defvar | |
363 | |
364 @defun fetch-bytecode function | |
365 This immediately finishes loading the definition of @var{function} from | |
366 its byte-compiled file, if it is not fully loaded already. The argument | |
367 @var{function} may be a byte-code function object or a function name. | |
368 @end defun | |
369 | |
5945 | 370 @node Eval During Compile |
371 @section Evaluation During Compilation | |
372 | |
12067 | 373 These features permit you to write code to be evaluated during |
5945 | 374 compilation of a program. |
375 | |
376 @defspec eval-and-compile body | |
377 This form marks @var{body} to be evaluated both when you compile the | |
378 containing code and when you run it (whether compiled or not). | |
379 | |
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 | 383 @end defspec |
384 | |
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 | 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 | 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 | 396 @end defspec |
397 | |
398 @node Byte-Code Objects | |
12098 | 399 @section Byte-Code Function Objects |
5945 | 400 @cindex compiled function |
401 @cindex byte-code function | |
402 | |
403 Byte-compiled functions have a special data type: they are | |
404 @dfn{byte-code function objects}. | |
405 | |
406 Internally, a byte-code function object is much like a vector; | |
407 however, the evaluator handles this data type specially when it appears | |
408 as a function to be called. The printed representation for a byte-code | |
409 function object is like that for a vector, with an additional @samp{#} | |
410 before the opening @samp{[}. | |
411 | |
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 | 414 They are: |
415 | |
416 @table @var | |
417 @item arglist | |
418 The list of argument symbols. | |
419 | |
420 @item byte-code | |
421 The string containing the byte-code instructions. | |
422 | |
423 @item constants | |
7212 | 424 The vector of Lisp objects referenced by the byte code. These include |
425 symbols used as function names and variable names. | |
5945 | 426 |
427 @item stacksize | |
428 The maximum stack size this function needs. | |
429 | |
430 @item docstring | |
12098 | 431 The documentation string (if any); otherwise, @code{nil}. The value may |
432 be a number or a list, in case the documentation string is stored in a | |
433 file. Use the function @code{documentation} to get the real | |
434 documentation string (@pxref{Accessing Documentation}). | |
5945 | 435 |
436 @item interactive | |
437 The interactive spec (if any). This can be a string or a Lisp | |
438 expression. It is @code{nil} for a function that isn't interactive. | |
439 @end table | |
440 | |
441 Here's an example of a byte-code function object, in printed | |
442 representation. It is the definition of the command | |
443 @code{backward-sexp}. | |
444 | |
445 @example | |
446 #[(&optional arg) | |
447 "^H\204^F^@@\301^P\302^H[!\207" | |
448 [arg 1 forward-sexp] | |
449 2 | |
450 254435 | |
451 "p"] | |
452 @end example | |
453 | |
454 The primitive way to create a byte-code object is with | |
455 @code{make-byte-code}: | |
456 | |
457 @defun make-byte-code &rest elements | |
458 This function constructs and returns a byte-code function object | |
459 with @var{elements} as its elements. | |
460 @end defun | |
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 | 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 | 466 |
467 You can access the elements of a byte-code object using @code{aref}; | |
468 you can also use @code{vconcat} to create a vector with the same | |
469 elements. | |
470 | |
471 @node Disassembly | |
472 @section Disassembled Byte-Code | |
473 @cindex disassembled byte-code | |
474 | |
475 People do not write byte-code; that job is left to the byte compiler. | |
476 But we provide a disassembler to satisfy a cat-like curiosity. The | |
477 disassembler converts the byte-compiled code into humanly readable | |
478 form. | |
479 | |
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 | 482 in calculations whose results are themselves pushed back on the stack. |
483 When a byte-code function returns, it pops a value off the stack and | |
484 returns it as the value of the function. | |
5945 | 485 |
7212 | 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 | 489 |
490 @deffn Command disassemble object &optional stream | |
491 This function prints the disassembled code for @var{object}. If | |
492 @var{stream} is supplied, then output goes there. Otherwise, the | |
493 disassembled code is printed to the stream @code{standard-output}. The | |
494 argument @var{object} can be a function name or a lambda expression. | |
495 | |
496 As a special exception, if this function is used interactively, | |
497 it outputs to a buffer named @samp{*Disassemble*}. | |
498 @end deffn | |
499 | |
500 Here are two examples of using the @code{disassemble} function. We | |
501 have added explanatory comments to help you relate the byte-code to the | |
502 Lisp source; these do not appear in the output of @code{disassemble}. | |
503 These examples show unoptimized byte-code. Nowadays byte-code is | |
504 usually optimized, but we did not want to rewrite these examples, since | |
505 they still serve their purpose. | |
506 | |
507 @example | |
508 @group | |
509 (defun factorial (integer) | |
510 "Compute factorial of an integer." | |
511 (if (= 1 integer) 1 | |
512 (* integer (factorial (1- integer))))) | |
513 @result{} factorial | |
514 @end group | |
515 | |
516 @group | |
517 (factorial 4) | |
518 @result{} 24 | |
519 @end group | |
520 | |
521 @group | |
522 (disassemble 'factorial) | |
523 @print{} byte-code for factorial: | |
524 doc: Compute factorial of an integer. | |
525 args: (integer) | |
526 @end group | |
527 | |
528 @group | |
529 0 constant 1 ; @r{Push 1 onto stack.} | |
530 | |
531 1 varref integer ; @r{Get value of @code{integer}} | |
532 ; @r{from the environment} | |
533 ; @r{and push the value} | |
534 ; @r{onto the stack.} | |
535 @end group | |
536 | |
537 @group | |
538 2 eqlsign ; @r{Pop top two values off stack,} | |
539 ; @r{compare them,} | |
540 ; @r{and push result onto stack.} | |
541 @end group | |
542 | |
543 @group | |
544 3 goto-if-nil 10 ; @r{Pop and test top of stack;} | |
545 ; @r{if @code{nil}, go to 10,} | |
546 ; @r{else continue.} | |
547 @end group | |
548 | |
549 @group | |
550 6 constant 1 ; @r{Push 1 onto top of stack.} | |
551 | |
552 7 goto 17 ; @r{Go to 17 (in this case, 1 will be} | |
553 ; @r{returned by the function).} | |
554 @end group | |
555 | |
556 @group | |
557 10 constant * ; @r{Push symbol @code{*} onto stack.} | |
558 | |
559 11 varref integer ; @r{Push value of @code{integer} onto stack.} | |
560 @end group | |
561 | |
562 @group | |
563 12 constant factorial ; @r{Push @code{factorial} onto stack.} | |
564 | |
565 13 varref integer ; @r{Push value of @code{integer} onto stack.} | |
566 | |
567 14 sub1 ; @r{Pop @code{integer}, decrement value,} | |
568 ; @r{push new value onto stack.} | |
569 @end group | |
570 | |
571 @group | |
572 ; @r{Stack now contains:} | |
573 ; @minus{} @r{decremented value of @code{integer}} | |
574 ; @minus{} @r{@code{factorial}} | |
575 ; @minus{} @r{value of @code{integer}} | |
576 ; @minus{} @r{@code{*}} | |
577 @end group | |
578 | |
579 @group | |
580 15 call 1 ; @r{Call function @code{factorial} using} | |
581 ; @r{the first (i.e., the top) element} | |
582 ; @r{of the stack as the argument;} | |
583 ; @r{push returned value onto stack.} | |
584 @end group | |
585 | |
586 @group | |
587 ; @r{Stack now contains:} | |
7212 | 588 ; @minus{} @r{result of recursive} |
5945 | 589 ; @r{call to @code{factorial}} |
590 ; @minus{} @r{value of @code{integer}} | |
591 ; @minus{} @r{@code{*}} | |
592 @end group | |
593 | |
594 @group | |
595 16 call 2 ; @r{Using the first two} | |
596 ; @r{(i.e., the top two)} | |
597 ; @r{elements of the stack} | |
598 ; @r{as arguments,} | |
599 ; @r{call the function @code{*},} | |
600 ; @r{pushing the result onto the stack.} | |
601 @end group | |
602 | |
603 @group | |
604 17 return ; @r{Return the top element} | |
605 ; @r{of the stack.} | |
606 @result{} nil | |
607 @end group | |
608 @end example | |
609 | |
610 The @code{silly-loop} function is somewhat more complex: | |
611 | |
612 @example | |
613 @group | |
614 (defun silly-loop (n) | |
615 "Return time before and after N iterations of a loop." | |
616 (let ((t1 (current-time-string))) | |
617 (while (> (setq n (1- n)) | |
618 0)) | |
619 (list t1 (current-time-string)))) | |
620 @result{} silly-loop | |
621 @end group | |
622 | |
623 @group | |
624 (disassemble 'silly-loop) | |
625 @print{} byte-code for silly-loop: | |
626 doc: Return time before and after N iterations of a loop. | |
627 args: (n) | |
628 | |
629 0 constant current-time-string ; @r{Push} | |
630 ; @r{@code{current-time-string}} | |
631 ; @r{onto top of stack.} | |
632 @end group | |
633 | |
634 @group | |
635 1 call 0 ; @r{Call @code{current-time-string}} | |
636 ; @r{ with no argument,} | |
637 ; @r{ pushing result onto stack.} | |
638 @end group | |
639 | |
640 @group | |
641 2 varbind t1 ; @r{Pop stack and bind @code{t1}} | |
642 ; @r{to popped value.} | |
643 @end group | |
644 | |
645 @group | |
646 3 varref n ; @r{Get value of @code{n} from} | |
647 ; @r{the environment and push} | |
648 ; @r{the value onto the stack.} | |
649 @end group | |
650 | |
651 @group | |
652 4 sub1 ; @r{Subtract 1 from top of stack.} | |
653 @end group | |
654 | |
655 @group | |
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 | 658 ; @r{the stack and push the} |
659 ; @r{copy onto the stack.} | |
660 @end group | |
661 | |
662 @group | |
663 6 varset n ; @r{Pop the top of the stack,} | |
664 ; @r{and bind @code{n} to the value.} | |
665 | |
666 ; @r{In effect, the sequence @code{dup varset}} | |
667 ; @r{copies the top of the stack} | |
668 ; @r{into the value of @code{n}} | |
669 ; @r{without popping it.} | |
670 @end group | |
671 | |
672 @group | |
673 7 constant 0 ; @r{Push 0 onto stack.} | |
674 @end group | |
675 | |
676 @group | |
677 8 gtr ; @r{Pop top two values off stack,} | |
678 ; @r{test if @var{n} is greater than 0} | |
679 ; @r{and push result onto stack.} | |
680 @end group | |
681 | |
682 @group | |
7212 | 683 9 goto-if-nil-else-pop 17 ; @r{Goto 17 if @code{n} <= 0} |
684 ; @r{(this exits the while loop).} | |
5945 | 685 ; @r{else pop top of stack} |
686 ; @r{and continue} | |
687 @end group | |
688 | |
689 @group | |
690 12 constant nil ; @r{Push @code{nil} onto stack} | |
691 ; @r{(this is the body of the loop).} | |
692 @end group | |
693 | |
694 @group | |
695 13 discard ; @r{Discard result of the body} | |
696 ; @r{of the loop (a while loop} | |
697 ; @r{is always evaluated for} | |
698 ; @r{its side effects).} | |
699 @end group | |
700 | |
701 @group | |
702 14 goto 3 ; @r{Jump back to beginning} | |
703 ; @r{of while loop.} | |
704 @end group | |
705 | |
706 @group | |
707 17 discard ; @r{Discard result of while loop} | |
708 ; @r{by popping top of stack.} | |
7212 | 709 ; @r{This result is the value @code{nil} that} |
710 ; @r{was not popped by the goto at 9.} | |
5945 | 711 @end group |
712 | |
713 @group | |
714 18 varref t1 ; @r{Push value of @code{t1} onto stack.} | |
715 @end group | |
716 | |
717 @group | |
718 19 constant current-time-string ; @r{Push} | |
719 ; @r{@code{current-time-string}} | |
720 ; @r{onto top of stack.} | |
721 @end group | |
722 | |
723 @group | |
724 20 call 0 ; @r{Call @code{current-time-string} again.} | |
725 @end group | |
726 | |
727 @group | |
728 21 list2 ; @r{Pop top two elements off stack,} | |
729 ; @r{create a list of them,} | |
730 ; @r{and push list onto stack.} | |
731 @end group | |
732 | |
733 @group | |
734 22 unbind 1 ; @r{Unbind @code{t1} in local environment.} | |
735 | |
736 23 return ; @r{Return value of the top of stack.} | |
737 | |
738 @result{} nil | |
739 @end group | |
740 @end example | |
741 | |
742 |