elisp: Byte-Code Objects

 
 16.7 Byte-Code Function Objects
 ===============================
 
 Byte-compiled functions have a special data type: they are “byte-code
 function objects”.  Whenever such an object appears as a function to be
 called, Emacs uses the byte-code interpreter to execute the byte-code.
 
    Internally, a byte-code function object is much like a vector; its
 elements can be accessed using ‘aref’.  Its printed representation is
 like that for a vector, with an additional ‘#’ before the opening ‘[’.
 It must have at least four elements; there is no maximum number, but
 only the first six elements have any normal use.  They are:
 
 ARGDESC
      The descriptor of the arguments.  This can either be a list of
      arguments, as described in SeeArgument List, or an integer
      encoding the required number of arguments.  In the latter case, the
      value of the descriptor specifies the minimum number of arguments
      in the bits zero to 6, and the maximum number of arguments in bits
      8 to 14.  If the argument list uses ‘&rest’, then bit 7 is set;
      otherwise it’s cleared.
 
      If ARGDESC is a list, the arguments will be dynamically bound
      before executing the byte code.  If ARGDESC is an integer, the
      arguments will be instead pushed onto the stack of the byte-code
      interpreter, before executing the code.
 
 BYTE-CODE
      The string containing the byte-code instructions.
 
 CONSTANTS
      The vector of Lisp objects referenced by the byte code.  These
      include symbols used as function names and variable names.
 
 STACKSIZE
      The maximum stack size this function needs.
 
 DOCSTRING
      The documentation string (if any); otherwise, ‘nil’.  The value may
      be a number or a list, in case the documentation string is stored
      in a file.  Use the function ‘documentation’ to get the real
      documentation string (SeeAccessing Documentation).
 
 INTERACTIVE
      The interactive spec (if any).  This can be a string or a Lisp
      expression.  It is ‘nil’ for a function that isn’t interactive.
 
    Here’s an example of a byte-code function object, in printed
 representation.  It is the definition of the command ‘backward-sexp’.
 
      #[256
        "\211\204^G^@\300\262^A\301^A[!\207"
        [1 forward-sexp]
        3
        1793299
        "^p"]
 
    The primitive way to create a byte-code object is with
 ‘make-byte-code’:
 
  -- Function: make-byte-code &rest elements
      This function constructs and returns a byte-code function object
      with ELEMENTS as its elements.
 
    You should not try to come up with the elements for a byte-code
 function yourself, because if they are inconsistent, Emacs may crash
 when you call the function.  Always leave it to the byte compiler to
 create these objects; it makes the elements consistent (we hope).