This is Info file ../../info/lispref.info, produced by Makeinfo version 1.68 from the input file lispref.texi. INFO-DIR-SECTION XEmacs Editor START-INFO-DIR-ENTRY * Lispref: (lispref). XEmacs Lisp Reference Manual. END-INFO-DIR-ENTRY Edition History: GNU Emacs Lisp Reference Manual Second Edition (v2.01), May 1993 GNU Emacs Lisp Reference Manual Further Revised (v2.02), August 1993 Lucid Emacs Lisp Reference Manual (for 19.10) First Edition, March 1994 XEmacs Lisp Programmer's Manual (for 19.12) Second Edition, April 1995 GNU Emacs Lisp Reference Manual v2.4, June 1995 XEmacs Lisp Programmer's Manual (for 19.13) Third Edition, July 1995 XEmacs Lisp Reference Manual (for 19.14 and 20.0) v3.1, March 1996 XEmacs Lisp Reference Manual (for 19.15 and 20.1, 20.2, 20.3) v3.2, April, May, November 1997 XEmacs Lisp Reference Manual (for 21.0) v3.3, April 1998 Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. Copyright (C) 1994, 1995 Sun Microsystems, Inc. Copyright (C) 1995, 1996 Ben Wing. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled "GNU General Public License" is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled "GNU General Public License" may be included in a translation approved by the Free Software Foundation instead of in the original English.  File: lispref.info, Node: Big5 and Shift-JIS Functions, Prev: Detection of Textual Encoding, Up: Coding Systems Big5 and Shift-JIS Functions ---------------------------- These are special functions for working with the non-standard Shift-JIS and Big5 encodings. - Function: decode-shift-jis-char CODE This function decodes a JISX0208 character of Shift-JIS coding-system. CODE is the character code in Shift-JIS as a cons of type bytes. The corresponding character is returned. - Function: encode-shift-jis-char CH This function encodes a JISX0208 character CH to SHIFT-JIS coding-system. The corresponding character code in SHIFT-JIS is returned as a cons of two bytes. - Function: decode-big5-char CODE This function decodes a Big5 character CODE of BIG5 coding-system. CODE is the character code in BIG5. The corresponding character is returned. - Function: encode-big5-char CH This function encodes the Big5 character CHAR to BIG5 coding-system. The corresponding character code in Big5 is returned.  File: lispref.info, Node: CCL, Next: Category Tables, Prev: Coding Systems, Up: MULE CCL === CCL (Code Conversion Language) is a simple structured programming language designed for character coding conversions. A CCL program is compiled to CCL code (represented by a vector of integers) and executed by the CCL interpreter embedded in Emacs. The CCL interpreter implements a virtual machine with 8 registers called `r0', ..., `r7', a number of control structures, and some I/O operators. Take care when using registers `r0' (used in implicit "set" statements) and especially `r7' (used internally by several statements and operations, especially for multiple return values and I/O operations). CCL is used for code conversion during process I/O and file I/O for non-ISO2022 coding systems. (It is the only way for a user to specify a code conversion function.) It is also used for calculating the code point of an X11 font from a character code. However, since CCL is designed as a powerful programming language, it can be used for more generic calculation where efficiency is demanded. A combination of three or more arithmetic operations can be calculated faster by CCL than by Emacs Lisp. *Warning:* The code in `src/mule-ccl.c' and `$packages/lisp/mule-base/mule-ccl.el' is the definitive description of CCL's semantics. The previous version of this section contained several typos and obsolete names left from earlier versions of MULE, and many may remain. (I am not an experienced CCL programmer; the few who know CCL well find writing English painful.) A CCL program transforms an input data stream into an output data stream. The input stream, held in a buffer of constant bytes, is left unchanged. The buffer may be filled by an external input operation, taken from an Emacs buffer, or taken from a Lisp string. The output buffer is a dynamic array of bytes, which can be written by an external output operation, inserted into an Emacs buffer, or returned as a Lisp string. A CCL program is a (Lisp) list containing two or three members. The first member is the "buffer magnification", which indicates the required minimum size of the output buffer as a multiple of the input buffer. It is followed by the "main block" which executes while there is input remaining, and an optional "EOF block" which is executed when the input is exhausted. Both the main block and the EOF block are CCL blocks. A "CCL block" is either a CCL statement or list of CCL statements. A "CCL statement" is either a "set statement" (either an integer or an "assignment", which is a list of a register to receive the assignment, an assignment operator, and an expression) or a "control statement" (a list starting with a keyword, whose allowable syntax depends on the keyword). * Menu: * CCL Syntax:: CCL program syntax in BNF notation. * CCL Statements:: Semantics of CCL statements. * CCL Expressions:: Operators and expressions in CCL. * Calling CCL:: Running CCL programs. * CCL Examples:: The encoding functions for Big5 and KOI-8.  File: lispref.info, Node: CCL Syntax, Next: CCL Statements, Prev: CCL, Up: CCL CCL Syntax ---------- The full syntax of a CCL program in BNF notation: CCL_PROGRAM := (BUFFER_MAGNIFICATION CCL_MAIN_BLOCK [ CCL_EOF_BLOCK ]) BUFFER_MAGNIFICATION := integer CCL_MAIN_BLOCK := CCL_BLOCK CCL_EOF_BLOCK := CCL_BLOCK CCL_BLOCK := STATEMENT | (STATEMENT [STATEMENT ...]) STATEMENT := SET | IF | BRANCH | LOOP | REPEAT | BREAK | READ | WRITE | CALL | END SET := (REG = EXPRESSION) | (REG ASSIGNMENT_OPERATOR EXPRESSION) | integer EXPRESSION := ARG | (EXPRESSION OPERATOR ARG) IF := (if EXPRESSION CCL_BLOCK [CCL_BLOCK]) BRANCH := (branch EXPRESSION CCL_BLOCK [CCL_BLOCK ...]) LOOP := (loop STATEMENT [STATEMENT ...]) BREAK := (break) REPEAT := (repeat) | (write-repeat [REG | integer | string]) | (write-read-repeat REG [integer | ARRAY]) READ := (read REG ...) | (read-if (REG OPERATOR ARG) CCL_BLOCK CCL_BLOCK) | (read-branch REG CCL_BLOCK [CCL_BLOCK ...]) WRITE := (write REG ...) | (write EXPRESSION) | (write integer) | (write string) | (write REG ARRAY) | string CALL := (call ccl-program-name) END := (end) REG := r0 | r1 | r2 | r3 | r4 | r5 | r6 | r7 ARG := REG | integer OPERATOR := + | - | * | / | % | & | '|' | ^ | << | >> | <8 | >8 | // | < | > | == | <= | >= | != | de-sjis | en-sjis ASSIGNMENT_OPERATOR := += | -= | *= | /= | %= | &= | '|=' | ^= | <<= | >>= ARRAY := '[' integer ... ']'  File: lispref.info, Node: CCL Statements, Next: CCL Expressions, Prev: CCL Syntax, Up: CCL CCL Statements -------------- The Emacs Code Conversion Language provides the following statement types: "set", "if", "branch", "loop", "repeat", "break", "read", "write", "call", and "end". Set statement: ============== The "set" statement has three variants with the syntaxes `(REG = EXPRESSION)', `(REG ASSIGNMENT_OPERATOR EXPRESSION)', and `INTEGER'. The assignment operator variation of the "set" statement works the same way as the corresponding C expression statement does. The assignment operators are `+=', `-=', `*=', `/=', `%=', `&=', `|=', `^=', `<<=', and `>>=', and they have the same meanings as in C. A "naked integer" INTEGER is equivalent to a SET statement of the form `(r0 = INTEGER)'. I/O statements: =============== The "read" statement takes one or more registers as arguments. It reads one byte (a C char) from the input into each register in turn. The "write" takes several forms. In the form `(write REG ...)' it takes one or more registers as arguments and writes each in turn to the output. The integer in a register (interpreted as an Emchar) is encoded to multibyte form (ie, Bufbytes) and written to the current output buffer. If it is less than 256, it is written as is. The forms `(write EXPRESSION)' and `(write INTEGER)' are treated analogously. The form `(write STRING)' writes the constant string to the output. A "naked string" `STRING' is equivalent to the statement `(write STRING)'. The form `(write REG ARRAY)' writes the REGth element of the ARRAY to the output. Conditional statements: ======================= The "if" statement takes an EXPRESSION, a CCL BLOCK, and an optional SECOND CCL BLOCK as arguments. If the EXPRESSION evaluates to non-zero, the first CCL BLOCK is executed. Otherwise, if there is a SECOND CCL BLOCK, it is executed. The "read-if" variant of the "if" statement takes an EXPRESSION, a CCL BLOCK, and an optional SECOND CCL BLOCK as arguments. The EXPRESSION must have the form `(REG OPERATOR OPERAND)' (where OPERAND is a register or an integer). The `read-if' statement first reads from the input into the first register operand in the EXPRESSION, then conditionally executes a CCL block just as the `if' statement does. The "branch" statement takes an EXPRESSION and one or more CCL blocks as arguments. The CCL blocks are treated as a zero-indexed array, and the `branch' statement uses the EXPRESSION as the index of the CCL block to execute. Null CCL blocks may be used as no-ops, continuing execution with the statement following the `branch' statement in the containing CCL block. Out-of-range values for the EXPRESSION are also treated as no-ops. The "read-branch" variant of the "branch" statement takes an REGISTER, a CCL BLOCK, and an optional SECOND CCL BLOCK as arguments. The `read-branch' statement first reads from the input into the REGISTER, then conditionally executes a CCL block just as the `branch' statement does. Loop control statements: ======================== The "loop" statement creates a block with an implied jump from the end of the block back to its head. The loop is exited on a `break' statement, and continued without executing the tail by a `repeat' statement. The "break" statement, written `(break)', terminates the current loop and continues with the next statement in the current block. The "repeat" statement has three variants, `repeat', `write-repeat', and `write-read-repeat'. Each continues the current loop from its head, possibly after performing I/O. `repeat' takes no arguments and does no I/O before jumping. `write-repeat' takes a single argument (a register, an integer, or a string), writes it to the output, then jumps. `write-read-repeat' takes one or two arguments. The first must be a register. The second may be an integer or an array; if absent, it is implicitly set to the first (register) argument. `write-read-repeat' writes its second argument to the output, then reads from the input into the register, and finally jumps. See the `write' and `read' statements for the semantics of the I/O operations for each type of argument. Other control statements: ========================= The "call" statement, written `(call CCL-PROGRAM-NAME)', executes a CCL program as a subroutine. It does not return a value to the caller, but can modify the register status. The "end" statement, written `(end)', terminates the CCL program successfully, and returns to caller (which may be a CCL program). It does not alter the status of the registers.  File: lispref.info, Node: CCL Expressions, Next: Calling CCL, Prev: CCL Statements, Up: CCL CCL Expressions --------------- CCL, unlike Lisp, uses infix expressions. The simplest CCL expressions consist of a single OPERAND, either a register (one of `r0', ..., `r0') or an integer. Complex expressions are lists of the form `( EXPRESSION OPERATOR OPERAND )'. Unlike C, assignments are not expressions. In the following table, X is the target resister for a "set". In subexpressions, this is implicitly `r7'. This means that `>8', `//', `de-sjis', and `en-sjis' cannot be used freely in subexpressions, since they return parts of their values in `r7'. Y may be an expression, register, or integer, while Z must be a register or an integer. Name Operator Code C-like Description CCL_PLUS `+' 0x00 X = Y + Z CCL_MINUS `-' 0x01 X = Y - Z CCL_MUL `*' 0x02 X = Y * Z CCL_DIV `/' 0x03 X = Y / Z CCL_MOD `%' 0x04 X = Y % Z CCL_AND `&' 0x05 X = Y & Z CCL_OR `|' 0x06 X = Y | Z CCL_XOR `^' 0x07 X = Y ^ Z CCL_LSH `<<' 0x08 X = Y << Z CCL_RSH `>>' 0x09 X = Y >> Z CCL_LSH8 `<8' 0x0A X = (Y << 8) | Z CCL_RSH8 `>8' 0x0B X = Y >> 8, r[7] = Y & 0xFF CCL_DIVMOD `//' 0x0C X = Y / Z, r[7] = Y % Z CCL_LS `<' 0x10 X = (X < Y) CCL_GT `>' 0x11 X = (X > Y) CCL_EQ `==' 0x12 X = (X == Y) CCL_LE `<=' 0x13 X = (X <= Y) CCL_GE `>=' 0x14 X = (X >= Y) CCL_NE `!=' 0x15 X = (X != Y) CCL_ENCODE_SJIS `en-sjis' 0x16 X = HIGHER_BYTE (SJIS (Y, Z)) r[7] = LOWER_BYTE (SJIS (Y, Z) CCL_DECODE_SJIS `de-sjis' 0x17 X = HIGHER_BYTE (DE-SJIS (Y, Z)) r[7] = LOWER_BYTE (DE-SJIS (Y, Z)) The CCL operators are as in C, with the addition of CCL_LSH8, CCL_RSH8, CCL_DIVMOD, CCL_ENCODE_SJIS, and CCL_DECODE_SJIS. The CCL_ENCODE_SJIS and CCL_DECODE_SJIS treat their first and second bytes as the high and low bytes of a two-byte character code. (SJIS stands for Shift JIS, an encoding of Japanese characters used by Microsoft. CCL_ENCODE_SJIS is a complicated transformation of the Japanese standard JIS encoding to Shift JIS. CCL_DECODE_SJIS is its inverse.) It is somewhat odd to represent the SJIS operations in infix form.  File: lispref.info, Node: Calling CCL, Next: CCL Examples, Prev: CCL Expressions, Up: CCL Calling CCL ----------- CCL programs are called automatically during Emacs buffer I/O when the external representation has a coding system type of `shift-jis', `big5', or `ccl'. The program is specified by the coding system (*note Coding Systems::.). You can also call CCL programs from other CCL programs, and from Lisp using these functions: - Function: ccl-execute CCL-PROGRAM STATUS Execute CCL-PROGRAM with registers initialized by STATUS. CCL-PROGRAM is a vector of compiled CCL code created by `ccl-compile'. It is an error for the program to try to execute a CCL I/O command. STATUS must be a vector of nine values, specifying the initial value for the R0, R1 .. R7 registers and for the instruction counter IC. A `nil' value for a register initializer causes the register to be set to 0. A `nil' value for the IC initializer causes execution to start at the beginning of the program. When the program is done, STATUS is modified (by side-effect) to contain the ending values for the corresponding registers and IC. - Function: ccl-execute-on-string CCL-PROGRAM STATUS STR &optional CONTINUE Execute CCL-PROGRAM with initial STATUS on STRING. CCL-PROGRAM is a vector of compiled CCL code created by `ccl-compile'. STATUS must be a vector of nine values, specifying the initial value for the R0, R1 .. R7 registers and for the instruction counter IC. A `nil' value for a register initializer causes the register to be set to 0. A `nil' value for the IC initializer causes execution to start at the beginning of the program. An optional fourth argument CONTINUE, if non-nil, causes the IC to remain on the unsatisfied read operation if the program terminates due to exhaustion of the input buffer. Otherwise the IC is set to the end of the program. When the program is done, STATUS is modified (by side-effect) to contain the ending values for the corresponding registers and IC. Returns the resulting string. To call a CCL program from another CCL program, it must first be registered: - Function: register-ccl-program NAME CCL-PROGRAM Register NAME for CCL program PROGRAM in `ccl-program-table'. PROGRAM should be the compiled form of a CCL program, or nil. Return index number of the registered CCL program. Information about the processor time used by the CCL interpreter can be obtained using these functions: - Function: ccl-elapsed-time Returns the elapsed processor time of the CCL interpreter as cons of user and system time, as floating point numbers measured in seconds. If only one overall value can be determined, the return value will be a cons of that value and 0. - Function: ccl-reset-elapsed-time Resets the CCL interpreter's internal elapsed time registers.  File: lispref.info, Node: CCL Examples, Prev: Calling CCL, Up: CCL CCL Examples ------------ This section is not yet written.  File: lispref.info, Node: Category Tables, Prev: CCL, Up: MULE Category Tables =============== A category table is a type of char table used for keeping track of categories. Categories are used for classifying characters for use in regexps - you can refer to a category rather than having to use a complicated [] expression (and category lookups are significantly faster). There are 95 different categories available, one for each printable character (including space) in the ASCII charset. Each category is designated by one such character, called a "category designator". They are specified in a regexp using the syntax `\cX', where X is a category designator. (This is not yet implemented.) A category table specifies, for each character, the categories that the character is in. Note that a character can be in more than one category. More specifically, a category table maps from a character to either the value `nil' (meaning the character is in no categories) or a 95-element bit vector, specifying for each of the 95 categories whether the character is in that category. Special Lisp functions are provided that abstract this, so you do not have to directly manipulate bit vectors. - Function: category-table-p OBJ This function returns `t' if ARG is a category table. - Function: category-table &optional BUFFER This function returns the current category table. This is the one specified by the current buffer, or by BUFFER if it is non-`nil'. - Function: standard-category-table This function returns the standard category table. This is the one used for new buffers. - Function: copy-category-table &optional TABLE This function constructs a new category table and return it. It is a copy of the TABLE, which defaults to the standard category table. - Function: set-category-table TABLE &optional BUFFER This function selects a new category table for BUFFER. One argument, a category table. BUFFER defaults to the current buffer if omitted. - Function: category-designator-p OBJ This function returns `t' if ARG is a category designator (a char in the range `' '' to `'~''). - Function: category-table-value-p OBJ This function returns `t' if ARG is a category table value. Valid values are `nil' or a bit vector of size 95.  File: lispref.info, Node: Tips, Next: Building XEmacs and Object Allocation, Prev: MULE, Up: Top Tips and Standards ****************** This chapter describes no additional features of XEmacs Lisp. Instead it gives advice on making effective use of the features described in the previous chapters. * Menu: * Style Tips:: Writing clean and robust programs. * Compilation Tips:: Making compiled code run fast. * Documentation Tips:: Writing readable documentation strings. * Comment Tips:: Conventions for writing comments. * Library Headers:: Standard headers for library packages.  File: lispref.info, Node: Style Tips, Next: Compilation Tips, Up: Tips Writing Clean Lisp Programs =========================== Here are some tips for avoiding common errors in writing Lisp code intended for widespread use: * Since all global variables share the same name space, and all functions share another name space, you should choose a short word to distinguish your program from other Lisp programs. Then take care to begin the names of all global variables, constants, and functions with the chosen prefix. This helps avoid name conflicts. This recommendation applies even to names for traditional Lisp primitives that are not primitives in XEmacs Lisp--even to `cadr'. Believe it or not, there is more than one plausible way to define `cadr'. Play it safe; append your name prefix to produce a name like `foo-cadr' or `mylib-cadr' instead. If you write a function that you think ought to be added to Emacs under a certain name, such as `twiddle-files', don't call it by that name in your program. Call it `mylib-twiddle-files' in your program, and send mail to `bug-gnu-emacs@prep.ai.mit.edu' suggesting we add it to Emacs. If and when we do, we can change the name easily enough. If one prefix is insufficient, your package may use two or three alternative common prefixes, so long as they make sense. Separate the prefix from the rest of the symbol name with a hyphen, `-'. This will be consistent with XEmacs itself and with most Emacs Lisp programs. * It is often useful to put a call to `provide' in each separate library program, at least if there is more than one entry point to the program. * If a file requires certain other library programs to be loaded beforehand, then the comments at the beginning of the file should say so. Also, use `require' to make sure they are loaded. * If one file FOO uses a macro defined in another file BAR, FOO should contain this expression before the first use of the macro: (eval-when-compile (require 'BAR)) (And BAR should contain `(provide 'BAR)', to make the `require' work.) This will cause BAR to be loaded when you byte-compile FOO. Otherwise, you risk compiling FOO without the necessary macro loaded, and that would produce compiled code that won't work right. *Note Compiling Macros::. Using `eval-when-compile' avoids loading BAR when the compiled version of FOO is *used*. * If you define a major mode, make sure to run a hook variable using `run-hooks', just as the existing major modes do. *Note Hooks::. * If the purpose of a function is to tell you whether a certain condition is true or false, give the function a name that ends in `p'. If the name is one word, add just `p'; if the name is multiple words, add `-p'. Examples are `framep' and `frame-live-p'. * If a user option variable records a true-or-false condition, give it a name that ends in `-flag'. * Please do not define `C-c LETTER' as a key in your major modes. These sequences are reserved for users; they are the *only* sequences reserved for users, so we cannot do without them. Instead, define sequences consisting of `C-c' followed by a non-letter. These sequences are reserved for major modes. Changing all the major modes in Emacs 18 so they would follow this convention was a lot of work. Abandoning this convention would make that work go to waste, and inconvenience users. * Sequences consisting of `C-c' followed by `{', `}', `<', `>', `:' or `;' are also reserved for major modes. * Sequences consisting of `C-c' followed by any other punctuation character are allocated for minor modes. Using them in a major mode is not absolutely prohibited, but if you do that, the major mode binding may be shadowed from time to time by minor modes. * You should not bind `C-h' following any prefix character (including `C-c'). If you don't bind `C-h', it is automatically available as a help character for listing the subcommands of the prefix character. * You should not bind a key sequence ending in except following another . (That is, it is ok to bind a sequence ending in ` '.) The reason for this rule is that a non-prefix binding for in any context prevents recognition of escape sequences as function keys in that context. * Applications should not bind mouse events based on button 1 with the shift key held down. These events include `S-mouse-1', `M-S-mouse-1', `C-S-mouse-1', and so on. They are reserved for users. * Modes should redefine `mouse-2' as a command to follow some sort of reference in the text of a buffer, if users usually would not want to alter the text in that buffer by hand. Modes such as Dired, Info, Compilation, and Occur redefine it in this way. * When a package provides a modification of ordinary Emacs behavior, it is good to include a command to enable and disable the feature, Provide a command named `WHATEVER-mode' which turns the feature on or off, and make it autoload (*note Autoload::.). Design the package so that simply loading it has no visible effect--that should not enable the feature. Users will request the feature by invoking the command. * It is a bad idea to define aliases for the Emacs primitives. Use the standard names instead. * Redefining an Emacs primitive is an even worse idea. It may do the right thing for a particular program, but there is no telling what other programs might break as a result. * If a file does replace any of the functions or library programs of standard XEmacs, prominent comments at the beginning of the file should say which functions are replaced, and how the behavior of the replacements differs from that of the originals. * Please keep the names of your XEmacs Lisp source files to 13 characters or less. This way, if the files are compiled, the compiled files' names will be 14 characters or less, which is short enough to fit on all kinds of Unix systems. * Don't use `next-line' or `previous-line' in programs; nearly always, `forward-line' is more convenient as well as more predictable and robust. *Note Text Lines::. * Don't call functions that set the mark, unless setting the mark is one of the intended features of your program. The mark is a user-level feature, so it is incorrect to change the mark except to supply a value for the user's benefit. *Note The Mark::. In particular, don't use these functions: * `beginning-of-buffer', `end-of-buffer' * `replace-string', `replace-regexp' If you just want to move point, or replace a certain string, without any of the other features intended for interactive users, you can replace these functions with one or two lines of simple Lisp code. * Use lists rather than vectors, except when there is a particular reason to use a vector. Lisp has more facilities for manipulating lists than for vectors, and working with lists is usually more convenient. Vectors are advantageous for tables that are substantial in size and are accessed in random order (not searched front to back), provided there is no need to insert or delete elements (only lists allow that). * The recommended way to print a message in the echo area is with the `message' function, not `princ'. *Note The Echo Area::. * When you encounter an error condition, call the function `error' (or `signal'). The function `error' does not return. *Note Signaling Errors::. Do not use `message', `throw', `sleep-for', or `beep' to report errors. * An error message should start with a capital letter but should not end with a period. * Try to avoid using recursive edits. Instead, do what the Rmail `e' command does: use a new local keymap that contains one command defined to switch back to the old local keymap. Or do what the `edit-options' command does: switch to another buffer and let the user switch back at will. *Note Recursive Editing::. * In some other systems there is a convention of choosing variable names that begin and end with `*'. We don't use that convention in Emacs Lisp, so please don't use it in your programs. (Emacs uses such names only for program-generated buffers.) The users will find Emacs more coherent if all libraries use the same conventions. * Indent each function with `C-M-q' (`indent-sexp') using the default indentation parameters. * Don't make a habit of putting close-parentheses on lines by themselves; Lisp programmers find this disconcerting. Once in a while, when there is a sequence of many consecutive close-parentheses, it may make sense to split them in one or two significant places. * Please put a copyright notice on the file if you give copies to anyone. Use the same lines that appear at the top of the Lisp files in XEmacs itself. If you have not signed papers to assign the copyright to the Foundation, then place your name in the copyright notice in place of the Foundation's name.  File: lispref.info, Node: Compilation Tips, Next: Documentation Tips, Prev: Style Tips, Up: Tips Tips for Making Compiled Code Fast ================================== Here are ways of improving the execution speed of byte-compiled Lisp programs. * Use the `profile' library to profile your program. See the file `profile.el' for instructions. * Use iteration rather than recursion whenever possible. Function calls are slow in XEmacs Lisp even when a compiled function is calling another compiled function. * Using the primitive list-searching functions `memq', `member', `assq', or `assoc' is even faster than explicit iteration. It may be worth rearranging a data structure so that one of these primitive search functions can be used. * Certain built-in functions are handled specially in byte-compiled code, avoiding the need for an ordinary function call. It is a good idea to use these functions rather than alternatives. To see whether a function is handled specially by the compiler, examine its `byte-compile' property. If the property is non-`nil', then the function is handled specially. For example, the following input will show you that `aref' is compiled specially (*note Array Functions::.) while `elt' is not (*note Sequence Functions::.): (get 'aref 'byte-compile) => byte-compile-two-args (get 'elt 'byte-compile) => nil * If calling a small function accounts for a substantial part of your program's running time, make the function inline. This eliminates the function call overhead. Since making a function inline reduces the flexibility of changing the program, don't do it unless it gives a noticeable speedup in something slow enough that users care about the speed. *Note Inline Functions::.  File: lispref.info, Node: Documentation Tips, Next: Comment Tips, Prev: Compilation Tips, Up: Tips Tips for Documentation Strings ============================== Here are some tips for the writing of documentation strings. * Every command, function, or variable intended for users to know about should have a documentation string. * An internal variable or subroutine of a Lisp program might as well have a documentation string. In earlier Emacs versions, you could save space by using a comment instead of a documentation string, but that is no longer the case. * The first line of the documentation string should consist of one or two complete sentences that stand on their own as a summary. `M-x apropos' displays just the first line, and if it doesn't stand on its own, the result looks bad. In particular, start the first line with a capital letter and end with a period. The documentation string can have additional lines that expand on the details of how to use the function or variable. The additional lines should be made up of complete sentences also, but they may be filled if that looks good. * For consistency, phrase the verb in the first sentence of a documentation string as an infinitive with "to" omitted. For instance, use "Return the cons of A and B." in preference to "Returns the cons of A and B." Usually it looks good to do likewise for the rest of the first paragraph. Subsequent paragraphs usually look better if they have proper subjects. * Write documentation strings in the active voice, not the passive, and in the present tense, not the future. For instance, use "Return a list containing A and B." instead of "A list containing A and B will be returned." * Avoid using the word "cause" (or its equivalents) unnecessarily. Instead of, "Cause Emacs to display text in boldface," write just "Display text in boldface." * Do not start or end a documentation string with whitespace. * Format the documentation string so that it fits in an Emacs window on an 80-column screen. It is a good idea for most lines to be no wider than 60 characters. The first line can be wider if necessary to fit the information that ought to be there. However, rather than simply filling the entire documentation string, you can make it much more readable by choosing line breaks with care. Use blank lines between topics if the documentation string is long. * *Do not* indent subsequent lines of a documentation string so that the text is lined up in the source code with the text of the first line. This looks nice in the source code, but looks bizarre when users view the documentation. Remember that the indentation before the starting double-quote is not part of the string! * A variable's documentation string should start with `*' if the variable is one that users would often want to set interactively. If the value is a long list, or a function, or if the variable would be set only in init files, then don't start the documentation string with `*'. *Note Defining Variables::. * The documentation string for a variable that is a yes-or-no flag should start with words such as "Non-nil means...", to make it clear that all non-`nil' values are equivalent and indicate explicitly what `nil' and non-`nil' mean. * When a function's documentation string mentions the value of an argument of the function, use the argument name in capital letters as if it were a name for that value. Thus, the documentation string of the function `/' refers to its second argument as `DIVISOR', because the actual argument name is `divisor'. Also use all caps for meta-syntactic variables, such as when you show the decomposition of a list or vector into subunits, some of which may vary. * When a documentation string refers to a Lisp symbol, write it as it would be printed (which usually means in lower case), with single-quotes around it. For example: `lambda'. There are two exceptions: write t and nil without single-quotes. (In this manual, we normally do use single-quotes for those symbols.) * Don't write key sequences directly in documentation strings. Instead, use the `\\[...]' construct to stand for them. For example, instead of writing `C-f', write `\\[forward-char]'. When Emacs displays the documentation string, it substitutes whatever key is currently bound to `forward-char'. (This is normally `C-f', but it may be some other character if the user has moved key bindings.) *Note Keys in Documentation::. * In documentation strings for a major mode, you will want to refer to the key bindings of that mode's local map, rather than global ones. Therefore, use the construct `\\<...>' once in the documentation string to specify which key map to use. Do this before the first use of `\\[...]'. The text inside the `\\<...>' should be the name of the variable containing the local keymap for the major mode. It is not practical to use `\\[...]' very many times, because display of the documentation string will become slow. So use this to describe the most important commands in your major mode, and then use `\\{...}' to display the rest of the mode's keymap.  File: lispref.info, Node: Comment Tips, Next: Library Headers, Prev: Documentation Tips, Up: Tips Tips on Writing Comments ======================== We recommend these conventions for where to put comments and how to indent them: `;' Comments that start with a single semicolon, `;', should all be aligned to the same column on the right of the source code. Such comments usually explain how the code on the same line does its job. In Lisp mode and related modes, the `M-;' (`indent-for-comment') command automatically inserts such a `;' in the right place, or aligns such a comment if it is already present. This and following examples are taken from the Emacs sources. (setq base-version-list ; there was a base (assoc (substring fn 0 start-vn) ; version to which file-version-assoc-list)) ; this looks like ; a subversion `;;' Comments that start with two semicolons, `;;', should be aligned to the same level of indentation as the code. Such comments usually describe the purpose of the following lines or the state of the program at that point. For example: (prog1 (setq auto-fill-function ... ... ;; update modeline (redraw-modeline))) Every function that has no documentation string (because it is use only internally within the package it belongs to), should have instead a two-semicolon comment right before the function, explaining what the function does and how to call it properly. Explain precisely what each argument means and how the function interprets its possible values. `;;;' Comments that start with three semicolons, `;;;', should start at the left margin. Such comments are used outside function definitions to make general statements explaining the design principles of the program. For example: ;;; This Lisp code is run in XEmacs ;;; when it is to operate as a server ;;; for other processes. Another use for triple-semicolon comments is for commenting out lines within a function. We use triple-semicolons for this precisely so that they remain at the left margin. (defun foo (a) ;;; This is no longer necessary. ;;; (force-mode-line-update) (message "Finished with %s" a)) `;;;;' Comments that start with four semicolons, `;;;;', should be aligned to the left margin and are used for headings of major sections of a program. For example: ;;;; The kill ring The indentation commands of the Lisp modes in XEmacs, such as `M-;' (`indent-for-comment') and (`lisp-indent-line') automatically indent comments according to these conventions, depending on the number of semicolons. *Note Manipulating Comments: (emacs)Comments.  File: lispref.info, Node: Library Headers, Prev: Comment Tips, Up: Tips Conventional Headers for XEmacs Libraries ========================================= XEmacs has conventions for using special comments in Lisp libraries to divide them into sections and give information such as who wrote them. This section explains these conventions. First, an example: ;;; lisp-mnt.el --- minor mode for Emacs Lisp maintainers ;; Copyright (C) 1992 Free Software Foundation, Inc. ;; Author: Eric S. Raymond ;; Maintainer: Eric S. Raymond ;; Created: 14 Jul 1992 ;; Version: 1.2 ;; Keywords: docs ;; This file is part of XEmacs. COPYING PERMISSIONS... The very first line should have this format: ;;; FILENAME --- DESCRIPTION The description should be complete in one line. After the copyright notice come several "header comment" lines, each beginning with `;; HEADER-NAME:'. Here is a table of the conventional possibilities for HEADER-NAME: `Author' This line states the name and net address of at least the principal author of the library. If there are multiple authors, you can list them on continuation lines led by `;;' and a tab character, like this: ;; Author: Ashwin Ram ;; Dave Sill ;; Dave Brennan ;; Eric Raymond `Maintainer' This line should contain a single name/address as in the Author line, or an address only, or the string `FSF'. If there is no maintainer line, the person(s) in the Author field are presumed to be the maintainers. The example above is mildly bogus because the maintainer line is redundant. The idea behind the `Author' and `Maintainer' lines is to make possible a Lisp function to "send mail to the maintainer" without having to mine the name out by hand. Be sure to surround the network address with `<...>' if you include the person's full name as well as the network address. `Created' This optional line gives the original creation date of the file. For historical interest only. `Version' If you wish to record version numbers for the individual Lisp program, put them in this line. `Adapted-By' In this header line, place the name of the person who adapted the library for installation (to make it fit the style conventions, for example). `Keywords' This line lists keywords for the `finder-by-keyword' help command. This field is important; it's how people will find your package when they're looking for things by topic area. To separate the keywords, you can use spaces, commas, or both. Just about every Lisp library ought to have the `Author' and `Keywords' header comment lines. Use the others if they are appropriate. You can also put in header lines with other header names--they have no standard meanings, so they can't do any harm. We use additional stylized comments to subdivide the contents of the library file. Here is a table of them: `;;; Commentary:' This begins introductory comments that explain how the library works. It should come right after the copying permissions. `;;; Change log:' This begins change log information stored in the library file (if you store the change history there). For most of the Lisp files distributed with XEmacs, the change history is kept in the file `ChangeLog' and not in the source file at all; these files do not have a `;;; Change log:' line. `;;; Code:' This begins the actual code of the program. `;;; FILENAME ends here' This is the "footer line"; it appears at the very end of the file. Its purpose is to enable people to detect truncated versions of the file from the lack of a footer line.  File: lispref.info, Node: Building XEmacs and Object Allocation, Next: Standard Errors, Prev: Tips, Up: Top Building XEmacs; Allocation of Objects ************************************** This chapter describes how the runnable XEmacs executable is dumped with the preloaded Lisp libraries in it and how storage is allocated. There is an entire separate document, the `XEmacs Internals Manual', devoted to the internals of XEmacs from the perspective of the C programmer. It contains much more detailed information about the build process, the allocation and garbage-collection process, and other aspects related to the internals of XEmacs. * Menu: * Building XEmacs:: How to preload Lisp libraries into XEmacs. * Pure Storage:: A kludge to make preloaded Lisp functions sharable. * Garbage Collection:: Reclaiming space for Lisp objects no longer used.