home *** CD-ROM | disk | FTP | other *** search
/ Atari FTP / ATARI_FTP_0693.zip / ATARI_FTP_0693 / Languages / Xlisp2.1 / xlispdoc.txz / xlispdoc
Text File  |  1992-10-30  |  174KB  |  3,916 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.                          XLISP: An Object-oriented Lisp
  16.  
  17.                                    Version 2.0
  18.  
  19.                                 February 6, 1988
  20.  
  21.  
  22.                                        by
  23.                                David Michael Betz
  24.                                   P.O. Box 144
  25.                              Peterborough, NH 03458
  26.  
  27.                               (603) 924-4145 (home)
  28.  
  29.                     Copyright (c) 1988, by David Michael Betz
  30.                                All Rights Reserved
  31.             Permission is granted for unrestricted non-commercial use
  32.  
  33.  
  34.  
  35.  
  36.         Additions to the manual u_n_d_e_r_l_i_n_e_d_, by Tom Almy October 26, 1990.
  37.  
  38.      This  distributed  version  has  the  added  functions  of  XLISP  2.1
  39.      incorporated,  as  well as  other enhancements,  all  of which  can be
  40.      eliminated via compilation options.
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.                                 Table of Contents
  51.  
  52.      INTRODUCTION  . . . . . . . . . . . . . . . . . . . . . . . . . .    1
  53.  
  54.      A NOTE FROM THE AUTHOR  . . . . . . . . . . . . . . . . . . . . .    2
  55.  
  56.      XLISP COMMAND LOOP  . . . . . . . . . . . . . . . . . . . . . . .    3
  57.  
  58.      BREAK COMMAND LOOP  . . . . . . . . . . . . . . . . . . . . . . .    5
  59.  
  60.      DATA TYPES  . . . . . . . . . . . . . . . . . . . . . . . . . . .    6
  61.  
  62.      THE EVALUATOR . . . . . . . . . . . . . . . . . . . . . . . . . .    8
  63.  
  64.      HOOK FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . .    9
  65.  
  66.      LEXICAL CONVENTIONS . . . . . . . . . . . . . . . . . . . . . . .   10
  67.  
  68.      READTABLES  . . . . . . . . . . . . . . . . . . . . . . . . . . .   12
  69.  
  70.      LAMBDA LISTS  . . . . . . . . . . . . . . . . . . . . . . . . . .   14
  71.  
  72.      OBJECTS . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   16
  73.  
  74.      SYMBOLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   20
  75.  
  76.      EVALUATION FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . .   21
  77.  
  78.      SYMBOL FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . .   23
  79.  
  80.      PROPERTY LIST FUNCTIONS . . . . . . . . . . . . . . . . . . . . .   26
  81.  
  82.      ARRAY FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . . . .   27
  83.  
  84.      SEQUENCE FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . .   28
  85.  
  86.      LIST FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . . .   32
  87.  
  88.      DESTRUCTIVE LIST FUNCTIONS  . . . . . . . . . . . . . . . . . . .   36
  89.  
  90.      ARITHMETIC FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . .   37
  91.  
  92.      BITWISE LOGICAL FUNCTIONS . . . . . . . . . . . . . . . . . . . .   40
  93.  
  94.      STRING FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . .   41
  95.  
  96.      CHARACTER FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . .   43
  97.  
  98.      STRUCTURE FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . .   45
  99.  
  100.      OBJECT FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . .   47
  101.  
  102.      PREDICATE FUNCTIONS . . . . . . . . . . . . . . . . . . . . . . .   49
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.      XLISP 2.0                  Table of Contents
  111.  
  112.  
  113.      CONTROL CONSTRUCTS  . . . . . . . . . . . . . . . . . . . . . . .   52
  114.  
  115.      LOOPING CONSTRUCTS  . . . . . . . . . . . . . . . . . . . . . . .   55
  116.  
  117.      THE PROGRAM FEATURE . . . . . . . . . . . . . . . . . . . . . . .   56
  118.  
  119.      INPUT/OUTPUT FUNCTIONS  . . . . . . . . . . . . . . . . . . . . .   58
  120.  
  121.      THE FORMAT FUNCTION . . . . . . . . . . . . . . . . . . . . . . .   60
  122.  
  123.      FILE I/O FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . .   61
  124.  
  125.      STRING STREAM FUNCTIONS . . . . . . . . . . . . . . . . . . . . .   63
  126.  
  127.      DEBUGGING AND ERROR HANDLING FUNCTIONS  . . . . . . . . . . . . .   64
  128.  
  129.      SYSTEM FUNCTIONS  . . . . . . . . . . . . . . . . . . . . . . . .   66
  130.  
  131.      ADDITIONAL FUNCTIONS AND UTILITIES  . . . . . . . . . . . . . . .   69
  132.  
  133.      EXAMPLES: FILE I/O FUNCTIONS  . . . . . . . . . . . . . . . . . .   73
  134.  
  135.      INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   75
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.      XLISP 2.0                    INTRODUCTION                       Page 1
  144.  
  145.  
  146.  
  147.  
  148.      INTRODUCTION
  149.  
  150.      XLISP is  an experimental programming  language combining some  of the
  151.      features of Common Lisp  with an object-oriented extension capability.
  152.      It  was  implemented  to allow  experimentation  with  object-oriented
  153.      programming on small computers.
  154.  
  155.      There are currently implementations of XLISP running on the IBM-PC and
  156.      clones under MS-DOS, on  the Macintosh, the Atari-ST and the Amiga. It
  157.      is  completely written in the  programming language 'C'  and is easily
  158.      extended  with  user written  built-in  functions and  classes.  It is
  159.      available in source form to non-commercial users.
  160.  
  161.      Many  Common Lisp functions are  built into XLISP.  In addition, XLISP
  162.      defines the  objects 'Object' and  'Class' as primitives.  'Object' is
  163.      the only  class that has  no superclass and  hence is the  root of the
  164.      class heirarchy  tree. 'Class' is  the class of which  all classes are
  165.      instances (it is the only object that is an instance of itself).
  166.  
  167.      This  document  is  a brief  description  of  XLISP.  It assumes  some
  168.      knowledge  of LISP and some  understanding of the  concepts of object-
  169.      oriented programming.
  170.  
  171.      I recommend  the book  "LISP" by  Winston  and Horn  and published  by
  172.      Addison Wesley for  learning Lisp. The first  edition of this  book is
  173.      based on MacLisp and the second edition is based on Common Lisp. XLISP
  174.      will continue to migrate towards compatibility with Common Lisp.
  175.  
  176.      You  will probably also need a copy  of "Common Lisp: The Language" by
  177.      Guy L. Steele,  Jr., published by Digital Press to  use as a reference
  178.      for some of the  Common Lisp functions that are described only briefly
  179.      in this document.
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.      XLISP 2.0               A NOTE FROM THE AUTHOR                  Page 2
  188.  
  189.  
  190.  
  191.      A NOTE FROM THE AUTHOR
  192.  
  193.      If you have any problems with XLISP, feel  free to contact me for help
  194.      or advice. Please  remember that  since XLISP is  available in  source
  195.      form in  a high level language,  many users have been  making versions
  196.      available on  a variety of machines.  If you call to  report a problem
  197.      with a specific version, I may not be able to help you if that version
  198.      runs  on  a machine  to which  I don't  have  access. Please  have the
  199.      version  number of the version that you are running readily accessible
  200.      before calling me.
  201.  
  202.      If you find  a bug in XLISP, first  try to fix the bug  yourself using
  203.      the source code  provided. If you  are successful in  fixing the  bug,
  204.      send the bug report along with the fix to me. If you don't have access
  205.      to a C compiler or are unable to fix a bug, please send the bug report
  206.      to me and I'll try to fix it.
  207.  
  208.      Any suggestions for improvements will be welcomed. Feel free to extend
  209.      the language in whatever way suits your needs. However, PLEASE DO  NOT
  210.      RELEASE  ENHANCED VERSIONS WITHOUT CHECKING  WITH ME FIRST!!   I would
  211.      like to be the clearing house for  new features added to XLISP. If you
  212.      want to add features for your own personal use, go ahead. But,  if you
  213.      want  to distribute your  enhanced version,  contact me  first. Please
  214.      remember that the goal of XLISP is to provide  a language to learn and
  215.      experiment  with   LISP  and  object-oriented  programming   on  small
  216.      computers. I don't want it to get so big that it requires megabytes of
  217.      memory to run.
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.      XLISP 2.0                 XLISP COMMAND LOOP                    Page 3
  226.  
  227.  
  228.  
  229.      XLISP COMMAND LOOP
  230.  
  231.      When   XLISP  is  started,  it  first  tries  to  load  the  workspace
  232.      "xlisp.wks" from the current directory. If that file doesn't exist, o_r_
  233.      t_h_e_  "_-_w_"_  f_l_a_g_ i_s_  i_n_  t_h_e_  c_o_m_m_a_n_d_  l_i_n_e_,_  XLISP builds  an  initial
  234.      workspace, empty except for the built-in functions and symbols.
  235.  
  236.      Then,_  p_r_o_v_i_d_i_n_g_ x_l_i_s_p_._w_k_s_  w_a_s_ n_o_t_  l_o_a_d_e_d_,_   XLISP attempts  to load
  237.      "init.lsp" from the current  directory. It then loads any  files named
  238.      as parameters on  the command  line (after appending  ".lsp" to  their
  239.      names). I_f_ t_h_e_ "_-_v_"_ f_l_a_g_  i_s_ i_n_ t_h_e_ c_o_m_m_a_n_d_  l_i_n_e_,_ t_h_e_n_ t_h_e_ f_i_l_e_s_  a_r_e_
  240.      l_o_a_d_e_d_ v_e_r_b_o_s_e_l_y_._ T_h_e_ o_p_t_i_o_n_ "_-_t_ f_i_l_e_n_a_m_e_"_ w_i_l_l_ o_p_e_n_ a_ t_r_a_n_s_c_r_i_p_t_ f_i_l_e_
  241.      o_f_ t_h_e_ n_a_m_e_ "_f_i_l_e_n_a_m_e_"_._
  242.  
  243.      XLISP then issues the following prompt:
  244.  
  245.      >
  246.  
  247.      This indicates that XLISP is waiting for an expression to be typed.
  248.  
  249.      When  a  complete expression  has  been  entered,  XLISP  attempts  to
  250.      evaluate that expression.  If the  expression evaluates  successfully,
  251.      XLISP prints the result and then returns to the initial prompt waiting
  252.      for another expression to be typed.
  253.  
  254.      T_h_e_  f_o_l_l_o_w_i_n_g_ c_o_n_t_r_o_l_ c_h_a_r_a_c_t_e_r_s_ c_a_n_  b_e_ u_s_e_d_ w_h_i_l_e_  X_L_I_S_P_ i_s_ w_a_i_t_i_n_g_
  255.      f_o_r_ i_n_p_u_t_:_
  256.  
  257.           B_a_c_k_s_p_a_c_e_ d_e_l_e_t_e_ l_a_s_t_ c_h_a_r_a_c_t_e_r_
  258.           D_e_l_       d_e_l_e_t_e_ l_a_s_t_ c_h_a_r_a_c_t_e_r_
  259.           t_a_b_       t_a_b_s_ o_v_e_r_ (_t_r_e_a_t_e_d_ a_s_ s_p_a_c_e_ b_y_ X_L_I_S_P_ r_e_a_d_e_r_)_
  260.           c_t_r_l_-_C_    g_o_t_o_ t_o_p_ l_e_v_e_l_
  261.           c_t_r_l_-_G_    c_l_e_a_n_u_p_ a_n_d_ r_e_t_u_r_n_ o_n_e_ l_e_v_e_l_
  262.           c_t_r_l_-_Z_    e_n_d_ o_f_ f_i_l_e_ (_r_e_t_u_r_n_s_ o_n_e_ l_e_v_e_l_ o_r_ e_x_i_t_s_ p_r_o_g_r_a_m_)_
  263.           c_t_r_l_-_P_    p_r_o_c_e_e_d_ (_c_o_n_t_i_n_u_e_)_
  264.           c_t_r_l_-_T_    p_r_i_n_t_ i_n_f_o_r_m_a_t_i_o_n_ (_a_d_d_e_d_ f_u_n_c_t_i_o_n_ b_y_ T_A_A_)_
  265.  
  266.      T_h_e_   f_o_l_l_o_w_i_n_g_  c_o_n_t_r_o_l_  c_h_a_r_a_c_t_e_r_s_  c_a_n_  b_e_  t_y_p_e_d_  w_h_i_l_e_  X_L_I_S_P_  i_s_
  267.      e_x_e_c_u_t_i_n_g_:_
  268.  
  269.           c_t_r_l_-_B_    B_R_E_A_K_ -_-_ e_n_t_e_r_ b_r_e_a_k_ l_o_o_p_
  270.           c_t_r_l_-_S_    P_a_u_s_e_ u_n_t_i_l_ a_n_o_t_h_e_r_ k_e_y_ i_s_ s_t_r_u_c_k_
  271.           c_t_r_l_-_C_    g_o_ t_o_ t_o_p_ l_e_v_e_l_ (_i_f_ l_u_c_k_y_:_ c_t_r_l_-_B_,_c_t_r_l_-_C_ i_s_ s_a_f_e_r_)_
  272.           c_t_r_l_-_T_    p_r_i_n_t_ i_n_f_o_r_m_a_t_i_o_n_
  273.  
  274.      I_f_ t_h_e_ g_l_o_b_a_l_ v_a_r_i_a_b_l_e_ *_d_o_s_-_i_n_p_u_t_*_ i_s_ s_e_t_ n_o_n_-_n_i_l_,_ D_O_S_ i_s_ u_s_e_d_ t_o_ r_e_a_d_
  275.      e_n_t_i_r_e_  i_n_p_u_t_ l_i_n_e_s_._ O_p_e_r_a_t_i_o_n_ t_h_i_s_  w_a_y_ i_s_ c_o_n_v_e_n_i_e_n_t_  i_f_ c_e_r_t_a_i_n_ D_O_S_
  276.      u_t_i_l_i_t_i_e_s_,_ s_u_c_h_  a_s_ C_E_D_,_ a_r_e_ u_s_e_d_,_ o_r_ i_f_ X_L_I_S_P_  i_s_ r_u_n_ u_n_d_e_r_ a_n_ e_d_i_t_o_r_
  277.      l_i_k_e_  E_P_S_I_L_O_N_._ I_n_ t_h_i_s_ c_a_s_e_,_ n_o_r_m_a_l_ c_o_m_m_a_n_d_ l_i_n_e_ e_d_i_t_i_n_g_ i_s_ a_v_a_i_l_a_b_l_e_,_
  278.      b_u_t_ t_h_e_ c_o_n_t_r_o_l_ k_e_y_s_  w_i_l_l_ n_o_t_ w_o_r_k_ (_i_n_ p_a_r_t_i_c_u_l_a_r_,_ c_t_r_l_-_C_  w_i_l_l_ c_a_u_s_e_
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.      XLISP 2.0                 XLISP COMMAND LOOP                    Page 4
  287.  
  288.  
  289.      t_h_e_ p_r_o_g_r_a_m_ t_o_  e_x_i_t_!_)_._ U_s_e_ t_h_e_  X_L_I_S_P_ f_u_n_c_t_i_o_n_s_ t_o_p_-_l_e_v_e_l_,_  c_l_e_a_n_-_u_p_,_
  290.      a_n_d_ c_o_n_t_i_n_u_e_ i_n_s_t_e_a_d_ o_f_ c_t_r_l_-_C_,_ c_t_r_l_-_G_,_ a_n_d_ c_t_r_l_-_P_._
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.      XLISP 2.0                 BREAK COMMAND LOOP                    Page 5
  299.  
  300.  
  301.  
  302.      BREAK COMMAND LOOP
  303.  
  304.      When  XLISP encounters  an error  while evaluating  an  expression, it
  305.      attempts to handle the error in the following way:
  306.  
  307.      If the symbol  '*breakenable*' is true,  the message corresponding  to
  308.      the  error is  printed. If  the error  is correctable,  the correction
  309.      message is printed.
  310.  
  311.      If the symbol  '*tracenable*' is  true, a trace  back is printed.  The
  312.      number  of  entries  printed  depends  on  the  value  of  the  symbol
  313.      '*tracelimit*'.  If this  symbol  is set  to  something other  than  a
  314.      number, the entire trace back stack is printed.
  315.  
  316.      XLISP then enters  a read/eval/print loop to allow the user to examine
  317.      the state  of the interpreter in  the context of the  error. This loop
  318.      differs  from the normal top-level read/eval/print loop in that if the
  319.      user  invokes  the function  'continue',  XLISP will  continue  from a
  320.      correctable error. If the user invokes the function  'clean-up', XLISP
  321.      will abort  the break loop  and return  to the top  level or  the next
  322.      lower numbered break loop.  When in a break  loop, XLISP prefixes  the
  323.      break level to the normal prompt.
  324.  
  325.      If  the symbol '*breakenable*' is  NIL, XLISP looks  for a surrounding
  326.      errset  function. If  one is  found, XLISP examines  the value  of the
  327.      print flag. If this flag is true, the error message is printed. In any
  328.      case, XLISP causes the errset function call to return NIL.
  329.  
  330.      If there is  no surrounding  errset function, XLISP  prints the  error
  331.      message and returns to the top level.
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.      XLISP 2.0                     DATA TYPES                        Page 6
  340.  
  341.  
  342.  
  343.      DATA TYPES
  344.  
  345.      (_M_a_j_o_r_ m_o_d_i_f_i_c_a_t_i_o_n_s_)_
  346.  
  347.      There are several different data types available to XLISP
  348.      programmers. Typical  implementation limits are shown for  32 bit word
  349.      systems.   Values  in   square  brackets   apply  to  16   bit  MS-DOS
  350.      implementations.
  351.  
  352.      All data nodes are  effectively cons cells consisting of  two pointers
  353.      and and one or two  bytes of identification flags  (9 or 10 bytes  per
  354.      cell). Node space is managed and garbage collected by XLISP. Array and
  355.      string storage is  either allocated by  the C runtime  or managed  and
  356.      garbaged  collected  by  XLISP  (compilation option).  If  C  does the
  357.      allocation,  memory  fragmentation  can  occur. Fragmentation  can  be
  358.      eliminated by saving the image and restarting XLISP.
  359.  
  360.          lists
  361.           NIL is a special pointer.
  362.          arrays
  363.           The CDR field  of an  array points to  the dynamically  allocated
  364.           data  array, while  the CAR  contains the  integer length  of the
  365.           array. Elements in  the data  array are pointers  to other  cells
  366.           [Size limited to 16383]
  367.          character strings
  368.           Implemented like arrays, except string  array is byte indexed and
  369.           contains the  actual characters. Note that  unlike the underlying
  370.           C, the null character (value 0) is valid. [Size limited to 32767]
  371.          symbols
  372.           Implemented  as a 4 element  array. The elements  are value cell,
  373.           function cell, property list, and  print name (a character string
  374.           node).
  375.          integers
  376.           Small integers (> -129 and <256) are statically allocated and are
  377.           thus always  EQ integers of the same value. The CAR field is used
  378.           to hold the value, which is a 32 bit signed integer.
  379.          characters
  380.           All  characters   are  statically  allocated  and   are  thus  EQ
  381.           characters  of the same value. The CAR  field is used to hold the
  382.           value. In XLISP characters are "unsigned" and thus range in value
  383.           from 0 to 255.
  384.          floats
  385.           The CAR  and CDR fields hold  the value, which is  typically a 64
  386.           bit IEEE floating point number.
  387.          objects
  388.           Implemented  as an  array  of instance  variable  count plus  one
  389.           elements.  The first  element is  the  object's class,  while the
  390.           remaining arguments are the instance variables.
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.      XLISP 2.0                     DATA TYPES                        Page 7
  399.  
  400.  
  401.          streams (file)
  402.           The CAR  and CDR fields are used  in a system dependent  way as a
  403.           file pointer. Files are not kept open across image saves, but the
  404.           standard files are opened automatically during image restores.
  405.          streams (string)
  406.           Implemented as a TCONC list of characters (see page 34).
  407.          subrs (built-in functions)
  408.           The CAR field points to the actual code to execute, while the CDR
  409.           field is an internal pointer to the name of the function.
  410.          fsubrs (special forms)
  411.           Same implementation as subrs.
  412.          closures (user defined functions)
  413.           Implemented as an array of 11 elements:
  414.           1.   name symbol or NIL
  415.           2.   'lambda or 'macro
  416.           3.   list of required arguments
  417.           4.   optional arguments as list  of (<arg> <init>  <specified-p>)
  418.                triples.
  419.           5.   &rest argument
  420.           6.   &key arguments as list of (<key> <arg> <init> <specified-p>)
  421.                quadruples.
  422.           7.   &aux arguments as list of (<arg> <init>) pairs.
  423.           8.   function body
  424.           9.   value environment (see page 65 for format)
  425.           10.  function environment
  426.           11.  argument list (unprocessed)
  427.          structures
  428.           Implemented as an array with first element being a pointer to the
  429.           structure  name  string, and  the  remaining  elements being  the
  430.           structure elements.
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.      XLISP 2.0                    THE EVALUATOR                      Page 8
  439.  
  440.  
  441.  
  442.      THE EVALUATOR
  443.  
  444.      The process of evaluation in XLISP:
  445.  
  446.      Strings,  integers, characters,  floats, objects,  arrays, s_t_r_u_c_t_u_r_e_s_,_
  447.      streams, subrs, fsubrs and closures evaluate to themselves.
  448.  
  449.      Symbols act as  variables and  are evaluated by  retrieving the  value
  450.      associated with their current binding.
  451.  
  452.      Lists are  evaluated by examining  the first  element of the  list and
  453.      then taking one of the following actions:
  454.  
  455.           If  it is  a  symbol, the  functional  binding of  the  symbol is
  456.           retrieved.
  457.  
  458.           If it is  a lambda expression, a  closure is constructed for  the
  459.           function described by the lambda expression.
  460.  
  461.           If it is a subr, fsubr or closure, it stands for itself.
  462.  
  463.           Any other value is an error.
  464.  
  465.      Then, the value produced by the previous step is examined:
  466.  
  467.           If it  is a  subr or  closure, the  remaining  list elements  are
  468.           evaluated and the subr  or closure is applied to  these evaluated
  469.           expressions.
  470.  
  471.           If it  is an fsubr, the  fsubr is called with  the remaining list
  472.           elements as arguments (unevaluated).
  473.  
  474.           If  it is a macro, the macro  is expanded with the remaining list
  475.           elements as arguments (unevaluated).  The macro expansion is then
  476.           evaluated in place of the original macro call.
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.      XLISP 2.0                   HOOK FUNCTIONS                      Page 9
  485.  
  486.  
  487.  
  488.      HOOK FUNCTIONS
  489.  
  490.      (_N_e_w_ s_e_c_t_i_o_n_)_
  491.  
  492.      The  evalhook  and  applyhook  facility are  useful  for  implementing
  493.      debugging programs or  just observing  the operation of  XLISP. It  is
  494.      possible to control evaluation of forms in any context.
  495.  
  496.      If the  symbol '*evalhook*' is bound to a function closure, then every
  497.      call  of  eval  will  call  this  function.  The  function  takes  two
  498.      arguements, the form to be evaluated and execution environment. During
  499.      the  execution  of this  function,  *evalhook*  (and *applyhook*)  are
  500.      dynamically bound to NIL to prevent undesirable recursion. This "hook"
  501.      function returns the result of the evaluation.
  502.  
  503.      If  the  symbol  '*applyhook*' is  bound  to  a  function, then  every
  504.      function application within an eval will call this function (note that
  505.      the function apply, and others which do not use eval,  will not invoke
  506.      the apply  hook  function).  The  function takes  two  arguments,  the
  507.      function closure and  the argument list (which is  already evaluated).
  508.      During execution  of this hook function,  *applyhook* (and *evalhook*)
  509.      are  dynamically bound  to NIL  to prevent  undesired recursion.  This
  510.      function is to return the result of the function application.
  511.  
  512.      Note that the hook functions cannot reset *evalhook* or *applyhook* to
  513.      NIL, because upon exit these values will be reset. An excape mechanism
  514.      is  provided --  execution of  'top-level', or  any error  that causes
  515.      return  to the  top  level, will  unhook  the functions.  Applications
  516.      should  bind   these  values   either  via  'progv',   'evalhook',  or
  517.      'applyhook'.
  518.  
  519.      The  functions  'evalhook'  and  'applyhook'  allowed  for  controlled
  520.      application of the hook functions. The form supplied as an argument to
  521.      'evalhook', or  the function application given to 'applyhook', are not
  522.      hooked themselves, but  any subsidiary forms and  applications are. In
  523.      addition, by supplying NIL  values for the hook  functions, 'evalhook'
  524.      can be used to execute a  form within a specific environment passed as
  525.      an argument.
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.  
  533.      XLISP 2.0                 LEXICAL CONVENTIONS                  Page 10
  534.  
  535.  
  536.  
  537.      LEXICAL CONVENTIONS
  538.  
  539.      (_M_a_j_o_r_ e_x_p_a_n_s_i_o_n_ o_f_ o_r_i_g_i_n_a_l_ d_o_c_u_m_e_n_t_)_
  540.  
  541.      The  following  conventions  must  be  followed  when  entering  XLISP
  542.      programs:
  543.  
  544.      Comments  in XLISP code begin with a semi-colon character and continue
  545.      to the end of the line.
  546.  
  547.      Except  when  escape sequences  are used,  symbol  names in  XLISP can
  548.      consist  of any sequence of  non-blank printable characters except the
  549.      terminating macro characters:
  550.  
  551.           ( ) ' ` , " ;
  552.  
  553.      and the escape characters:
  554.  
  555.           \ |
  556.  
  557.      In addition, the first character may not be '#' (non-terminating macro
  558.      character), nor may the  symbol have identical syntax with  an integer
  559.      or floating point literal. Uppercase and lowercase  characters are not
  560.      distinguished within symbol names. All lowercase characters are mapped
  561.      to uppercase on input.
  562.  
  563.      Any  printing character, including whitespace, may be part of a symbol
  564.      name when  escape  characters  are  used. The  backslash  escapes  the
  565.      following  character,  while multiple  characters  can  be escaped  by
  566.      placing them between vertical bars. At all times the backslash must be
  567.      used to escape either escape characters.
  568.  
  569.      For semantic  reasons, certain chararacter  sequences should/can never
  570.      be used as symbols in XLISP. A  single period is used to denote dotted
  571.      lists.  The symbol NIL represents an empty list. Symbols starting with
  572.      a  colon are keywords,   and will always  evaluate to themselves. Thus
  573.      they  should not  be used  as regular  symbols. The  symbol T  is also
  574.      reserved for use as the truth value.
  575.  
  576.      Integer literals consist of a  sequence of digits optionally beginning
  577.      with a sign ('+' or '-'). The range of values an integer can represent
  578.      is limited by the size of a C 'long'  on the machine on which XLISP is
  579.      running.
  580.  
  581.      Floating point literals  consist of  a sequence  of digits  optionally
  582.      beginning with a sign  ('+' or '-')  and including one  or both of  an
  583.      embedded decimal point  or a trailing exponent. The  optional exponent
  584.      is denoted  by an  'E' followed by  an optional  sign and one  or more
  585.      digits. The range  of values a floating point number  can represent is
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.      XLISP 2.0                 LEXICAL CONVENTIONS                  Page 11
  594.  
  595.  
  596.      limited by the size  of a C 'float' ('double' on  machines with 32 bit
  597.      addresses) on the machine on which XLISP is running.
  598.  
  599.      Integer  and  floating  point  literals cannot  have  embedded  escape
  600.      characters. If they do, they are  treated as symbols. Thus '12\3' is a
  601.      symbol even though it would appear to be identical to '123'.
  602.  
  603.      Character literals are handled via the #\ read-macro construct:
  604.  
  605.           #\<char>       == the ASCII code of the printing character
  606.           #\newline      == ASCII linefeed character
  607.           #\space        == ASCII space character
  608.           #\rubout       == ASCII rubout (DEL)
  609.           #\C-<char>     == ASCII control character
  610.           #\M-<char>     == ASCII character with msb set (Meta character)
  611.           #\M-C-<char>   == ASCII control character with msb set
  612.  
  613.  
  614.      Literal  strings  are sequences  of  characters  surrounded by  double
  615.      quotes  (the " read-macro). Within quoted strings the '\' character is
  616.      used to allow non-printable characters to be included. The codes
  617.      recognized are:
  618.  
  619.           \\        means the character '\'
  620.           \n        means newline
  621.           \t        means tab
  622.           \r        means return
  623.           \f        means form feed
  624.           \nnn      means the character whose octal code is nnn
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.      XLISP 2.0                     READTABLES                       Page 12
  633.  
  634.  
  635.  
  636.      READTABLES
  637.  
  638.      (_M_a_j_o_r_ m_o_d_i_f_i_c_a_t_i_o_n_s_)_
  639.  
  640.      The behaviour of the reader is controlled by a data structure called a
  641.      "readtable". The  reader uses  the  symbol *readtable*  to locate  the
  642.      current  readtable. This  table controls  the interpretation  of input
  643.      characters  -- if it is  changed then the  section LEXICAL CONVENTIONS
  644.      may not apply.  The readtable is  an array with  256 entries, one  for
  645.      each of the extended ASCII character codes. Each entry contains one of
  646.      the  following values, with the initial entries assigned to the values
  647.      indicated:
  648.  
  649.           :white-space        A whitespace  character -  tab,  cr, lf,  ff,
  650.                               space
  651.           (:tmacro . fun)     terminating readmacro - ( ) " , ; ' `
  652.           (:nmacro . fun)     non-terminating readmacro - #
  653.           :sescape            Single escape character - \
  654.           :mescape            Multiple escape character - |
  655.           :constituent        Indicating a symbol constituent (all printing
  656.                               characters not listed above)
  657.           nil                 Indicating  an invalid  character (everything
  658.                               else)
  659.  
  660.      In the case of :TMACRO and :NMACRO, the "fun" component is a function.
  661.      This  can  either  be  a  built-in  readmacro  function  or  a  lambda
  662.      expression.  The function takes two parameters. The first is the input
  663.      stream and the second  is the character that caused the  invocation of
  664.      the  readmacro. The readmacro  function should return  NIL to indicate
  665.      that the character should be treated as white space or  a value consed
  666.      with NIL  to indicate  that  the readmacro  should  be treated  as  an
  667.      occurance of the  specified value.  Of course, the  readmacro code  is
  668.      free to read additional characters from the input stream. A :nmacro is
  669.      a symbol constituent except as the first character of a symbol.
  670.  
  671.      As  an example, the following read macro allows the square brackets to
  672.      be used as a more visibly appealing alternative to the SEND function:
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.      XLISP 2.0                     READTABLES                       Page 13
  681.  
  682.  
  683.      (setf (aref *readtable* (char-int #\[)) ; #\[ table entry
  684.            (cons :tmacro
  685.                  (lambda (f c &aux ex) ; second arg is not used
  686.                          (do ()
  687.                              ((eq (peek-char t f) #\]))
  688.                              (setf ex (append ex (list (read f)))))
  689.                          (read-char f) ; toss the trailing #\]
  690.                          (cons (cons 'send ex) nil))))
  691.  
  692.      (setf (aref *readtable* (char-int #\]))
  693.            (cons :tmacro
  694.                  (lambda (f c)
  695.                          (error "misplaced right bracket"))))
  696.  
  697.  
  698.      XLISP defines several useful read macros:
  699.  
  700.           '<expr>             == (quote <expr>)
  701.           `<expr>             == (backquote <expr>)
  702.           ,<expr>             == (comma <expr>)
  703.           ,@<expr>            == (comma-at <expr>)
  704.           #'<expr>            == (function <expr>)
  705.           #(<expr>...)        == an array of the specified expressions
  706.           #S(<structtype> [<slotname> <value>]...)
  707.                               ==  structure of  specified type  and initial
  708.                               values
  709.           #.<expr>            == result of evaluating <expr>
  710.           #x<hdigits>         == a hexadecimal number (0-9,A-F)
  711.           #o<odigits>         == an octal number (0-7)
  712.           #b<bdigits>         == a binary number (0-1)
  713.           #|  |#              == a comment
  714.           #:<symbol>          == an uninterned symbol
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.      XLISP 2.0                    LAMBDA LISTS                      Page 14
  723.  
  724.  
  725.  
  726.      LAMBDA LISTS
  727.  
  728.      There are several forms in XLISP that require that a  "lambda list" be
  729.      specified. A lambda  list is a definition of the arguments accepted by
  730.      a function. There are four different types of arguments.
  731.  
  732.      The  lambda list  starts with  required arguments.  Required arguments
  733.      must be specified in every call to the function.
  734.  
  735.      The  required  arguments  are  followed by  the  &optional  arguments.
  736.      Optional   arguments  may  be  provided  or  omitted  in  a  call.  An
  737.      initialization expression may  be specified to provide a default value
  738.      for  an  &optional argument  if  it  is omitted  from  a  call. If  no
  739.      initialization   expression  is  specified,  an  omitted  argument  is
  740.      initialized  to NIL.  It is  also possible  to provide  the name  of a
  741.      'supplied-p' variable that can be used to determine if a call provided
  742.      a value for the argument or if the initialization expression was used.
  743.      If specified,  the supplied-p variable will  be bound to T  if a value
  744.      was specified in the call and NIL if the default value was used.
  745.  
  746.      The  &optional arguments are followed by the &rest argument. The &rest
  747.      argument gets  bound to the remainder  of the argument list  after the
  748.      required and &optional arguments have been removed.
  749.  
  750.      The &rest argument is  followed by the &key arguments.  When a keyword
  751.      argument is  passed to a  function, a  pair of values  appears in  the
  752.      argument list. The  first expression in the pair should  evaluate to a
  753.      keyword symbol  (a symbol that  begins with a  ':'). The value  of the
  754.      second expression is the value of the keyword argument. Like &optional
  755.      arguments,  &key  arguments  can have  initialization  expressions and
  756.      supplied-p  variables. In  addition,  it is  possible  to specify  the
  757.      keyword to be used in a function call. If no keyword is specified, the
  758.      keyword  obtained by  adding a  ':' to  the beginning  of the  keyword
  759.      argument  symbol  is used.  In other  words,  if the  keyword argument
  760.      symbol is  'foo', the  keyword will  be ':foo'.  T_h_e_ &_a_l_l_o_w_-_o_t_h_e_r_-_k_e_y_s_
  761.      m_a_r_k_e_r_ i_s_ i_g_n_o_r_e_d_._
  762.  
  763.      The &key arguments are followed by the &aux variables. These are local
  764.      variables that are bound  during the evaluation of the  function body.
  765.      It  is  possible  to  have initialization  expressions  for  the  &aux
  766.      variables.
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.      XLISP 2.0                    LAMBDA LISTS                      Page 15
  775.  
  776.  
  777.      Here is the complete syntax for lambda lists:
  778.  
  779.           (<rarg>...
  780.            [&optional [<oarg> | (<oarg> [<init> [<svar>]])]...]
  781.            [&rest <rarg>]
  782.            [&key
  783.             [<karg> |  ([<karg> |  (<key> <karg>)] [<init>  [<svar>]])] ...
  784.           &allow-other-keys]
  785.            [&aux [<aux> | (<aux> [<init>])]...])
  786.  
  787.          where:
  788.  
  789.           <rarg>    is a required argument symbol
  790.           <oarg>    is an &optional argument symbol
  791.           <rarg>    is the &rest argument symbol
  792.           <karg>    is a &key argument symbol
  793.           <key>     is a keyword symbol
  794.           <aux>     is an auxiliary variable symbol
  795.           <init>    is an initialization expression
  796.           <svar>    is a supplied-p variable symbol
  797.  
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804.      XLISP 2.0                       OBJECTS                        Page 16
  805.  
  806.  
  807.  
  808.      OBJECTS
  809.  
  810.      Definitions:
  811.  
  812.          selector - a symbol used to select an appropriate method
  813.          message - a selector and a list of actual arguments
  814.          method - the code that implements a message
  815.  
  816.      Since  XLISP was created to  provide a simple  basis for experimenting
  817.      with  object-oriented programming,  one  of the  primitive data  types
  818.      included is 'object'. In XLISP, an object consists of a data structure
  819.      containing a  pointer  to the  object's  class  as well  as  an  array
  820.      containing the values of the object's instance variables.
  821.  
  822.      Officially,  there is  no way  to see  inside an  object (look  at the
  823.      values of its instance variables). The only way to communicate with an
  824.      object is by sending it a message.
  825.  
  826.      You can  send a message to  an object using the  'send' function. This
  827.      function  takes the object as its first argument, the message selector
  828.      as  its  second argument  (which must  be  a symbol)  and  the message
  829.      arguments as its remaining arguments.
  830.  
  831.      The 'send' function determines  the class of the receiving  object and
  832.      attempts to find a method corresponding to the message selector in the
  833.      set of messages defined for that class. If the message is not found in
  834.      the  object's  class  and the  class  has  a  super-class, the  search
  835.      continues by looking at the messages defined for the super-class. This
  836.      process continues from one super-class to the next until  a method for
  837.      the message is found. If no method is found, an error occurs.
  838.  
  839.      T_o_ p_e_r_f_o_r_m_  a_  m_e_t_h_o_d_ l_o_o_k_u_p_  s_t_a_r_t_i_n_g_  w_i_t_h_ t_h_e_  o_b_j_e_c_t_'_s_  s_u_p_e_r_c_l_a_s_s_
  840.      r_a_t_h_e_r_  t_h_a_n_ i_t_s_ c_l_a_s_s_,_ u_s_e_  t_h_e_ f_u_n_c_t_i_o_n_ '_s_e_n_d_-_s_u_p_e_r_'_._  This allows a
  841.      subclass to invoke a standard  method in its parent class even  though
  842.      it overrides that method with its own specialized version.
  843.  
  844.      When a method  is found, the evaluator  binds the receiving  object to
  845.      the symbol  'self'  and  evaluates  the  method  using  the  remaining
  846.      elements  of the  original  list as  arguments  to the  method.  These
  847.      arguments  are  always  evaluated  prior   to  being  bound  to  their
  848.      corresponding formal  arguments. The  result of evaluating  the method
  849.      becomes the result of the expression.
  850.  
  851.      T_w_o_  o_b_j_e_c_t_s_,_ b_o_t_h_  c_l_a_s_s_e_s_,_ a_r_e_  p_r_e_d_e_f_i_n_e_d_:_ O_b_j_e_c_t_  a_n_d_ C_l_a_s_s_._  B_o_t_h_
  852.      O_b_j_e_c_t_ a_n_d_  C_l_a_s_s_  a_r_e_ o_f_  c_l_a_s_s_  C_l_a_s_s_._ T_h_e_  s_u_p_e_r_c_l_a_s_s_ o_f_  C_l_a_s_s_  i_s_
  853.      O_b_j_e_c_t_,_ w_h_i_l_e_  O_b_j_e_c_t_ h_a_s_ n_o_ s_u_p_e_r_c_l_a_s_s_._ T_y_p_i_c_a_l_  u_s_e_ i_s_ t_o_ c_r_e_a_t_e_ n_e_w_
  854.      c_l_a_s_s_e_s_ (_b_y_ s_e_n_d_i_n_g_  :_n_e_w_ t_o_ C_l_a_s_s_)_ t_o_ r_e_p_r_e_s_e_n_t_  a_p_p_l_i_c_a_t_i_o_n_ o_b_j_e_c_t_s_._
  855.      O_b_j_e_c_t_s_ o_f_ t_h_e_s_e_ c_l_a_s_s_e_s_,_  c_r_e_a_t_e_d_ b_y_ s_e_n_d_i_n_g_ :_n_e_w_ t_o_  t_h_e_ a_p_p_r_o_p_r_i_a_t_e_
  856.      n_e_w_ c_l_a_s_s_,_  a_r_e_ s_u_b_c_l_a_s_s_e_s_ o_f_ O_b_j_e_c_t_._  T_h_e_ O_b_j_e_c_t_ m_e_t_h_o_d_ :_s_h_o_w_  c_a_n_ b_e_
  857.      u_s_e_d_ t_o_ v_i_e_w_ t_h_e_ c_o_n_t_e_n_t_s_ o_f_ a_n_y_ o_b_j_e_c_t_._
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.      XLISP 2.0                       OBJECTS                        Page 17
  866.  
  867.  
  868.  
  869.      THE 'Object' CLASS
  870.  
  871.      Object  THE TOP OF THE CLASS HEIRARCHY
  872.  
  873.      Messages:
  874.  
  875.           :show                         SHOW AN OBJECT'S INSTANCE VARIABLES
  876.                     returns   the object
  877.  
  878.           :class                              RETURN THE CLASS OF AN OBJECT
  879.                     returns   the class of the object
  880.  
  881.           :_p_r_i_n_1_ [_<_s_t_r_e_a_m_>_]_                                P_R_I_N_T_ T_H_E_ O_B_J_E_C_T_
  882.                     r_e_t_u_r_n_s_   t_h_e_ o_b_j_e_c_t_
  883.  
  884.           :isnew                  THE DEFAULT OBJECT INITIALIZATION ROUTINE
  885.                     returns   the object
  886.  
  887.           :_s_u_p_e_r_c_l_a_s_s_                      G_E_T_ T_H_E_ S_U_P_E_R_C_L_A_S_S_ O_F_ T_H_E_ O_B_J_E_C_T_
  888.                     r_e_t_u_r_n_s_   N_I_L_
  889.                     (_D_e_f_i_n_e_d_ i_n_ c_l_a_s_s_e_s_._l_s_p_,_ s_e_e_ :_s_u_p_e_r_c_l_a_s_s_ b_e_l_o_w_)_
  890.  
  891.           :_i_s_m_e_m_b_e_r_o_f_ <_c_l_a_s_s_>_                              C_L_A_S_S_ M_E_M_B_E_R_S_H_I_P_
  892.                     <_c_l_a_s_s_>_   c_l_a_s_s_ n_a_m_e_
  893.                     r_e_t_u_r_n_s_   T_ i_f_ o_b_j_e_c_t_ m_e_m_b_e_r_ o_f_ c_l_a_s_s_,_ e_l_s_e_ N_I_L_
  894.                     (_d_e_f_i_n_e_d_ i_n_ c_l_a_s_s_e_s_._l_s_p_)_
  895.  
  896.           :_i_s_k_i_n_d_o_f_ <_c_l_a_s_s_>_                                C_L_A_S_S_ M_E_M_B_E_R_S_H_I_P_
  897.                     <_c_l_a_s_s_>_   c_l_a_s_s_ n_a_m_e_
  898.                     r_e_t_u_r_n_s_   T_ i_f_  o_b_j_e_c_t_ m_e_m_b_e_r_  o_f_ c_l_a_s_s_ o_f_  s_u_b_c_l_a_s_s_ o_f_
  899.                               c_l_a_s_s_,_ e_l_s_e_ N_I_L_
  900.                     (_d_e_f_i_n_e_d_ i_n_ c_l_a_s_s_e_s_._l_s_p_)_
  901.  
  902.           :_r_e_s_p_o_n_d_s_t_o_ <_s_e_l_>_                              S_E_L_E_C_T_O_R_ K_N_O_W_L_E_D_G_E_
  903.                     <_s_e_l_>_     m_e_s_s_a_g_e_ s_e_l_e_c_t_o_r_
  904.                     r_e_t_u_r_n_s_   T_  i_f_  o_b_j_e_c_t_ r_e_s_p_o_n_d_s_  t_o_  m_e_s_s_a_g_e_ s_e_l_e_c_t_o_r_,_
  905.                               e_l_s_e_ N_I_L_._
  906.                     (_d_e_f_i_n_e_d_ i_n_ c_l_a_s_s_e_s_._l_s_p_)_
  907.  
  908.           :_s_t_o_r_e_o_n_                                      R_E_A_D_ R_E_P_R_E_S_E_N_T_A_T_I_O_N_
  909.                     r_e_t_u_r_n_s_   a_ l_i_s_t_,_ t_h_a_t_ w_h_e_n_ e_x_e_c_u_t_e_d_ w_i_l_l_ c_r_e_a_t_e_ a_ c_o_p_y_
  910.                               o_f_  t_h_e_  o_b_j_e_c_t_._ O_n_l_y_  w_o_r_k_s_  f_o_r_ m_e_m_b_e_r_s_  o_f_
  911.                               c_l_a_s_s_e_s_ c_r_e_a_t_e_d_ w_i_t_h_ d_e_f_c_l_a_s_s_._
  912.                     (_d_e_f_i_n_e_d_ i_n_ c_l_a_s_s_e_s_._l_s_p_)_
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.      XLISP 2.0                       OBJECTS                        Page 18
  921.  
  922.  
  923.  
  924.      THE 'Class' CLASS
  925.  
  926.      Class   THE CLASS OF ALL OBJECT CLASSES (including itself)
  927.  
  928.      Messages:
  929.  
  930.           :new                             CREATE A NEW INSTANCE OF A CLASS
  931.                     returns   the new class object
  932.  
  933.           :isnew <ivars> [<cvars> [<super>]]         INITIALIZE A NEW CLASS
  934.                     <ivars>   the list of instance variable symbol
  935.                     <cvars>   the list of class variable symbols
  936.                     <super>   the superclass (default is Object)
  937.                     returns   the new class object
  938.  
  939.           :answer <msg> <fargs> <code>             ADD A MESSAGE TO A CLASS
  940.                     <msg>     the message symbol
  941.                     <fargs>   the formal argument list (lambda list)
  942.                     <code>    a list of executable expressions
  943.                     returns   the object
  944.  
  945.           :_s_u_p_e_r_c_l_a_s_s_                      G_E_T_ T_H_E_ S_U_P_E_R_C_L_A_S_S_ O_F_ T_H_E_ O_B_J_E_C_T_
  946.                     r_e_t_u_r_n_s_   t_h_e_ s_u_p_e_r_c_l_a_s_s_ (_o_f_ t_h_e_ c_l_a_s_s_)_
  947.                     (_d_e_f_i_n_e_d_ i_n_ c_l_a_s_s_e_s_._l_s_p_)_
  948.  
  949.           :_m_e_s_s_a_g_e_s_                   G_E_T_ T_H_E_ L_I_S_T_ O_F_ M_E_S_S_A_G_E_S_ O_F_ T_H_E_ C_L_A_S_S_
  950.                     r_e_t_u_r_n_s_   a_s_s_o_c_i_a_t_i_o_n_  l_i_s_t_  o_f_  m_e_s_s_a_g_e_ s_e_l_e_c_t_o_r_s_  a_n_d_
  951.                               c_l_o_s_u_r_e_s_ f_o_r_ m_e_s_s_a_g_e_s_._
  952.                     (_d_e_f_i_n_e_d_ i_n_ c_l_a_s_s_e_s_._l_s_p_)_
  953.  
  954.           :_s_t_o_r_e_o_n_                                      R_E_A_D_ R_E_P_R_E_S_E_N_T_A_T_I_O_N_
  955.                     r_e_t_u_r_n_s_   a_ l_i_s_t_,_ t_h_a_t_ w_h_e_n_ e_x_e_c_u_t_e_d_ w_i_l_l_ r_e_-_c_r_e_a_t_e_ t_h_e_
  956.                               c_l_a_s_s_ a_n_d_ i_t_s_ m_e_t_h_o_d_s_._
  957.                     (_d_e_f_i_n_e_d_ i_n_ c_l_a_s_s_e_s_._l_s_p_)_
  958.  
  959.      When  a new  instance of  a class  is created  by sending  the message
  960.      ':new' to an existing class, the message ':isnew' followed by whatever
  961.      parameters were  passed to  the ':new'  message is  sent to  the newly
  962.      created  object. T_h_e_r_e_f_o_r_e_,_  w_h_e_n_ a_  n_e_w_ c_l_a_s_s_  i_s_ c_r_e_a_t_e_d_  b_y_ s_e_n_d_i_n_g_
  963.      '_:_n_e_w_'_  t_o_ c_l_a_s_s_  '_C_l_a_s_s_'_  t_h_e_  m_e_s_s_a_g_e_  '_:_i_s_n_e_w_'_  i_s_  s_e_n_t_  t_o_  C_l_a_s_s_
  964.      a_u_t_o_m_a_t_i_c_a_l_l_y_._  T_o_ c_r_e_a_t_e_  a_ n_e_w_  c_l_a_s_s_,_ a_  f_u_n_c_t_i_o_n_ o_f_  t_h_e_ f_o_l_l_o_w_i_n_g_
  965.      f_o_r_m_a_t_ i_s_ u_s_e_d_:_
  966.        (_s_e_t_q_ <_n_e_w_c_l_a_s_s_n_a_m_e_>_ (_s_e_n_d_ C_l_a_s_s_ :_n_e_w_ <_i_v_a_r_s_>_ [_<_c_v_a_r_s_>_ [_<_s_u_p_e_r_>_]_]_)_)_
  967.  
  968.      When  a new class  is created, an optional  parameter may be specified
  969.      indicating  the  superclass of  the new  class.  If this  parameter is
  970.      omitted, the  new  class  will be  a  subclass of  'Object'.  A  class
  971.      inherits all instance variables, class variables, and methods from its
  972.      super-class.
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979.  
  980.      XLISP 2.0                       OBJECTS                        Page 19
  981.  
  982.  
  983.      I_N_S_T_A_N_C_E_ V_A_R_I_A_B_L_E_S_ O_F_ C_L_A_S_S_ '_C_L_A_S_S_'_:_
  984.  
  985.           M_E_S_S_A_G_E_S_  -_ A_n_  a_s_s_o_c_i_a_t_i_o_n_ l_i_s_t_  o_f_  m_e_s_s_a_g_e_ n_a_m_e_s_  a_n_d_ c_l_o_s_u_r_e_s_
  986.                     i_m_p_l_e_m_e_n_t_i_n_g_ t_h_e_ m_e_s_s_a_g_e_s_._
  987.  
  988.           I_V_A_R_S_ -_ L_i_s_t_ o_f_ n_a_m_e_s_ o_f_ i_n_s_t_a_n_c_e_ v_a_r_i_a_b_l_e_s_._
  989.  
  990.           C_V_A_R_S_ -_ L_i_s_t_ o_f_ n_a_m_e_s_ o_f_ c_l_a_s_s_ v_a_r_i_a_b_l_e_s_._
  991.  
  992.           C_V_A_L_ -_ L_i_s_t_ o_f_ c_l_a_s_s_ v_a_r_i_a_b_l_e_ v_a_l_u_e_s_._
  993.  
  994.           S_U_P_E_R_C_L_A_S_S_ -_ T_h_e_ s_u_p_e_r_c_l_a_s_s_ o_f_ t_h_i_s_ c_l_a_s_s_ o_r_ N_I_L_ i_f_ n_o_ s_u_p_e_r_c_l_a_s_s_
  995.                     (_o_n_l_y_ f_o_r_ c_l_a_s_s_ O_B_J_E_C_T_)_._
  996.  
  997.           I_V_A_R_C_N_T_ -_ i_n_s_t_a_n_c_e_ v_a_r_i_a_b_l_e_s_ i_n_ t_h_i_s_ c_l_a_s_s_ (_l_e_n_g_t_h_ o_f_ I_V_A_R_S_)_
  998.  
  999.           I_V_A_R_T_O_T_A_L_  -_ t_o_t_a_l_  i_n_s_t_a_n_c_e_  v_a_r_i_a_b_l_e_s_ f_o_r_  t_h_i_s_  c_l_a_s_s_ a_n_d_  a_l_l_
  1000.                     s_u_p_e_r_c_l_a_s_s_e_s_ o_f_ t_h_i_s_ c_l_a_s_s_._
  1001.  
  1002.           P_N_A_M_E_ -_ p_r_i_n_t_n_a_m_e_ s_t_r_i_n_g_ f_o_r_ t_h_i_s_ c_l_a_s_s_._
  1003.  
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.      XLISP 2.0                       SYMBOLS                        Page 20
  1011.  
  1012.  
  1013.  
  1014.      SYMBOLS
  1015.  
  1016.  
  1017.  
  1018.      _    n_i_l_ -_ t_h_e_ e_m_p_t_y_ l_i_s_t_
  1019.      _    t_ -_ t_r_u_t_h_ v_a_l_u_e_
  1020.          self - the current object (within a method context)
  1021.      _    o_b_j_e_c_t_ -_ t_h_e_ c_l_a_s_s_ '_O_b_j_e_c_t_'_
  1022.      _    c_l_a_s_s_ -_ t_h_e_ c_l_a_s_s_ '_C_l_a_s_s_'_
  1023.          *obarray* - the object hash table
  1024.          *standard-input* - the standard input stream,_ s_t_d_i_n_
  1025.          *standard-output* - the standard output stream,_ s_t_d_o_u_t_
  1026.          *error-output* - the error output stream,_ s_t_d_e_r_r_
  1027.          *trace-output* - the trace output stream,_ d_e_f_a_u_l_t_s_ t_o_ s_t_d_e_r_r_
  1028.          *debug-io* - the break loop i/o stream,_ d_e_f_a_u_l_t_s_ t_o_ s_t_d_e_r_r_
  1029.          *breakenable* - flag controlling entering break loop on errors
  1030.          *tracelist* - list of names of functions to trace
  1031.          *tracenable* - enable trace back printout on errors
  1032.          *tracelimit* - number of levels of trace back information
  1033.          *evalhook* - user substitute for the evaluator function
  1034.          *applyhook* - u_s_e_r_ s_u_b_s_t_i_t_u_t_e_ f_o_r_ f_u_n_c_t_i_o_n_ a_p_p_l_i_c_a_t_i_o_n_
  1035.          *readtable* - the current readtable
  1036.          *unbound* - indicator for unbound symbols
  1037.          *gc-flag* - controls the printing of gc messages
  1038.          *gc-hook* - function to call after garbage collection
  1039.          *integer-format* - format for printing integers ("%d" or "%ld")
  1040.          *float-format* - format for printing floats ("%g")
  1041.          *print-case* - symbol output case (:upcase or :downcase)
  1042.      _    *_p_r_i_n_t_-_l_e_v_e_l_*_  -_ l_i_s_t_ l_e_v_e_l_s_  b_e_y_o_n_d_ t_h_i_s_ s_e_t_t_i_n_g_  a_r_e_ p_r_i_n_t_e_d_ a_s_
  1043.           '_#_'_
  1044.      _    *_p_r_i_n_t_-_l_e_n_g_t_h_*_ -_  l_i_s_t_s_ l_o_n_g_e_r_ t_h_a_n_  t_h_i_s_ s_e_t_t_i_n_g_ a_r_e_  p_r_i_n_t_e_d_ a_s_
  1045.           '_._._._'_
  1046.      _    *_d_o_s_-_i_n_p_u_t_*_ -_ u_s_e_ d_o_s_ l_i_n_e_ i_n_p_u_t_ f_u_n_c_t_i_o_n_ f_o_r_ r_e_a_d_._
  1047.  
  1048.      There are several symbols maintained  by the read/eval/print loop. The
  1049.      symbols '+', '++', and '+++' are bound to the most  recent three input
  1050.      expressions. The  symbols '*',  '**' and '***'  are bound to  the most
  1051.      recent  three results.  The  symbol '-'  is  bound to  the  expression
  1052.      currently  being evaluated. It becomes the value  of '+' at the end of
  1053.      the evaluation.
  1054.  
  1055.      I_n_t_e_n_d_e_d_ t_o_ b_e_ a_d_d_e_d_:_
  1056.      _    *_p_r_i_n_t_-_b_a_s_e_*_ -_ r_a_d_i_x_ u_s_e_d_ i_n_ p_r_i_n_t_i_n_g_ i_n_t_e_g_e_r_s_._
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064.      XLISP 2.0                EVALUATION FUNCTIONS                  Page 21
  1065.  
  1066.  
  1067.  
  1068.      EVALUATION FUNCTIONS
  1069.  
  1070.      (eval <expr>)                             EVALUATE AN XLISP EXPRESSION
  1071.           <expr>    the expression to be evaluated
  1072.           returns   the result of evaluating the expression
  1073.  
  1074.      (apply <fun> <args>)           APPLY A FUNCTION TO A LIST OF ARGUMENTS
  1075.           <fun>     the function to apply (or  function symbol). M_a_y_ n_o_t_ b_e_
  1076.                     m_a_c_r_o_ o_r_ f_s_u_b_r_._
  1077.           <args>    the  argument  list  (_u_n_l_i_k_e_  C_o_m_m_o_n_  L_i_s_p_,_   o_n_l_y_  o_n_e_
  1078.                     a_l_l_o_w_e_d_)_
  1079.           returns   the result of applying the function to the arguments
  1080.  
  1081.      (funcall <fun> <arg>...)                CALL A FUNCTION WITH ARGUMENTS
  1082.           <fun>     the function  to call (or function symbol).  M_a_y_ n_o_t_ b_e_
  1083.                     m_a_c_r_o_ o_r_ f_s_u_b_r_._
  1084.           <arg>     arguments to pass to the function
  1085.           returns   the result of calling the function with the arguments
  1086.  
  1087.      (quote <expr>)                        RETURN AN EXPRESSION UNEVALUATED
  1088.           f_s_u_b_r_
  1089.           <expr>    the expression to be quoted (quoted)
  1090.           returns   <expr> unevaluated
  1091.  
  1092.      (function <expr>)                    GET THE FUNCTIONAL INTERPRETATION
  1093.           f_s_u_b_r_
  1094.           <expr>    the symbol or lambda expression (quoted)
  1095.           returns   the functional interpretation
  1096.  
  1097.      (backquote <expr>)                                  FILL IN A TEMPLATE
  1098.           f_s_u_b_r_
  1099.           <expr>    the template (quoted)
  1100.           returns   a  copy  of  the   template  with  comma  and  comma-at
  1101.                     expressions expanded.
  1102.  
  1103.      (_c_o_m_m_a_ <_e_x_p_r_>_)_                                        C_O_M_M_A_ E_X_P_R_E_S_S_I_O_N_
  1104.           (_N_e_v_e_r_  e_x_e_c_u_t_e_d_)_ A_s_  t_h_e_  o_b_j_e_c_t_ o_f_  a_ b_a_c_k_q_u_o_t_e_  e_x_p_a_n_s_i_o_n_,_ t_h_e_
  1105.           e_x_p_r_e_s_s_i_o_n_  i_s_ e_v_a_l_u_a_t_e_d_ a_n_d_  b_e_c_o_m_e_s_ a_n_ o_b_j_e_c_t_  i_n_ t_h_e_ e_n_c_l_o_s_i_n_g_
  1106.           l_i_s_t_._
  1107.  
  1108.      (_c_o_m_m_a_-_a_t_ <_e_x_p_r_>_)_                                  C_O_M_M_A_-_A_T_ E_X_P_R_E_S_S_I_O_N_
  1109.           (_N_e_v_e_r_ e_x_e_c_u_t_e_d_)_  A_s_ t_h_e_  o_b_j_e_c_t_  o_f_ a_  b_a_c_k_q_u_o_t_e_ e_x_p_a_n_s_i_o_n_,_  t_h_e_
  1110.           e_x_p_r_e_s_s_i_o_n_ i_s_ e_v_a_l_u_a_t_e_d_ (_a_n_d_ m_u_s_t_ e_v_a_l_u_a_t_e_ t_o_ a_ l_i_s_t_)_ a_n_d_ i_s_ t_h_e_n_
  1111.           s_p_l_i_c_e_d_ i_n_t_o_ t_h_e_ e_n_c_l_o_s_i_n_g_ l_i_s_t_._
  1112.  
  1113.      (lambda <args> <expr>...)                      MAKE A FUNCTION CLOSURE
  1114.           f_s_u_b_r_
  1115.           <args>    formal argument list (lambda list) (quoted)
  1116.           <expr>    expressions of the function body (quoted)
  1117.           returns   the function closure
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.      XLISP 2.0                EVALUATION FUNCTIONS                  Page 22
  1126.  
  1127.  
  1128.      (get-lambda-expression <closure>)            GET THE LAMBDA EXPRESSION
  1129.           <closure> the closure
  1130.           returns   the original lambda expression
  1131.  
  1132.      (macroexpand <form>)                    RECURSIVELY EXPAND MACRO CALLS
  1133.           <form>    the form to expand
  1134.           returns   the macro expansion
  1135.  
  1136.      (macroexpand-1 <form>)                             EXPAND A MACRO CALL
  1137.           <form>    the macro call form
  1138.           returns   the macro expansion
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.  
  1146.      XLISP 2.0                  SYMBOL FUNCTIONS                    Page 23
  1147.  
  1148.  
  1149.  
  1150.      SYMBOL FUNCTIONS
  1151.  
  1152.      (set <sym> <expr>)                    SET THE G_L_O_B_A_L_ VALUE OF A SYMBOL
  1153.           <sym>     the symbol being set
  1154.           <expr>    the new value
  1155.           returns   the new value
  1156.  
  1157.      (setq [<sym> <expr>]...)                     SET THE VALUE OF A SYMBOL
  1158.           f_s_u_b_r_
  1159.           <sym>     the symbol being set (quoted)
  1160.           <expr>    the new value
  1161.           returns   the new value
  1162.  
  1163.      (psetq [<sym> <expr>]...)                     PARALLEL VERSION OF SETQ
  1164.           f_s_u_b_r_._ A_l_l_ e_x_p_r_e_s_s_i_o_n_s_ a_r_e_ e_v_a_l_u_a_t_e_d_  b_e_f_o_r_e_ a_n_y_ a_s_s_i_g_n_m_e_n_t_s_
  1165.           a_r_e_ m_a_d_e_._
  1166.           <sym>     the symbol being set (quoted)
  1167.           <expr>    the new value
  1168.           returns   the new value
  1169.  
  1170.      (setf [<place> <expr>]...)                    SET THE VALUE OF A FIELD
  1171.           f_s_u_b_r_
  1172.           <place>   the field specifier (quoted):
  1173.                     <sym>               set value of a symbol
  1174.                     (car <expr>)        set car of a cons node
  1175.                     (cdr <expr>)        set cdr of a cons node
  1176.                     (nth <n> <expr>)    set nth car of a list
  1177.                     (aref <expr> <n>)   set  nth  element  of an  array  o_r_
  1178.                                         s_t_r_i_n_g_
  1179.                     (_e_l_t_ <_e_x_p_r_>_ <_n_>_)_    s_e_t_ n_t_h_ e_l_e_m_e_n_t_ o_f_ a_ s_e_q_u_e_n_c_e_
  1180.                     (get <sym> <prop>)  set value of a property
  1181.                     (symbol-value <sym>)          set value of a symbol
  1182.                     (symbol-function <sym>)       functional  value  of   a
  1183.                                                   symbol
  1184.                     (symbol-plist <sym>)          set  property  list of  a
  1185.                                                   symbol
  1186.                     (_s_e_n_d_ <_o_b_j_>_ :_<_i_v_a_r_>_)_          (_W_h_e_n_  c_l_a_s_s_e_s_._l_s_p_ u_s_e_d_)_,_
  1187.                                                   s_e_t_ i_n_s_t_a_n_c_e_  v_a_r_i_a_b_l_e_ o_f_
  1188.                                                   o_b_j_e_c_t_._
  1189.                     (_<_s_y_m_>_-_<_e_l_e_m_e_n_t_>_ <_s_t_r_u_c_t_>_)_    (_W_h_e_n_  s_t_r_u_c_t_._l_s_p_  u_s_e_d_)_,_
  1190.                                                   s_e_t_   t_h_e_    e_l_e_m_e_n_t_   o_f_
  1191.                                                   s_t_r_u_c_t_u_r_e_   s_t_r_u_c_t_,_  t_y_p_e_
  1192.                                                   s_y_m_._
  1193.                     (_<_f_i_e_l_d_s_y_m_>_ <_a_r_g_s_>_)_ t_h_e_  f_u_n_c_t_i_o_n_  s_t_o_r_e_d_  i_n_  p_r_o_p_e_r_t_y_
  1194.                                         *_s_e_t_f_*_  i_n_   s_y_m_b_o_l_  <_f_i_e_l_d_s_y_m_>_  i_s_
  1195.                                         a_p_p_l_i_e_d_ t_o_ (_<_a_r_g_s_>_ <_e_x_p_r_>_)_
  1196.           <value>   the new value
  1197.           returns   the new value
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.      XLISP 2.0                  SYMBOL FUNCTIONS                    Page 24
  1206.  
  1207.  
  1208.      (_p_u_s_h_  <_e_x_p_r_>_ <_p_l_a_c_e_>_)_                            C_O_N_S_ T_O_ S_Y_M_B_O_L_ V_A_L_U_E_
  1209.           <_p_l_a_c_e_>_   f_i_e_l_d_ s_p_e_c_i_f_i_e_r_ b_e_i_n_g_ m_o_d_i_f_i_e_d_ (_s_e_e_ s_e_t_f_)_
  1210.           <_e_x_p_r_>_    v_a_l_u_e_ t_o_ c_o_n_s_ t_o_ c_u_r_r_e_n_t_ s_y_m_b_o_l_ v_a_l_u_e_
  1211.           r_e_t_u_r_n_s_   t_h_e_ n_e_w_ v_a_l_u_e_ w_h_i_c_h_ i_s_ (_C_O_N_S_ <_e_x_p_r_>_ <_p_l_a_c_e_>_)_
  1212.           N_o_t_e_:_ d_e_f_i_n_e_d_ a_s_ m_a_c_r_o_ i_n_ c_o_m_m_o_n_._l_s_p_
  1213.  
  1214.      (_p_o_p_ <_p_l_a_c_e_>_)_                     R_E_M_O_V_E_ F_I_R_S_T_ E_L_E_M_E_N_T_ O_F_ S_Y_M_B_O_L_ V_A_L_U_E_
  1215.           <_p_l_a_c_e_>_   t_h_e_ f_i_e_l_d_ b_e_i_n_g_ m_o_d_i_f_i_e_d_ (_s_e_e_ s_e_t_f_)_
  1216.           r_e_t_u_r_n_s_   (_C_A_R_ <_p_l_a_c_e_>_)_,_ f_i_e_l_d_ c_h_a_n_g_e_d_ t_o_ (_C_D_R_ <_p_l_a_c_e_>_)_
  1217.           N_o_t_e_:_ d_e_f_i_n_e_d_ a_s_ m_a_c_r_o_ i_n_ c_o_m_m_o_n_._l_s_p_
  1218.  
  1219.      (defun <sym> <fargs> <expr>...)                      DEFINE A FUNCTION
  1220.      (defmacro <sym> <fargs> <expr>...)                      DEFINE A MACRO
  1221.           f_s_u_b_r_
  1222.           <sym>     symbol being defined (quoted)
  1223.           <fargs>   formal argument list (lambda list) (quoted)
  1224.           <expr>    expressions  constituting  the  body  of  the  function
  1225.                     (quoted)
  1226.           returns   the function symbol
  1227.  
  1228.      (gensym [<tag>])                                     GENERATE A SYMBOL
  1229.           <tag>     string or number
  1230.           returns   the new symbol
  1231.  
  1232.      (intern <pname>)                               MAKE AN INTERNED SYMBOL
  1233.           <pname>   the symbol's print name string
  1234.           returns   the new symbol
  1235.  
  1236.      (make-symbol <pname>)                        MAKE AN UNINTERNED SYMBOL
  1237.           <pname>   the symbol's print name string
  1238.           returns   the new symbol
  1239.  
  1240.      (symbol-name <sym>)                     GET THE PRINT NAME OF A SYMBOL
  1241.           <sym>     the symbol
  1242.           returns   the symbol's print name
  1243.  
  1244.      (symbol-value <sym>)                         GET THE VALUE OF A SYMBOL
  1245.           <sym>     the symbol
  1246.           returns   the symbol's value
  1247.  
  1248.      (symbol-function <sym>)           GET THE FUNCTIONAL VALUE OF A SYMBOL
  1249.           <sym>     the symbol
  1250.           returns   the symbol's functional value
  1251.  
  1252.      (symbol-plist <sym>)                 GET THE PROPERTY LIST OF A SYMBOL
  1253.           <sym>     the symbol
  1254.           returns   the symbol's property list
  1255.  
  1256.      (hash <sym> <n>)                   COMPUTE THE HASH INDEX FOR A SYMBOL
  1257.           <sym>     the symbol or string
  1258.           <n>       the table size (integer)
  1259.  
  1260.  
  1261.  
  1262.  
  1263.  
  1264.  
  1265.  
  1266.      XLISP 2.0                  SYMBOL FUNCTIONS                    Page 25
  1267.  
  1268.  
  1269.           returns   the hash index (integer)
  1270.  
  1271.      (_m_a_k_u_n_b_o_u_n_d_ <_s_y_m_>_)_                      M_A_K_E_ A_ S_Y_M_B_O_L_ V_A_L_U_E_ B_E_ U_N_B_O_U_N_D_
  1272.           <_s_y_m_>_     t_h_e_ s_y_m_b_o_l_
  1273.           r_e_t_u_r_n_s_   t_h_e_ s_y_m_b_o_l_
  1274.           N_o_t_e_:_ d_e_f_i_n_e_d_ i_n_ i_n_i_t_._l_s_p_
  1275.  
  1276.      (_f_m_a_k_u_n_b_o_u_n_d_ <_s_y_m_>_)_                  M_A_K_E_ A_ S_Y_M_B_O_L_ F_U_N_C_T_I_O_N_ B_E_ U_N_B_O_U_N_D_
  1277.           <_s_y_m_>_     t_h_e_ s_y_m_b_o_l_
  1278.           r_e_t_u_r_n_s_   t_h_e_ s_y_m_b_o_l_
  1279.           N_o_t_e_:_ d_e_f_i_n_e_d_ i_n_ i_n_i_t_._l_s_p_
  1280.  
  1281.  
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287.      XLISP 2.0               PROPERTY LIST FUNCTIONS                Page 26
  1288.  
  1289.  
  1290.  
  1291.      PROPERTY LIST FUNCTIONS
  1292.  
  1293.      (get <sym> <prop>)                         GET THE VALUE OF A PROPERTY
  1294.           <sym>     the symbol
  1295.           <prop>    the property symbol
  1296.           returns   the property value or nil
  1297.  
  1298.      (putprop <sym> <val> <prop>)       PUT A PROPERTY ONTO A PROPERTY LIST
  1299.           <sym>     the symbol
  1300.           <val>     the property value
  1301.           <prop>    the property symbol
  1302.           returns   the property value
  1303.  
  1304.      (remprop <sym> <prop>)                               REMOVE A PROPERTY
  1305.           <sym>     the symbol
  1306.           <prop>    the property symbol
  1307.           returns   nil
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.      XLISP 2.0                   ARRAY FUNCTIONS                    Page 27
  1316.  
  1317.  
  1318.  
  1319.      ARRAY FUNCTIONS
  1320.  
  1321.      (aref <array> <n>)                     GET THE NTH ELEMENT OF AN ARRAY
  1322.           T_h_i_s_ f_u_n_c_t_i_o_n_ n_o_w_ a_l_s_o_ w_o_r_k_s_ o_n_ s_t_r_i_n_g_s_._
  1323.           <array>   the array
  1324.           <n>       the array index (integer)
  1325.           returns   the value of the array element
  1326.  
  1327.      (make-array <size>)                                   MAKE A NEW ARRAY
  1328.           <size>    the size of the new array (integer)
  1329.           returns   the new array
  1330.  
  1331.      (vector <expr>...)                          MAKE AN INITIALIZED VECTOR
  1332.           <expr>    the vector elements
  1333.           returns   the new vector
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.      XLISP 2.0                 SEQUENCE FUNCTIONS                   Page 28
  1342.  
  1343.  
  1344.  
  1345.      SEQUENCE FUNCTIONS
  1346.  
  1347.      T_h_e_s_e_  f_u_n_c_t_i_o_n_s_ w_o_r_k_ o_n_ s_e_q_u_e_n_c_e_s_  -_-_ l_i_s_t_s_,_ a_r_r_a_y_s_,_  o_r_ s_t_r_i_n_g_s_,_ a_n_d_
  1348.      f_o_r_ t_h_e_ m_o_s_t_  p_a_r_t_ r_e_p_r_e_s_e_n_t_  a_n_ e_x_t_e_n_s_i_o_n_ o_f_  t_h_e_ d_i_s_t_r_i_b_u_t_i_o_n_  X_L_I_S_P_
  1349.      2_._0_._
  1350.  
  1351.      (concatenate <type> <expr> ...)                  CONCATENATE SEQUENCES
  1352.           <type>    result type, one of cons, array, or string
  1353.           <expr>    zero or more sequences to concatenate
  1354.           returns   a sequence which is  the concatenation of the arguement
  1355.                     sequences
  1356.           NOTE:  if  result type  is  string, sequences  must  contain only
  1357.           characters.
  1358.  
  1359.      (elt <expr> <n>)                     GET THE NTH ELEMENT OF A SEQUENCE
  1360.           <expr>    the sequence
  1361.           <n>       the index of element to return
  1362.           returns   the element if the index is in bounds, otherwise error
  1363.  
  1364.      (map <type> <fcn> <expr> ...)    APPLY FUNCTION TO SUCCESSIVE ELEMENTS
  1365.           <type>    result type, one of cons, array, string, or nil
  1366.           <fcn>     the function or function name
  1367.           <expr>    a sequence for each argument of the function
  1368.           returns   a new sequence of type <type>.
  1369.  
  1370.      (every <fcn> <expr> ...)        APPLY FUNCTION TO ELEMENTS UNTIL FALSE
  1371.      (notevery <fcn> <expr> ...)
  1372.           <fcn>     the function or function name
  1373.           <expr>    a sequence for each argument of the function
  1374.           returns   every returns last evaluated function result, or T
  1375.                     notevery returns T  if there is a  nil function result,
  1376.                     else NIL
  1377.  
  1378.      (some <fcn> <expr> ...)          APPLY FUNCTION TO ELEMENTS UNTIL TRUE
  1379.      (notany <fcn> <expr> ...)
  1380.           <fcn>     the function or function name
  1381.           <expr>    a sequence for each argument of the function
  1382.           returns   some returns first non-nil function result, or NIL
  1383.                     notany  returns  NIL if  there  is  a non-nil  function
  1384.                     result, else T
  1385.  
  1386.      (length <expr>)                          FIND THE LENGTH OF A SEQUENCE
  1387.           U_n_c_h_a_n_g_e_d_ f_r_o_m_ t_h_e_ d_i_s_t_r_i_b_u_t_i_o_n_
  1388.           <expr>    the list, vector or string
  1389.           returns   the length of the list, vector or string
  1390.  
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.      XLISP 2.0                 SEQUENCE FUNCTIONS                   Page 29
  1398.  
  1399.  
  1400.      (reverse <expr>)                                    REVERSE A SEQUENCE
  1401.      (_n_r_e_v_e_r_s_e_ <_e_x_p_r_>_)_                     D_E_S_T_R_U_C_T_I_V_E_L_Y_ R_E_V_E_R_S_E_ A_ S_E_Q_U_E_N_C_E_
  1402.           D_i_s_t_r_i_b_u_t_i_o_n_ o_n_l_y_ w_o_r_k_e_d_ o_n_ l_i_s_t_s_._
  1403.           <expr>    the sequence to reverse
  1404.           returns   a new sequence in the reverse order
  1405.  
  1406.      (subseq <seq> <start> [<end>])                   EXTRACT A SUBSEQUENCE
  1407.           D_i_s_t_r_i_b_u_t_i_o_n_ o_n_l_y_ w_o_r_k_e_d_ o_n_ s_t_r_i_n_g_s_._
  1408.           <seq>     the sequence
  1409.           <start>   the starting position (zero origin)
  1410.           <end>     the  ending position + 1  (defaults to end)  o_r_ N_I_L_ f_o_r_
  1411.                     e_n_d_ o_f_ s_e_q_u_e_n_c_e_
  1412.           returns   the sequence between <start> and <end>
  1413.  
  1414.      (search  <seq1>  <seq2> &key  :test  :test-not  :start1 :end1  :start2
  1415.      :end2)
  1416.                                                         SEARCH FOR SEQUENCE
  1417.           Note: added function
  1418.           <seq1>    the sequence to search for
  1419.           <seq2>    the sequence to search in
  1420.           :test     the test function (defaults to eql)
  1421.           :test-not the test function (sense inverted)
  1422.           :start1   starting index in <seq1>
  1423.           :end1     index of end+1 in <seq1> or NIL for end of sequence
  1424.           :start2   starting index in <seq2>
  1425.           :end2     index of end+1 in <seq2> or NIL for end of sequence
  1426.           returns   position of first match
  1427.  
  1428.      (remove <expr> <seq> &key :test :test-not :start :end)
  1429.                                             REMOVE ELEMENTS FROM A SEQUENCE
  1430.           D_i_s_t_r_i_b_u_t_i_o_n_ o_n_l_y_ w_o_r_k_e_d_ o_n_ l_i_s_t_s_._
  1431.           <expr>    the element to remove
  1432.           <seq>     the sequence
  1433.           :test     the test function (defaults to eql)
  1434.           :test-not the test function (sense inverted)
  1435.           :_s_t_a_r_t_    s_t_a_r_t_i_n_g_ i_n_d_e_x_
  1436.           :_e_n_d_      i_n_d_e_x_ o_f_ e_n_d_+_1_,_ o_r_ N_I_L_ f_o_r_ (_l_e_n_g_t_h_ <_s_e_q_>_)_
  1437.           returns   copy of sequence with matching expressions removed
  1438.  
  1439.      (remove-if <test> <seq> &key :start :end)
  1440.                                              REMOVE ELEMENTS THAT PASS TEST
  1441.           D_i_s_t_r_i_b_u_t_i_o_n_ o_n_l_y_ w_o_r_k_e_d_ o_n_ l_i_s_t_s_._
  1442.           <test>    the test predicate
  1443.           <seq>     the sequence
  1444.           :_s_t_a_r_t_    s_t_a_r_t_i_n_g_ i_n_d_e_x_
  1445.           :_e_n_d_      i_n_d_e_x_ o_f_ e_n_d_+_1_,_ o_r_ N_I_L_ f_o_r_ (_l_e_n_g_t_h_ <_s_e_q_>_)_
  1446.           returns   copy of sequence with matching elements removed
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.      XLISP 2.0                 SEQUENCE FUNCTIONS                   Page 30
  1455.  
  1456.  
  1457.      (remove-if-not <test> <seq> &key :start :end)
  1458.                                              REMOVE ELEMENTS THAT FAIL TEST
  1459.           D_i_s_t_r_i_b_u_t_i_o_n_ o_n_l_y_ w_o_r_k_e_d_ o_n_ l_i_s_t_s_._
  1460.           <test>    the test predicate
  1461.           <seq>     the sequence
  1462.           :_s_t_a_r_t_    s_t_a_r_t_i_n_g_ i_n_d_e_x_
  1463.           :_e_n_d_      i_n_d_e_x_ o_f_ e_n_d_+_1_,_ o_r_ N_I_L_ f_o_r_ (_l_e_n_g_t_h_ <_s_e_q_>_)_
  1464.           returns   copy of sequence with non-matching elements removed
  1465.  
  1466.      (count-if <test> <seq> &key :start :end) COUNT ELEMENTS THAT PASS TEST
  1467.           Note: added function
  1468.           <test>    the test predicate
  1469.           <seq>     the sequence
  1470.           :start    starting index
  1471.           :end      index of end+1, or NIL for (length <seq>)
  1472.           returns   count of matching elements
  1473.  
  1474.      (find-if <test> <seq> &key :start :end)
  1475.                                         FIND FIRST ELEMENT THAT PASSES TEST
  1476.           Note: added function
  1477.           <test>    the test predicate
  1478.           <seq>     the list
  1479.           :start    starting index
  1480.           :end      index of end+1, or NIL for (length <seq>)
  1481.           returns   first element of sequence that passes test
  1482.  
  1483.      (position-if <test> <seq> &key :start :end)
  1484.                             FIND POSITION OF FIRST ELEMENT THAT PASSES TEST
  1485.           Note: added function
  1486.           <test>    the test predicate
  1487.           <seq>     the list
  1488.           :start    starting index
  1489.           :end      index of end+1, or NIL for (length <seq>)
  1490.           returns   position of first element of sequence that passes test,
  1491.                     or NIL.
  1492.  
  1493.  
  1494.      (delete <expr> <seq> &key :test :test-not :start :end)
  1495.                                             DELETE ELEMENTS FROM A SEQUENCE
  1496.           D_i_s_t_r_i_b_u_t_i_o_n_ o_n_l_y_ w_o_r_k_e_d_ o_n_ l_i_s_t_s_._
  1497.           <expr>    the element to delete
  1498.           <seq>     the sequence
  1499.           :test     the test function (defaults to eql)
  1500.           :test-not the test function (sense inverted)
  1501.           :_s_t_a_r_t_    s_t_a_r_t_i_n_g_ i_n_d_e_x_
  1502.           :_e_n_d_      i_n_d_e_x_ o_f_ e_n_d_+_1_,_ o_r_ N_I_L_ f_o_r_ (_l_e_n_g_t_h_ <_e_x_p_r_>_)_
  1503.           returns   the sequence with the matching expressions deleted
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.      XLISP 2.0                 SEQUENCE FUNCTIONS                   Page 31
  1512.  
  1513.  
  1514.      (delete-if <test> <seq> &key :start :end)
  1515.                                              DELETE ELEMENTS THAT PASS TEST
  1516.           D_i_s_t_r_i_b_u_t_i_o_n_ o_n_l_y_ w_o_r_k_e_d_ o_n_ l_i_s_t_s_._
  1517.           <test>    the test predicate
  1518.           <seq>     the sequence
  1519.           :_s_t_a_r_t_    s_t_a_r_t_i_n_g_ i_n_d_e_x_
  1520.           :_e_n_d_      i_n_d_e_x_ o_f_ e_n_d_+_1_,_ o_r_ N_I_L_ f_o_r_ (_l_e_n_g_t_h_ <_e_x_p_r_>_)_
  1521.           returns   the sequence with matching elements deleted
  1522.  
  1523.      (delete-if-not <test> <seq> &key :start :end)
  1524.                                              DELETE ELEMENTS THAT FAIL TEST
  1525.           D_i_s_t_r_i_b_u_t_i_o_n_ o_n_l_y_ w_o_r_k_e_d_ o_n_ l_i_s_t_s_._
  1526.           <test>    the test predicate
  1527.           <seq>     the sequence
  1528.           :_s_t_a_r_t_    s_t_a_r_t_i_n_g_ i_n_d_e_x_
  1529.           :_e_n_d_      i_n_d_e_x_ o_f_ e_n_d_+_1_,_ o_r_ N_I_L_ f_o_r_ (_l_e_n_g_t_h_ <_e_x_p_r_>_)_
  1530.           returns   the sequence with non-matching elements deleted
  1531.  
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537.  
  1538.      XLISP 2.0                   LIST FUNCTIONS                     Page 32
  1539.  
  1540.  
  1541.  
  1542.      LIST FUNCTIONS 
  1543.  
  1544.      (car <expr>)                             RETURN THE CAR OF A LIST NODE
  1545.           <expr>    the list node
  1546.           returns   the car of the list node
  1547.  
  1548.      (cdr <expr>)                             RETURN THE CDR OF A LIST NODE
  1549.           <expr>    the list node
  1550.           returns   the cdr of the list node
  1551.  
  1552.      (cxxr <expr>)                                    ALL CxxR COMBINATIONS
  1553.      (cxxxr <expr>)                                  ALL CxxxR COMBINATIONS
  1554.      (cxxxxr <expr>)                                ALL CxxxxR COMBINATIONS
  1555.  
  1556.      (first <expr>)                                       A SYNONYM FOR CAR
  1557.      (second <expr>)                                     A SYNONYM FOR CADR
  1558.      (third <expr>)                                     A SYNONYM FOR CADDR
  1559.      (fourth <expr>)                                   A SYNONYM FOR CADDDR
  1560.      (rest <expr>)                                        A SYNONYM FOR CDR
  1561.  
  1562.      (cons <expr1> <expr2>)                       CONSTRUCT A NEW LIST NODE
  1563.           <expr1>   the car of the new list node
  1564.           <expr2>   the cdr of the new list node
  1565.           returns   the new list node
  1566.  
  1567.      (list <expr>...)                               CREATE A LIST OF VALUES
  1568.      (_l_i_s_t_*_ <_e_x_p_r_>_ ._._._ <_l_i_s_t_>_)_
  1569.           l_i_s_t_*_ i_s_ d_e_f_i_n_e_d_ i_n_ c_o_m_m_o_n_._l_s_p_
  1570.           <expr>    expressions to be combined into a list
  1571.           returns   the new list
  1572.  
  1573.      (append <expr>...)                                        APPEND LISTS
  1574.           <expr>    lists whose elements are to be appended
  1575.           returns   the new list
  1576.  
  1577.      (last <list>)                      RETURN THE LAST LIST NODE OF A LIST
  1578.           <list>    the list
  1579.           returns   the last list node in the list
  1580.  
  1581.      (member <expr> <list> &key :test :test-not)
  1582.                                                FIND AN EXPRESSION IN A LIST
  1583.           <expr>    the expression to find
  1584.           <list>    the list to search
  1585.           :test     the test function (defaults to eql)
  1586.           :test-not the test function (sense inverted)
  1587.           returns   the remainder of the list starting with the expression
  1588.  
  1589.  
  1590.  
  1591.  
  1592.  
  1593.  
  1594.  
  1595.      XLISP 2.0                   LIST FUNCTIONS                     Page 33
  1596.  
  1597.  
  1598.      (assoc <expr> <alist> &key :test :test-not)
  1599.                                             FIND AN EXPRESSION IN AN A-LIST
  1600.           <expr>    the expression to find
  1601.           <alist>   the association list
  1602.           :test     the test function (defaults to eql)
  1603.           :test-not the test function (sense inverted)
  1604.           returns   the alist entry or nil
  1605.  
  1606.      (nth <n> <list>)                      RETURN THE NTH ELEMENT OF A LIST
  1607.           <n>       the number of the element to return (zero origin)
  1608.           <list>    the list
  1609.           returns   the nth element or nil if the list isn't that long
  1610.  
  1611.      (nthcdr <n> <list>)                       RETURN THE NTH CDR OF A LIST
  1612.           <n>       the number of the element to return (zero origin)
  1613.           <list>    the list
  1614.           returns   the nth cdr or nil if the list isn't that long
  1615.  
  1616.      (mapc <fcn> <list1> <list>...)       APPLY FUNCTION TO SUCCESSIVE CARS
  1617.           <fcn>     the function or function name
  1618.           <listn>   a list for each argument of the function
  1619.           returns   the first list of arguments
  1620.  
  1621.      (mapcar <fcn> <list1> <list>...)     APPLY FUNCTION TO SUCCESSIVE CARS
  1622.           <fcn>     the function or function name
  1623.           <listn>   a list for each argument of the function
  1624.           returns   a list of the values returned
  1625.  
  1626.      (mapl <fcn> <list1> <list>...)       APPLY FUNCTION TO SUCCESSIVE CDRS
  1627.           <fcn>     the function or function name
  1628.           <listn>   a list for each argument of the function
  1629.           returns   the first list of arguments
  1630.  
  1631.      (maplist <fcn> <list1> <list>...)    APPLY FUNCTION TO SUCCESSIVE CDRS
  1632.           <fcn>     the function or function name
  1633.           <listn>   a list for each argument of the function
  1634.           returns   a list of the values returned
  1635.  
  1636.      (_m_a_p_c_a_n_ <_f_c_n_>_ <_l_i_s_t_1_>_ <_l_i_s_t_>_._._._)_     A_P_P_L_Y_ F_U_N_C_T_I_O_N_ T_O_ S_U_C_C_E_S_S_I_V_E_ C_A_R_S_
  1637.           <_f_c_n_>_     t_h_e_ f_u_n_c_t_i_o_n_ o_r_ f_u_n_c_t_i_o_n_ n_a_m_e_
  1638.           <_l_i_s_t_n_>_   a_ l_i_s_t_ f_o_r_ e_a_c_h_ a_r_g_u_m_e_n_t_ o_f_ t_h_e_ f_u_n_c_t_i_o_n_
  1639.           r_e_t_u_r_n_s_   l_i_s_t_ o_f_ r_e_t_u_r_n_ v_a_l_u_e_s_ n_c_o_n_c_'_d_ t_o_g_e_t_h_e_r_
  1640.           N_o_t_e_:_ t_h_i_s_ f_u_n_c_t_i_o_n_ i_s_ i_n_ i_n_i_t_._l_s_p_
  1641.  
  1642.      (_m_a_p_c_o_n_ <_f_c_n_>_ <_l_i_s_t_1_>_ <_l_i_s_t_>_._._._)_     A_P_P_L_Y_ F_U_N_C_T_I_O_N_ T_O_ S_U_C_C_E_S_S_I_V_E_ C_D_R_S_
  1643.           <_f_c_n_>_     t_h_e_ f_u_n_c_t_i_o_n_ o_r_ f_u_n_c_t_i_o_n_ n_a_m_e_
  1644.           <_l_i_s_t_n_>_   a_ l_i_s_t_ f_o_r_ e_a_c_h_ a_r_g_u_m_e_n_t_ o_f_ t_h_e_ f_u_n_c_t_i_o_n_
  1645.           r_e_t_u_r_n_s_   l_i_s_t_ o_f_ r_e_t_u_r_n_ v_a_l_u_e_s_ n_c_o_n_c_'_d_ t_o_g_e_t_h_e_r_
  1646.           N_o_t_e_:_ t_h_i_s_ f_u_n_c_t_i_o_n_ i_s_ i_n_ i_n_i_t_._l_s_p_
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.      XLISP 2.0                   LIST FUNCTIONS                     Page 34
  1655.  
  1656.  
  1657.      (subst <to> <from> <expr> &key :test :test-not)  SUBSTITUTE EXPRESSIONS
  1658.           M_o_d_i_f_i_e_d_ t_o_ d_o_ m_i_n_i_m_u_m_ c_o_p_y_i_n_g_ a_s_ i_n_ C_o_m_m_o_n_ L_i_s_p_
  1659.           <to>      the new expression
  1660.           <from>    the old expression
  1661.           <expr>    the expression in which to do the substitutions
  1662.           :test     the test function (defaults to eql)
  1663.           :test-not the test function (sense inverted)
  1664.           returns   the expression with substitutions
  1665.  
  1666.      (sublis <alist> <expr> &key :test :test-not)  SUBSTITUTE WITH AN A-LIST
  1667.           M_o_d_i_f_i_e_d_ t_o_ d_o_ m_i_n_i_m_u_m_ c_o_p_y_i_n_g_ a_s_ i_n_ C_o_m_m_o_n_ L_i_s_p_
  1668.           <alist>   the association list
  1669.           <expr>    the expression in which to do the substitutions
  1670.           :test     the test function (defaults to eql)
  1671.           :test-not the test function (sense inverted)
  1672.           returns   the expression with substitutions
  1673.  
  1674.      (_p_a_i_r_l_i_s_ <_k_e_y_s_>_ <_v_a_l_u_e_s_>_ <_a_l_i_s_t_>_)_       B_U_I_L_D_ A_N_ A_-_L_I_S_T_ F_R_O_M_ T_W_O_ L_I_S_T_S_
  1675.           I_n_ f_i_l_e_ c_o_m_m_o_n_._l_s_p_
  1676.           <_k_e_y_s_>_    l_i_s_t_ o_f_ a_s_s_o_c_i_a_t_i_o_n_ k_e_y_s_
  1677.           <_v_a_l_u_e_s_>_  l_i_s_t_ o_f_ a_s_s_o_c_i_a_t_i_o_n_ v_a_l_u_e_s_,_ s_a_m_e_ l_e_n_g_t_h_ a_s_ k_e_y_s_
  1678.           <_a_l_i_s_t_>_   e_x_i_s_t_i_n_g_ a_s_s_o_c_i_a_t_i_o_n_ l_i_s_t_
  1679.           r_e_t_u_r_n_s_   n_e_w_ a_s_s_o_c_i_a_t_i_o_n_ l_i_s_t_
  1680.  
  1681.      (_c_o_p_y_-_l_i_s_t_ <_l_i_s_t_>_)_                        C_O_P_Y_ T_H_E_ T_O_P_ L_E_V_E_L_ O_F_ A_ L_I_S_T_
  1682.           I_n_ f_i_l_e_ c_o_m_m_o_n_._l_s_p_
  1683.           <_l_i_s_t_>_    t_h_e_ l_i_s_t_
  1684.           r_e_t_u_r_n_s_   a_ c_o_p_y_ o_f_ t_h_e_ l_i_s_t_ (_n_e_w_ c_o_n_s_ c_e_l_l_s_ i_n_ t_o_p_ l_e_v_e_l_)_
  1685.  
  1686.      (_c_o_p_y_-_a_l_i_s_t_ <_a_l_i_s_t_>_)_                          C_O_P_Y_ A_N_ A_S_S_O_C_I_A_T_I_O_N_ L_I_S_T_
  1687.           I_n_ f_i_l_e_ c_o_m_m_o_n_._l_s_p_
  1688.           <_a_l_i_s_t_>_   t_h_e_ a_s_s_o_c_i_a_t_i_o_n_ l_i_s_t_
  1689.           r_e_t_u_r_n_s_   a_  c_o_p_y_ o_f_ t_h_e_  a_s_s_o_c_i_a_t_i_o_n_ l_i_s_t_  (_k_e_y_s_ a_n_d_  v_a_l_u_e_s_ n_o_t_
  1690.           c_o_p_i_e_s_)_
  1691.  
  1692.      (_c_o_p_y_-_t_r_e_e_ <_t_r_e_e_>_)_                                         C_O_P_Y_ A_ T_R_E_E_
  1693.           I_n_ f_i_l_e_ c_o_m_m_o_n_._l_s_p_
  1694.           <_t_r_e_e_>_    a_ t_r_e_e_ s_t_r_u_c_t_u_r_e_ o_f_ c_o_n_s_ c_e_l_l_s_
  1695.           r_e_t_u_r_n_s_   a_ c_o_p_y_ o_f_ t_h_e_ t_r_e_e_ s_t_r_u_c_t_u_r_e_
  1696.  
  1697.      (_m_a_k_e___t_c_o_n_c_)_                                    M_A_K_E_ A_ T_C_O_N_C_ S_T_R_U_C_T_U_R_E_
  1698.           I_n_  f_i_l_e_ c_o_m_m_o_n_._l_s_p_._  (_n_o_t_e_  t_h_a_t_ s_t_r_i_n_g_  s_t_r_e_a_m_s_ a_r_e_  i_n_t_e_r_n_a_l_l_y_
  1699.           i_m_p_l_e_m_e_n_t_e_d_ a_s_ T_C_O_N_C_s_._ O_l_d_e_r_ v_e_r_s_i_o_n_s_ o_f_ x_l_i_s_p_ a_l_l_o_w_e_d_ a_n_y_  T_C_O_N_C_
  1700.           t_o_ b_e_ u_s_e_d_ a_s_ a_ s_t_e_a_m_,_ b_u_t_ 2_._0_ i_m_p_l_e_m_e_n_t_s_ a_ s_p_e_c_i_a_l_ s_t_r_i_n_g_ s_t_r_e_a_m_
  1701.           t_y_p_e_._)_
  1702.           r_e_t_u_r_n_s_   a_n_ e_m_p_t_y_ t_c_o_n_c_ s_t_r_u_c_t_u_r_e_
  1703.  
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.      XLISP 2.0                   LIST FUNCTIONS                     Page 35
  1711.  
  1712.  
  1713.      (_t_c_o_n_c_ <_t_c_o_n_c_>_ <_e_x_p_r_>_)_                  A_D_D_ T_O_ T_A_I_L_ O_F_ T_C_O_N_C_ S_T_R_U_C_T_U_R_E_
  1714.      (_l_c_o_n_c_ <_t_c_o_n_c_>_ <_l_i_s_t_>_)_
  1715.           I_n_ f_i_l_e_ c_o_m_m_o_n_._l_s_p_
  1716.           <_t_c_o_n_c_>_   a_ t_c_o_n_c_ s_t_r_u_c_t_u_r_e_
  1717.           <_e_x_p_r_>_    e_l_e_m_e_n_t_ t_o_ a_d_d_ t_o_ t_a_i_l_
  1718.           <_l_i_s_t_>_    l_i_s_t_ o_f_ e_l_e_m_e_n_t_s_ t_o_ a_d_d_ t_o_ t_a_i_l_
  1719.           r_e_t_u_r_n_s_   m_o_d_i_f_i_e_d_ t_c_o_n_c_
  1720.  
  1721.      (_r_e_m_o_v_e_-_h_e_a_d_ <_t_c_o_n_c_>_)_              R_E_M_O_V_E_ F_R_O_M_ H_E_A_D_ O_F_ T_C_O_N_C_ S_T_R_U_C_T_U_R_E_
  1722.           I_n_ f_i_l_e_ c_o_m_m_o_n_._l_s_p_
  1723.           <_t_c_o_n_c_>_   a_ t_c_o_n_c_ s_t_r_u_c_t_u_r_e_
  1724.           r_e_t_u_r_n_s_   h_e_a_d_ o_f_ t_c_o_n_c_ (_t_c_o_n_c_ i_s_ m_o_d_i_f_i_e_d_)_
  1725.  
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.      XLISP 2.0             DESTRUCTIVE LIST FUNCTIONS               Page 36
  1733.  
  1734.  
  1735.  
  1736.      DESTRUCTIVE LIST FUNCTIONS
  1737.  
  1738.      S_e_e_  a_l_s_o_  n_r_e_v_e_r_s_e_,_  d_e_l_e_t_e_,_  d_e_l_e_t_e_-_i_f_,_  a_n_d_   d_e_l_e_t_e_-_i_f_-_n_o_t_,_  u_n_d_e_r_
  1739.      S_E_Q_U_E_N_C_E_ F_U_N_C_T_I_O_N_S_._
  1740.  
  1741.      (rplaca <list> <expr>)                  REPLACE THE CAR OF A LIST NODE
  1742.           <list>    the list node
  1743.           <expr>    the new value for the car of the list node
  1744.           returns   the list node after updating the car
  1745.  
  1746.      (rplacd <list> <expr>)                  REPLACE THE CDR OF A LIST NODE
  1747.           <list>    the list node
  1748.           <expr>    the new value for the cdr of the list node
  1749.           returns   the list node after updating the cdr
  1750.  
  1751.      (nconc <list>...)                      DESTRUCTIVELY CONCATENATE LISTS
  1752.           <list>    lists to concatenate
  1753.           returns   the result of concatenating the lists
  1754.  
  1755.      (sort <list> <test>)                                       SORT A LIST
  1756.           <list>    the list to sort
  1757.           <test>    the comparison function
  1758.           returns   the sorted list
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.  
  1766.      XLISP 2.0                ARITHMETIC FUNCTIONS                  Page 37
  1767.  
  1768.  
  1769.  
  1770.      ARITHMETIC FUNCTIONS
  1771.  
  1772.      W_a_r_n_i_n_g_:_ i_n_t_e_g_e_r_ c_a_l_c_u_l_a_t_i_o_n_s_ t_h_a_t_ o_v_e_r_f_l_o_w_ g_i_v_e_ e_r_r_o_n_e_o_u_s_ r_e_s_u_l_t_s_._
  1773.      A_S_I_N_,_ A_C_O_S_,_ a_n_d_ A_T_A_N_ a_r_e_ r_e_t_r_o_f_i_t_t_e_d_ f_r_o_m_ X_L_I_S_P_ 2_._1_._
  1774.  
  1775.      (truncate <expr>)      TRUNCATES A FLOATING POINT NUMBER TO AN INTEGER
  1776.           <expr>    the number
  1777.           returns   the result of truncating the number
  1778.  
  1779.      (float <expr>)          CONVERTS AN INTEGER TO A FLOATING POINT NUMBER
  1780.           <expr>    the number
  1781.           returns   the result of floating the integer
  1782.  
  1783.      (+ <expr>...)                                    ADD A LIST OF NUMBERS
  1784.           <expr>    the numbers
  1785.           returns   the result of the addition
  1786.  
  1787.      (- <expr>...)     SUBTRACT A LIST OF NUMBERS OR NEGATE A SINGLE NUMBER
  1788.           <expr>    the numbers
  1789.           returns   the result of the subtraction
  1790.  
  1791.      (* <expr>...)                               MULTIPLY A LIST OF NUMBERS
  1792.           <expr>    the numbers
  1793.           returns   the result of the multiplication
  1794.  
  1795.      (/ <expr>...)       DIVIDE A LIST OF NUMBERS OR INVERT A SINGLE NUMBER
  1796.           <expr>    the numbers
  1797.           returns   the result of the division
  1798.  
  1799.      (1+ <expr>)                                        ADD ONE TO A NUMBER
  1800.           <expr>    the number
  1801.           returns   the number plus one
  1802.  
  1803.      (1- <expr>)                                 SUBTRACT ONE FROM A NUMBER
  1804.           <expr>    the number
  1805.           returns   the number minus one
  1806.  
  1807.      (rem <expr>...)                         REMAINDER OF A LIST OF NUMBERS
  1808.           <expr>    the numbers
  1809.           returns   the result of the remainder operation
  1810.  
  1811.      (min <expr>...)                      THE SMALLEST OF A LIST OF NUMBERS
  1812.           <expr>    the expressions to be checked
  1813.           returns   the smallest number in the list
  1814.  
  1815.      (max <expr>...)                       THE LARGEST OF A LIST OF NUMBERS
  1816.           <expr>    the expressions to be checked
  1817.           returns   the largest number in the list
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.      XLISP 2.0                ARITHMETIC FUNCTIONS                  Page 38
  1826.  
  1827.  
  1828.      (abs <expr>)                            THE ABSOLUTE VALUE OF A NUMBER
  1829.           <expr>    the number
  1830.           returns   the absolute value of the number
  1831.  
  1832.      (gcd <n1> <n2>...)                 COMPUTE THE GREATEST COMMON DIVISOR
  1833.           <n1>      the first number (integer)
  1834.           <n2>      the second number(s) (integer)
  1835.           returns   the greatest common divisor
  1836.  
  1837.      (random <n>)                 COMPUTE A RANDOM NUMBER BETWEEN 1 and N-1
  1838.           <n>       the upper bound (integer)
  1839.           returns   a random number
  1840.  
  1841.      (sin <expr>)                              COMPUTE THE SINE OF A NUMBER
  1842.           <expr>    the floating point number
  1843.           returns   the sine of the number
  1844.  
  1845.      (cos <expr>)                            COMPUTE THE COSINE OF A NUMBER
  1846.           <expr>    the floating point number
  1847.           returns   the cosine of the number
  1848.  
  1849.      (tan <expr>)                           COMPUTE THE TANGENT OF A NUMBER
  1850.           <expr>    the floating point number
  1851.           returns   the tangent of the number
  1852.  
  1853.      (asin <expr>)                         COMPUTE THE ARC SINE OF A NUMBER
  1854.           <expr>    the floating point number
  1855.           returns   the arc sine of the number
  1856.  
  1857.      (acos <expr>)                       COMPUTE THE ARC COSINE OF A NUMBER
  1858.           <expr>    the floating point number
  1859.           returns   the arc cosine of the number
  1860.  
  1861.      (atan <expr>)                      COMPUTE THE ARC TANGENT OF A NUMBER
  1862.           <expr>    the floating point number
  1863.           returns   the arc tangent of the number
  1864.  
  1865.      (expt <x-expr> <y-expr>)                      COMPUTE X TO THE Y POWER
  1866.           <x-expr>  the floating point number
  1867.           <y-expr>  the floating point exponent
  1868.           returns   x to the y power
  1869.  
  1870.      (exp <x-expr>)                                COMPUTE E TO THE X POWER
  1871.           <x-expr>  the floating point number
  1872.           returns   e to the x power
  1873.  
  1874.      (sqrt <expr>)                      COMPUTE THE SQUARE ROOT OF A NUMBER
  1875.           <expr>    the floating point number
  1876.           returns   the square root of the number
  1877.  
  1878.  
  1879.  
  1880.  
  1881.  
  1882.  
  1883.  
  1884.      XLISP 2.0                ARITHMETIC FUNCTIONS                  Page 39
  1885.  
  1886.  
  1887.      (< <n1> <n2>...)                                    TEST FOR LESS THAN
  1888.      (<= <n1> <n2>...)                       TEST FOR LESS THAN OR EQUAL TO
  1889.      (= <n1> <n2>...)                                     TEST FOR EQUAL TO
  1890.      (/= <n1> <n2>...)                                TEST FOR NOT EQUAL TO
  1891.      (>= <n1> <n2>...)                    TEST FOR GREATER THAN OR EQUAL TO
  1892.      (> <n1> <n2>...)                                 TEST FOR GREATER THAN
  1893.           <n1>      the first number to compare
  1894.           <n2>      the second number to compare
  1895.           returns   the result of comparing <n1> with <n2>...
  1896.  
  1897.  
  1898.  
  1899.  
  1900.  
  1901.  
  1902.  
  1903.      XLISP 2.0              BITWISE LOGICAL FUNCTIONS               Page 40
  1904.  
  1905.  
  1906.  
  1907.      BITWISE LOGICAL FUNCTIONS
  1908.  
  1909.      (logand <expr>...)                THE BITWISE AND OF A LIST OF NUMBERS
  1910.           <expr>    the numbers
  1911.           returns   the result of the and operation
  1912.  
  1913.      (logior <expr>...)       THE BITWISE INCLUSIVE OR OF A LIST OF NUMBERS
  1914.           <expr>    the numbers
  1915.           returns   the result of the inclusive or operation
  1916.  
  1917.      (logxor <expr>...)       THE BITWISE EXCLUSIVE OR OF A LIST OF NUMBERS
  1918.           <expr>    the numbers
  1919.           returns   the result of the exclusive or operation
  1920.  
  1921.      (lognot <expr>)                            THE BITWISE NOT OF A NUMBER
  1922.           <expr>    the number
  1923.           returns   the bitwise inversion of number
  1924.  
  1925.  
  1926.  
  1927.  
  1928.  
  1929.  
  1930.  
  1931.      XLISP 2.0                  STRING FUNCTIONS                    Page 41
  1932.  
  1933.  
  1934.  
  1935.      STRING FUNCTIONS
  1936.  
  1937.      E_x_t_e_n_s_i_o_n_ b_e_y_o_n_d_ d_i_s_t_r_i_b_u_t_i_o_n_:_ f_u_n_c_t_i_o_n_s_ w_i_t_h_ n_a_m_e_s_  s_t_a_r_t_i_n_g_ "_s_t_r_i_n_g_"_
  1938.      w_i_l_l_ a_l_s_o_  a_c_c_e_p_t_ a_ s_y_m_b_o_l_,_ i_n_  w_h_i_c_h_ c_a_s_e_ t_h_e_ s_y_m_b_o_l_'_s_  p_r_i_n_t_ n_a_m_e_ i_s_
  1939.      u_s_e_d_._
  1940.  
  1941.      (string <expr>)              MAKE A STRING FROM AN INTEGER ASCII VALUE
  1942.           <expr>    a_n_  i_n_t_e_g_e_r_ (_w_h_i_c_h_  i_s_ f_i_r_s_t_  c_o_n_v_e_r_t_e_d_ i_n_t_o_  i_t_s_ A_S_C_I_I_
  1943.                     c_h_a_r_a_c_t_e_r_ v_a_l_u_e_)_,_ s_t_r_i_n_g_,_ c_h_a_r_a_c_t_e_r_,_ o_r_ s_y_m_b_o_l_
  1944.           returns   t_h_e_ s_t_r_i_n_g_ r_e_p_r_e_s_e_n_t_a_t_i_o_n_ o_f_ t_h_e_ a_r_g_u_m_e_n_t_
  1945.  
  1946.      (string-trim <bag> <str>)                   TRIM BOTH ENDS OF A STRING
  1947.           <bag>     a string containing characters to trim
  1948.           <str>     the string to trim
  1949.           returns   a trimed copy of the string
  1950.  
  1951.      (string-left-trim <bag> <str>)           TRIM THE LEFT END OF A STRING
  1952.           <bag>     a string containing characters to trim
  1953.           <str>     the string to trim
  1954.           returns   a trimed copy of the string
  1955.  
  1956.      (string-right-trim <bag> <str>)         TRIM THE RIGHT END OF A STRING
  1957.           <bag>     a string containing characters to trim
  1958.           <str>     the string to trim
  1959.           returns   a trimed copy of the string
  1960.  
  1961.      (string-upcase <str> &key :start :end)            CONVERT TO UPPERCASE
  1962.           <str>     the string
  1963.           :start    the starting offset
  1964.           :end      the ending offset + 1 o_r_ N_I_L_ f_o_r_ e_n_d_ o_f_ s_t_r_i_n_g_
  1965.           returns   a converted copy of the string
  1966.  
  1967.      (string-downcase <str> &key :start :end)          CONVERT TO LOWERCASE
  1968.           <str>     the string
  1969.           :start    the starting offset
  1970.           :end      the ending offset + 1 o_r_ N_I_L_ f_o_r_ e_n_d_ o_f_ s_t_r_i_n_g_
  1971.           returns   a converted copy of the string
  1972.  
  1973.      (nstring-upcase <str> &key :start :end)           CONVERT TO UPPERCASE
  1974.           <str>     the string
  1975.           :start    the starting offset
  1976.           :end      the ending offset + 1 o_r_ N_I_L_ f_o_r_ e_n_d_ o_f_ s_t_r_i_n_g_
  1977.           returns   the converted string (not a copy)
  1978.  
  1979.      (nstring-downcase <str> &key :start :end)         CONVERT TO LOWERCASE
  1980.           <str>     the string
  1981.           :start    the starting offset
  1982.           :end      the ending offset + 1 o_r_ N_I_L_ f_o_r_ e_n_d_ o_f_ s_t_r_i_n_g_
  1983.           returns   the converted string (not a copy)
  1984.  
  1985.  
  1986.  
  1987.  
  1988.  
  1989.  
  1990.  
  1991.      XLISP 2.0                  STRING FUNCTIONS                    Page 42
  1992.  
  1993.  
  1994.      (strcat <expr>...)                                 CONCATENATE STRINGS
  1995.           M_a_c_r_o_ i_n_ i_n_i_t_._l_s_p_,_ t_o_ m_a_i_n_t_a_i_n_ c_o_m_p_a_t_i_b_i_l_i_t_y_ w_i_t_h_ d_i_s_t_r_i_b_u_t_i_o_n_._
  1996.           S_e_e_ "_c_o_n_c_a_t_e_n_a_t_e_"_._
  1997.           <expr>    the strings to concatenate
  1998.           returns   the result of concatenating the strings
  1999.  
  2000.      (string< <str1> <str2> &key :start1 :end1 :start2 :end2)
  2001.      (string<= <str1> <str2> &key :start1 :end1 :start2 :end2)
  2002.      (string= <str1> <str2> &key :start1 :end1 :start2 :end2)
  2003.      (string/= <str1> <str2> &key :start1 :end1 :start2 :end2)
  2004.      (string>= <str1> <str2> &key :start1 :end1 :start2 :end2)
  2005.      (string> <str1> <str2> &key :start1 :end1 :start2 :end2)
  2006.           <str1>    the first string to compare
  2007.           <str2>    the second string to compare
  2008.           :start1   first substring starting offset
  2009.           :end1     first substring ending  offset +  1 o_r_ N_I_L_  f_o_r_ e_n_d_  o_f_
  2010.                     s_t_r_i_n_g_
  2011.           :start2   second substring starting offset
  2012.           :end2     second  substring ending offset +  1 o_r_ N_I_L_  f_o_r_ e_n_d_ o_f_
  2013.                     s_t_r_i_n_g_
  2014.           returns   t if predicate is true, nil otherwise
  2015.           Note: case is significant with these comparison functions.
  2016.  
  2017.      (string-lessp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2018.      (string-not-greaterp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2019.      (string-equalp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2020.      (string-not-equalp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2021.      (string-not-lessp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2022.      (string-greaterp <str1> <str2> &key :start1 :end1 :start2 :end2)
  2023.           <str1>    the first string to compare
  2024.           <str2>    the second string to compare
  2025.           :start1   first substring starting offset
  2026.           :end1     first substring ending  offset +  1 o_r_ N_I_L_  f_o_r_ e_n_d_  o_f_
  2027.                     s_t_r_i_n_g_
  2028.           :start2   second substring starting offset
  2029.           :end2     second  substring ending offset +  1 o_r_ N_I_L_  f_o_r_ e_n_d_ o_f_
  2030.                     s_t_r_i_n_g_
  2031.           returns   t if predicate is true, nil otherwise
  2032.           Note: case is not significant with these comparison functions.
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039.  
  2040.      XLISP 2.0                 CHARACTER FUNCTIONS                  Page 43
  2041.  
  2042.  
  2043.  
  2044.      CHARACTER FUNCTIONS
  2045.  
  2046.      (char <string> <index>)              EXTRACT A CHARACTER FROM A STRING
  2047.           <string>  the string
  2048.           <index>   the string index (zero relative)
  2049.           returns   the ascii code of the character
  2050.  
  2051.      (upper-case-p <chr>)                  IS THIS AN UPPER CASE CHARACTER?
  2052.           <chr>     the character
  2053.           returns   true if the character is upper case, nil otherwise
  2054.  
  2055.      (lower-case-p <chr>)                   IS THIS A LOWER CASE CHARACTER?
  2056.           <chr>     the character
  2057.           returns   true if the character is lower case, nil otherwise
  2058.  
  2059.      (both-case-p <chr>)     IS THIS AN ALPHABETIC (EITHER CASE) CHARACTER?
  2060.           <chr>     the character
  2061.           returns   true if the character is alphabetic, nil otherwise
  2062.  
  2063.      (digit-char-p <chr>)                        IS THIS A DIGIT CHARACTER?
  2064.           <chr>     the character
  2065.           returns   the digit weight if character is a digit, nil otherwise
  2066.  
  2067.      (char-code <chr>)                    GET THE ASCII CODE OF A CHARACTER
  2068.           <chr>     the character
  2069.           returns   the ASCII character code (integer,_ p_a_r_i_t_y_ b_i_t_ s_t_r_i_p_p_e_d_)
  2070.  
  2071.      (code-char <code>)        GET THE CHARACTER WITH A SPECFIED ASCII CODE
  2072.           <code>    the ASCII code (integer,_ r_a_n_g_e_ 0_-_1_2_7_)
  2073.           returns   the character with that code or nil
  2074.  
  2075.      (char-upcase <chr>)                  CONVERT A CHARACTER TO UPPER CASE
  2076.           <chr>     the character
  2077.           returns   the upper case character
  2078.  
  2079.      (char-downcase <chr>)                CONVERT A CHARACTER TO LOWER CASE
  2080.           <chr>     the character
  2081.           returns   the lower case character
  2082.  
  2083.      (digit-char <n>)                     CONVERT A DIGIT WEIGHT TO A DIGIT
  2084.           <n>       the digit weight (integer)
  2085.           returns   the digit character or nil
  2086.  
  2087.      (char-int <chr>)                     CONVERT A CHARACTER TO AN INTEGER
  2088.           <chr>     the character
  2089.           returns   the ASCII character code (_r_a_n_g_e_ 0_-_2_5_5_)_
  2090.  
  2091.      (int-char <int>)                     CONVERT AN INTEGER TO A CHARACTER
  2092.           <int>     the ASCII character code (_t_r_e_a_t_e_d_ m_o_d_u_l_o_ 2_5_6_)_
  2093.           returns   the character with that code
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099.  
  2100.  
  2101.      XLISP 2.0                 CHARACTER FUNCTIONS                  Page 44
  2102.  
  2103.  
  2104.      (char< <chr1> <chr2>...)
  2105.      (char<= <chr1> <chr2>...)
  2106.      (char= <chr1> <chr2>...)
  2107.      (char/= <chr1> <chr2>...)
  2108.      (char>= <chr1> <chr2>...)
  2109.      (char> <chr1> <chr2>...)
  2110.           <chr1>    the first character to compare
  2111.           <chr2>    the second character(s) to compare
  2112.           returns   t if predicate is true, nil otherwise
  2113.           Note: case is significant with these comparison functions.
  2114.  
  2115.      (char-lessp <chr1> <chr2>...)
  2116.      (char-not-greaterp <chr1> <chr2>...)
  2117.      (char-equalp <chr1> <chr2>...)
  2118.      (char-not-equalp <chr1> <chr2>...)
  2119.      (char-not-lessp <chr1> <chr2>...)
  2120.      (char-greaterp <chr1> <chr2>...)
  2121.           <chr1>    the first string to compare
  2122.           <chr2>    the second string(s) to compare
  2123.           returns   t if predicate is true, nil otherwise
  2124.           Note: case is not significant with these comparison functions.
  2125.  
  2126.  
  2127.  
  2128.  
  2129.  
  2130.  
  2131.  
  2132.      XLISP 2.0                 STRUCTURE FUNCTIONS                  Page 45
  2133.  
  2134.  
  2135.  
  2136.      STRUCTURE FUNCTIONS
  2137.  
  2138.      (_A_d_d_e_d_ f_e_a_t_u_r_e_ f_r_o_m_ X_L_I_S_P_ 2_._1_)_
  2139.  
  2140.      XLISP  provides  a  subset  of the  Common  Lisp  structure definition
  2141.      facility.  No slot  options are  allowed, but  slots can  have default
  2142.      initialization expressions.
  2143.  
  2144.           (defstruct name <slot-desc>...)
  2145.      or
  2146.           (defstruct (name <option>...) <slot-desc>...)
  2147.                     fsubr
  2148.                     <name>              the structure name symbol (quoted)
  2149.                     <option>            option description (quoted)
  2150.                     <slot-desc>         slot descriptions (quoted)
  2151.                     returns             the structure name
  2152.  
  2153.      The recognized options are:
  2154.  
  2155.           (:conc-name name)
  2156.           (:include name [<slot-desc>...])
  2157.  
  2158.      Note that if :CONC-NAME appears, it should be before :INCLUDE.
  2159.  
  2160.      Each slot description takes the form:
  2161.  
  2162.           <name>
  2163.      or
  2164.           (<name> <defexpr>)
  2165.  
  2166.      If the  default initialization expression  is not specified,  the slot
  2167.      will  be initialized to  NIL if no  keyword argument is  passed to the
  2168.      creation function.
  2169.  
  2170.      DEFSTRUCT causes access functions to be created for each of  the slots
  2171.      and also arranges that SETF will work with those access functions. The
  2172.      access function  names are constructed  by taking the  structure name,
  2173.      appending  a  '-' and  then  appending  the  slot  name. This  can  be
  2174.      overridden by using the :CONC-NAME option.
  2175.  
  2176.      DEFSTRUCT also  makes a creation function  called MAKE-<structname>, a
  2177.      copy function called COPY-<structname> and a predicate function called
  2178.      <structname>-P. The creation function takes keyword arguments for each
  2179.      of the slots. Structures can  be created using the #S( read  macro, as
  2180.      well.
  2181.  
  2182.      The  property *struct-slots*  is added  to the  symbol that  names the
  2183.      structure. This property consists of an association list of slot names
  2184.      and closures  that evaluate to the  initial values (NIL if  no initial
  2185.      value expression).
  2186.  
  2187.  
  2188.  
  2189.  
  2190.  
  2191.  
  2192.  
  2193.      XLISP 2.0                 STRUCTURE FUNCTIONS                  Page 46
  2194.  
  2195.  
  2196.      For instance:
  2197.  
  2198.           (defstruct foo bar (gag 2))
  2199.  
  2200.      creates the following functions:
  2201.  
  2202.           (foo-bar <expr>)
  2203.           (setf (foo-bar <expr>) <value>)
  2204.           (foo-gag <expr>)
  2205.           (setf (foo-gag <expr>) <value>)
  2206.           (make-foo &key :bar :gag)
  2207.           (copy-foo <expr>)
  2208.           (foo-p <expr>)
  2209.  
  2210.  
  2211.  
  2212.  
  2213.  
  2214.  
  2215.  
  2216.      XLISP 2.0                  OBJECT FUNCTIONS                    Page 47
  2217.  
  2218.  
  2219.  
  2220.      OBJECT FUNCTIONS
  2221.  
  2222.      T_h_i_s_  s_e_c_t_i_o_n_ i_s_ c_o_m_p_l_e_t_e_l_y_ n_e_w_._  N_o_t_e_ t_h_a_t_ t_h_e_  f_u_n_c_t_i_o_n_s_ p_r_o_v_i_d_e_d_ i_n_
  2223.      c_l_a_s_s_e_s_._l_s_p_ a_r_e_ u_s_e_f_u_l_ b_u_t_ n_o_t_ n_e_c_e_s_s_a_r_y_._
  2224.  
  2225.      Messages defined for Object and Class are listed starting on page 17.
  2226.  
  2227.      (send <object> <message> [<args>...])                   SEND A MESSAGE
  2228.           <object>  the object to receive the message
  2229.           <message> message sent to object
  2230.           <args>    arguments to method (if any)
  2231.           returns   the result of the method
  2232.  
  2233.      (send-super <message> [<args>])           SEND A MESSAGE TO SUPERCLASS
  2234.           valid only in method context
  2235.           <message> message sent to objects superclass
  2236.           <args>    arguments to method (if any)
  2237.           returns   the result of the method
  2238.  
  2239.      (defclass <sym> <ivars> [<cvars> [<super>]])        DEFINE A NEW CLASS
  2240.           defined in class.lsp as a macro
  2241.           <sym>     symbol whose value is  to be bound to the  class object
  2242.                     (quoted)
  2243.           <ivars>   list of instance variables (quoted). Instance variables
  2244.                     specified  either  as  <ivar>  or  (<ivar>  <init>)  to
  2245.                     specify non-nil default initial value.
  2246.           <cvars>   list of class variables (quoted)
  2247.           <super>   superclass, or Object if absent.
  2248.           This function  sends :SET-PNAME  (defined in classes.lsp)  to the
  2249.           new class to set the class' print name instance variable.
  2250.           Methods defined for classes defined with defclass:
  2251.           (send <object> :<ivar>)
  2252.                     Returns the specified instance variable
  2253.           (send <object> :SET-IVAR <ivar> <value>)
  2254.                     Used to set an instance variable, typically with setf.
  2255.           (send <sym> :NEW {:<ivar> <init>})
  2256.                     Actually  definition  for  :ISNEW. Creates  new  object
  2257.                     initializing instance variables as specified in keyword
  2258.                     arguments, or  to their default if  keyword argument is
  2259.                     missing. Returns the object.
  2260.  
  2261.      (defmethod <class> <sym> <fargs> <expr> ...)       DEFINE A NEW METHOD
  2262.           defined in class.lsp as a macro
  2263.           <class>   Class which will respond to message
  2264.           <sym>     Message name (quoted)
  2265.           <fargs>   Formal  argument   list.  Leading  "self"   is  implied
  2266.                     (quoted)
  2267.           <expr>    Expressions constituting body of method (quoted)
  2268.           returns   the class object.
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274.  
  2275.  
  2276.      XLISP 2.0                  OBJECT FUNCTIONS                    Page 48
  2277.  
  2278.  
  2279.      (definst <class> <sym> [<args>...])       DEFINE A NEW GLOBAL INSTANCE
  2280.           defined in class.lsp as a macro
  2281.           <class>   Class of new object
  2282.           <sym>     Symbol whose value will be set to new object
  2283.           <args>    Arguments passed to :NEW  (typically initial values for
  2284.                     instance variables)
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.      XLISP 2.0                 PREDICATE FUNCTIONS                  Page 49
  2293.  
  2294.  
  2295.  
  2296.      PREDICATE FUNCTIONS
  2297.  
  2298.      (atom <expr>)                                         IS THIS AN ATOM?
  2299.           <expr>    the expression to check
  2300.           returns   t if the value is an atom, nil otherwise
  2301.  
  2302.      (symbolp <expr>)                                     IS THIS A SYMBOL?
  2303.           <expr>    the expression to check
  2304.           returns   t if the expression is a symbol, nil otherwise
  2305.  
  2306.      (numberp <expr>)                                     IS THIS A NUMBER?
  2307.           <expr>    the expression to check
  2308.           returns   t if the expression is a number, nil otherwise
  2309.  
  2310.      (null <expr>)                                   IS THIS AN EMPTY LIST?
  2311.           <expr>    the list to check
  2312.           returns   t if the list is empty, nil otherwise
  2313.  
  2314.      (not <expr>)                                            IS THIS FALSE?
  2315.           <expr>    the expression to check
  2316.           return    t if the value is nil, nil otherwise
  2317.  
  2318.      (listp <expr>)                                         IS THIS A LIST?
  2319.           <expr>    the expression to check
  2320.           returns   t if the value is a cons or nil, nil otherwise
  2321.  
  2322.      (endp <list>)                               IS THIS THE END OF A LIST?
  2323.           <list>    the list
  2324.           returns   t if the value is nil, nil otherwise
  2325.  
  2326.      (consp <expr>)                               IS THIS A NON-EMPTY LIST?
  2327.           <expr>    the expression to check
  2328.           returns   t if the value is a cons, nil otherwise
  2329.  
  2330.      (integerp <expr>)                                  IS THIS AN INTEGER?
  2331.           <expr>    the expression to check
  2332.           returns   t if the value is an integer, nil otherwise
  2333.  
  2334.      (floatp <expr>)                                       IS THIS A FLOAT?
  2335.           <expr>    the expression to check
  2336.           returns   t if the value is a float, nil otherwise
  2337.  
  2338.      (stringp <expr>)                                     IS THIS A STRING?
  2339.           <expr>    the expression to check
  2340.           returns   t if the value is a string, nil otherwise
  2341.  
  2342.      (characterp <expr>)                               IS THIS A CHARACTER?
  2343.           <expr>    the expression to check
  2344.           returns   t if the value is a character, nil otherwise
  2345.  
  2346.  
  2347.  
  2348.  
  2349.  
  2350.  
  2351.  
  2352.      XLISP 2.0                 PREDICATE FUNCTIONS                  Page 50
  2353.  
  2354.  
  2355.      (arrayp <expr>)                                      IS THIS AN ARRAY?
  2356.           <expr>    the expression to check
  2357.           returns   t if the value is an array, nil otherwise
  2358.  
  2359.      (streamp <expr>)                                     IS THIS A STREAM?
  2360.           <expr>    the expression to check
  2361.           returns   t if the value is a stream, nil otherwise
  2362.  
  2363.      (objectp <expr>)                                    IS THIS AN OBJECT?
  2364.           <expr>    the expression to check
  2365.           returns   t if the value is an object, nil otherwise
  2366.  
  2367.      (classp <expr>)                                IS THIS A CLASS OBJECT?
  2368.           <expr>    the expression to check
  2369.           returns   t if the value is a class object, nil otherwise
  2370.  
  2371.      (boundp <sym>)                        IS A VALUE BOUND TO THIS SYMBOL?
  2372.           <sym>     the symbol
  2373.           returns   t if a value is bound to the symbol, nil otherwise
  2374.  
  2375.      (fboundp <sym>)            IS A FUNCTIONAL VALUE BOUND TO THIS SYMBOL?
  2376.           <sym>     the symbol
  2377.           returns   t if a  functional value  is bound to  the symbol,  nil
  2378.                     otherwise
  2379.  
  2380.      (minusp <expr>)                               IS THIS NUMBER NEGATIVE?
  2381.           <expr>    the number to test
  2382.           returns   t if the number is negative, nil otherwise
  2383.  
  2384.      (zerop <expr>)                                    IS THIS NUMBER ZERO?
  2385.           <expr>    the number to test
  2386.           returns   t if the number is zero, nil otherwise
  2387.  
  2388.      (plusp <expr>)                                IS THIS NUMBER POSITIVE?
  2389.           <expr>    the number to test
  2390.           returns   t if the number is positive, nil otherwise
  2391.  
  2392.      (evenp <expr>)                                   IS THIS INTEGER EVEN?
  2393.           <expr>    the integer to test
  2394.           returns   t if the integer is even, nil otherwise
  2395.  
  2396.      (oddp <expr>)                                     IS THIS INTEGER ODD?
  2397.           <expr>    the integer to test
  2398.           returns   t if the integer is odd, nil otherwise
  2399.  
  2400.      (eq <expr1> <expr2>)                    ARE THE EXPRESSIONS IDENTICAL?
  2401.           <expr1>   the first expression
  2402.           <expr2>   the second expression
  2403.           returns   t if they are equal, nil otherwise
  2404.  
  2405.  
  2406.  
  2407.  
  2408.  
  2409.  
  2410.  
  2411.      XLISP 2.0                 PREDICATE FUNCTIONS                  Page 51
  2412.  
  2413.  
  2414.      (eql <expr1> <expr2>)                   ARE THE EXPRESSIONS IDENTICAL?
  2415.           Note: works with all numbers
  2416.           <expr1>   the first expression
  2417.           <expr2>   the second expression
  2418.           returns   t if they are equal, nil otherwise
  2419.  
  2420.      (equal <expr1> <expr2>)                     ARE THE EXPRESSIONS EQUAL?
  2421.           <expr1>   the first expression
  2422.           <expr2>   the second expression
  2423.           returns   t if they are equal, nil otherwise
  2424.  
  2425.  
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.      XLISP 2.0                 CONTROL CONSTRUCTS                   Page 52
  2432.  
  2433.  
  2434.  
  2435.      CONTROL CONSTRUCTS
  2436.  
  2437.      (cond <pair>...)                                EVALUATE CONDITIONALLY
  2438.           f_s_u_b_r_
  2439.           <pair>    pair consisting of:
  2440.                     (<pred> <expr>...)
  2441.                     where
  2442.                     <pred>    is a predicate expression
  2443.                     <expr>    evaluated if the predicate is not nil
  2444.           returns   the value  of the  first expression whose  predicate is
  2445.                     not nil
  2446.  
  2447.      (and <expr>...)               THE LOGICAL AND OF A LIST OF EXPRESSIONS
  2448.           f_s_u_b_r_
  2449.           <expr>    the expressions to be ANDed
  2450.           returns   nil if  any expression evaluates to  nil, otherwise the
  2451.                     value of the last expression (evaluation of expressions
  2452.                     stops after the first expression that evaluates to nil)
  2453.  
  2454.      (or <expr>...)                 THE LOGICAL OR OF A LIST OF EXPRESSIONS
  2455.           f_s_u_b_r_
  2456.           <expr>    the expressions to be ORed
  2457.           returns   nil if  all expressions evaluate to  nil, otherwise the
  2458.                     value  of the first  non-nil expression  (evaluation of
  2459.                     expressions stops after the  first expression that does
  2460.                     not evaluate to nil)
  2461.  
  2462.      (if <texpr> <expr1> [<expr2>])      EVALUATE EXPRESSIONS CONDITIONALLY
  2463.           f_s_u_b_r_
  2464.           <texpr>   the test expression
  2465.           <expr1>   the expression to be evaluated if texpr is non-nil
  2466.           <expr2>   the expression to be evaluated if texpr is nil
  2467.           returns   the value of the selected expression
  2468.  
  2469.      (when <texpr> <expr>...)        EVALUATE ONLY WHEN A CONDITION IS TRUE
  2470.           f_s_u_b_r_
  2471.           <texpr>   the test expression
  2472.           <expr>    the expression(s) to be evaluted if texpr is non-nil
  2473.           returns   the value of the last expression or nil
  2474.  
  2475.      (unless <texpr> <expr>...)     EVALUATE ONLY WHEN A CONDITION IS FALSE
  2476.           f_s_u_b_r_
  2477.           <texpr>   the test expression
  2478.           <expr>    the expression(s) to be evaluated if texpr is nil
  2479.           returns   the value of the last expression or nil
  2480.  
  2481.  
  2482.  
  2483.  
  2484.  
  2485.  
  2486.  
  2487.      XLISP 2.0                 CONTROL CONSTRUCTS                   Page 53
  2488.  
  2489.  
  2490.      (case <expr> <case>...[(t <expr>)])                     SELECT BY CASE
  2491.           f_s_u_b_r_
  2492.           <expr>    the selection expression
  2493.           <case>    pair consisting of:
  2494.                     (<value> <expr>...)
  2495.                     where:
  2496.                     <value>   is  a   single  expression   or  a   list  of
  2497.                               expressions (unevaluated)
  2498.                     <expr>    are  expressions  to  execute  if   the  case
  2499.                               matches
  2500.           (t <expr>)          default case (no previous matching)
  2501.           returns   the value of the last expression of the matching case
  2502.  
  2503.      (let (<binding>...) <expr>...)                   CREATE LOCAL BINDINGS
  2504.      (let* (<binding>...) <expr>...)            LET WITH SEQUENTIAL BINDING
  2505.           f_s_u_b_r_
  2506.           <binding> the variable bindings each of which is either:
  2507.                     1)        a symbol (which is initialized to nil)
  2508.                     2)        a list whose car  is a symbol and  whose cadr
  2509.                               is an initialization expression
  2510.           <expr>    the expressions to be evaluated
  2511.           returns   the value of the last expression
  2512.  
  2513.      (flet (<binding>...) <expr>...)                 CREATE LOCAL FUNCTIONS
  2514.      (labels (<binding>...) <expr>...)        FLET WITH RECURSIVE FUNCTIONS
  2515.      (macrolet (<binding>...) <expr>...)                CREATE LOCAL MACROS
  2516.           f_s_u_b_r_
  2517.           <binding> the function bindings each of which is:
  2518.                     (<sym> <fargs> <expr>...)
  2519.                     where:
  2520.                     <sym>     the function/macro name
  2521.                     <fargs>   formal argument list (lambda list)
  2522.                     <expr>    expressions  constituting  the  body  of  the
  2523.                               function/macro
  2524.           <expr>    the expressions to be evaluated
  2525.           returns   the value of the last expression
  2526.  
  2527.      (catch <sym> <expr>...)          EVALUATE EXPRESSIONS AND CATCH THROWS
  2528.           f_s_u_b_r_
  2529.           <sym>     the catch tag
  2530.           <expr>    expressions to evaluate
  2531.           returns   the value of the last expression the throw expression
  2532.  
  2533.      (throw <sym> [<expr>])                                THROW TO A CATCH
  2534.           f_s_u_b_r_
  2535.           <sym>     the catch tag
  2536.           <expr>    the value for the catch to return (defaults to nil)
  2537.           returns   never returns
  2538.  
  2539.  
  2540.  
  2541.  
  2542.  
  2543.  
  2544.  
  2545.      XLISP 2.0                 CONTROL CONSTRUCTS                   Page 54
  2546.  
  2547.  
  2548.      (unwind-protect <expr> <cexpr>...)  PROTECT EVALUATION OF AN EXPRESSION
  2549.           f_s_u_b_r_
  2550.           <expr>    the expression to protect
  2551.           <cexpr>   the cleanup expressions
  2552.           returns   the value of the expression
  2553.           Note:     unwind-protect  guarantees  to   execute  the   cleanup
  2554.           expressions even if a non-local exit terminates the evaluation of
  2555.           the protected expression
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.      XLISP 2.0                 LOOPING CONSTRUCTS                   Page 55
  2564.  
  2565.  
  2566.  
  2567.      LOOPING CONSTRUCTS
  2568.  
  2569.      (loop <expr>...)                                    BASIC LOOPING FORM
  2570.           f_s_u_b_r_
  2571.           <expr>    the body of the loop
  2572.           returns   never returns (must use non-local exit)
  2573.  
  2574.      (do (<binding>...) (<texpr> <rexpr>...) <expr>...)GENERAL LOOPING FORM
  2575.      (do* (<binding>...) (<texpr> <rexpr>...) <expr>...)
  2576.           f_s_u_b_r_._ d_o_ b_i_n_d_s_ s_i_m_u_l_t_a_n_e_o_u_s_l_y_,_ d_o_*_ b_i_n_d_s_ s_e_q_u_e_n_t_i_a_l_l_y_
  2577.           <binding> the variable bindings each of which is either:
  2578.                     1)        a symbol (which is initialized to nil)
  2579.                     2)        a list of the form: (<sym> <init> [<step>])
  2580.                     where:
  2581.                               <sym>     is the symbol to bind
  2582.                               <init>    the initial value of the symbol
  2583.                               <step>    a step expression
  2584.           <texpr>   the termination test expression
  2585.           <rexpr>   result expressions (the default is nil)
  2586.           <expr>    the body of the loop (treated like an implicit prog)
  2587.           returns   the value of the last result expression
  2588.  
  2589.      (dolist (<sym> <expr> [<rexpr>]) <expr>...)        LOOP THROUGH A LIST
  2590.           f_s_u_b_r_
  2591.           <sym>     the symbol to bind to each list element
  2592.           <expr>    the list expression
  2593.           <rexpr>   the result expression (the default is nil)
  2594.           <expr>    the body of the loop (treated like an implicit prog)
  2595.  
  2596.      (dotimes (<sym> <expr> [<rexpr>]) <expr>...)     LOOP FROM ZERO TO N-1
  2597.           f_s_u_b_r_
  2598.           <sym>     the symbol to bind to each value from 0 to n-1
  2599.           <expr>    the number of times to loop
  2600.           <rexpr>   the result expression (the default is nil)
  2601.           <expr>    the body of the loop (treated like an implicit prog)
  2602.  
  2603.  
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609.      XLISP 2.0                 THE PROGRAM FEATURE                  Page 56
  2610.  
  2611.  
  2612.  
  2613.      THE PROGRAM FEATURE
  2614.  
  2615.      (prog (<binding>...) <expr>...)                    THE PROGRAM FEATURE
  2616.      (prog* (<binding>...) <expr>...)          PROG WITH SEQUENTIAL BINDING
  2617.           f_s_u_b_r_
  2618.           <binding> the variable bindings each of which is either:
  2619.                     1)        a symbol (which is initialized to nil)
  2620.                     2)        a list whose  car is a symbol  and whose cadr
  2621.                               is an initialization expression
  2622.           <expr>    expressions to evaluate or tags (symbols)
  2623.           returns   nil or the argument passed to the return function
  2624.  
  2625.      (block <name> <expr>...)                                   NAMED BLOCK
  2626.           f_s_u_b_r_
  2627.           <name>    the block name (quoted symbol)
  2628.           <expr>    the block body
  2629.           returns   the value of the last expression
  2630.  
  2631.      (return [<expr>])             CAUSE A PROG CONSTRUCT TO RETURN A VALUE
  2632.           f_s_u_b_r_
  2633.           <expr>    the value (defaults to nil)
  2634.           returns   never returns
  2635.  
  2636.      (return-from <name> [<value>])   RETURN FROM A NAMED BLOCK O_R_ F_U_N_C_T_I_O_N_
  2637.           f_s_u_b_r_
  2638.           <name>    the block o_r_ f_u_n_c_t_i_o_n_ name (quoted symbol)
  2639.           <value>   the value to return (defaults to nil)
  2640.           returns   never returns
  2641.  
  2642.      (tagbody <expr>...)                                  BLOCK WITH LABELS
  2643.           f_s_u_b_r_
  2644.           <expr>    expression(s) to evaluate or tags (symbols)
  2645.           returns   nil
  2646.  
  2647.      (go <sym>)                        GO TO A TAG WITHIN A TAGBODY OR PROG
  2648.           f_s_u_b_r_
  2649.           <sym>     the tag (quoted)
  2650.           returns   never returns
  2651.  
  2652.      (progv <slist> <vlist> <expr>...)             DYNAMICALLY BIND SYMBOLS
  2653.           f_s_u_b_r_
  2654.           <slist>   list of symbols (evaluated)
  2655.           <vlist>   list of values to bind to the symbols (evaluated)
  2656.           <expr>    expression(s) to evaluate
  2657.           returns   the value of the last expression
  2658.  
  2659.  
  2660.  
  2661.  
  2662.  
  2663.  
  2664.  
  2665.      XLISP 2.0                 THE PROGRAM FEATURE                  Page 57
  2666.  
  2667.  
  2668.      (prog1 <expr1> <expr>...)             EXECUTE EXPRESSIONS SEQUENTIALLY
  2669.           f_s_u_b_r_
  2670.           <expr1>   the first expression to evaluate
  2671.           <expr>    the remaining expressions to evaluate
  2672.           returns   the value of the first expression
  2673.  
  2674.      (prog2 <expr1> <expr2> <expr>...)     EXECUTE EXPRESSIONS SEQUENTIALLY
  2675.           f_s_u_b_r_
  2676.           <expr1>   the first expression to evaluate
  2677.           <expr2>   the second expression to evaluate
  2678.           <expr>    the remaining expressions to evaluate
  2679.           returns   the value of the second expression
  2680.  
  2681.      (progn <expr>...)                     EXECUTE EXPRESSIONS SEQUENTIALLY
  2682.           f_s_u_b_r_
  2683.           <expr>    the expressions to evaluate
  2684.           returns   the value of the last expression (or nil)
  2685.  
  2686.  
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.      XLISP 2.0               INPUT/OUTPUT FUNCTIONS                 Page 58
  2693.  
  2694.  
  2695.  
  2696.      INPUT/OUTPUT FUNCTIONS
  2697.  
  2698.      N_o_t_e_  t_h_a_t_ w_h_e_n_ p_r_i_n_t_i_n_g_ o_b_j_e_c_t_s_,_  p_r_i_n_t_i_n_g_ i_s_ a_c_c_o_m_p_l_i_s_h_e_d_ b_y_ s_e_n_d_i_n_g_
  2699.      t_h_e_  m_e_s_s_a_g_e_ :_p_r_i_n_1_  t_o_ t_h_e_  o_b_j_e_c_t_  (_t_h_i_s_ i_s_  a_  m_o_d_i_f_i_c_a_t_i_o_n_ o_f_  t_h_e_
  2700.      d_i_s_t_r_i_b_u_t_i_o_n_)_._
  2701.  
  2702.      (read [<stream> [<eof> [<rflag>]]])                 READ AN EXPRESSION
  2703.           <stream>  the input stream (default is *standard-input*)
  2704.           <eof>     the value to return on end of file (default is nil)
  2705.           <rflag>   recursive  read flag  (default is  nil, u_n_u_s_e_d_  i_n_ t_h_i_s_
  2706.                     i_m_p_l_e_m_e_n_t_a_t_i_o_n_)
  2707.           returns   the expression read
  2708.  
  2709.      (_s_e_t_-_m_a_c_r_o_-_c_h_a_r_a_c_t_e_r_ <_c_h_>_ <_f_c_n_>_ [_ T_ ]_)_               M_O_D_I_F_Y_ R_E_A_D_ T_A_B_L_E_
  2710.           d_e_f_i_n_e_d_ i_n_ i_n_i_t_._l_s_p_
  2711.           <_c_h_>_      c_h_a_r_a_c_t_e_r_ t_o_ d_e_f_i_n_e_
  2712.           <_f_c_n_>_     f_u_n_c_t_i_o_n_ t_o_ b_i_n_d_ t_o_ c_h_a_r_a_c_t_e_r_ (_s_e_e_ p_a_g_e_ 1_2_)_
  2713.           T_         i_f_ T_M_A_C_R_O_ r_a_t_h_e_r_ t_h_a_n_ N_M_A_C_R_O_
  2714.  
  2715.      (_g_e_t_-_m_a_c_r_o_-_c_h_a_r_a_c_t_e_r_ <_c_h_>_)_                          E_X_A_M_I_N_E_ R_E_A_D_ T_A_B_L_E_
  2716.           d_e_f_i_n_e_d_ i_n_ i_n_i_t_._l_s_p_
  2717.           <_c_h_>_      c_h_a_r_a_c_t_e_r_
  2718.           r_e_t_u_r_n_s_   f_u_n_c_t_i_o_n_ b_o_u_n_d_ t_o_ c_h_a_r_a_c_t_e_r_
  2719.  
  2720.      (print <expr> [<stream>])            PRINT AN EXPRESSION ON A NEW LINE
  2721.           <expr>    the expression to be printed
  2722.           <stream>  the output stream (default is *standard-output*)
  2723.           returns   the expression
  2724.  
  2725.      (prin1 <expr> [<stream>])                          PRINT AN EXPRESSION
  2726.           s_y_m_b_o_l_s_,_ c_o_n_s_ c_e_l_l_s_ (_w_i_t_h_o_u_t_ c_i_r_c_u_l_a_r_i_t_i_e_s_)_,_ a_r_r_a_y_s_,_ s_t_r_i_n_g_s_,_ a_n_d_
  2727.           c_h_a_r_a_c_t_e_r_s_  a_r_e_  p_r_i_n_t_e_d_  i_n_  a_  f_o_r_m_a_t_  a_c_c_e_p_t_a_b_l_e_ t_o_  t_h_e_  r_e_a_d_
  2728.           f_u_n_c_t_i_o_n_._
  2729.           <expr>    the expression to be printed
  2730.           <stream>  the output stream (default is *standard-output*)
  2731.           returns   the expression
  2732.  
  2733.      (princ <expr> [<stream>])          PRINT AN EXPRESSION WITHOUT QUOTING
  2734.           <expr>    the expressions to be printed
  2735.           <stream>  the output stream (default is *standard-output*)
  2736.           returns   the expression
  2737.  
  2738.      (pprint <expr> [<stream>])                  PRETTY PRINT AN EXPRESSION
  2739.           <expr>    the expressions to be printed
  2740.           <stream>  the output stream (default is *standard-output*)
  2741.           returns   the expression
  2742.  
  2743.      (terpri [<stream>])                   TERMINATE THE CURRENT PRINT LINE
  2744.           <stream>  the output stream (default is *standard-output*)
  2745.           returns   nil
  2746.  
  2747.  
  2748.  
  2749.  
  2750.  
  2751.  
  2752.  
  2753.      XLISP 2.0               INPUT/OUTPUT FUNCTIONS                 Page 59
  2754.  
  2755.  
  2756.      (flatsize <expr>)         LENGTH OF PRINTED REPRESENTATION USING PRIN1
  2757.           <expr>    the expression
  2758.           returns   the length
  2759.  
  2760.      (flatc <expr>)            LENGTH OF PRINTED REPRESENTATION USING PRINC
  2761.           <expr>    the expression
  2762.           returns   the length
  2763.  
  2764.  
  2765.  
  2766.  
  2767.  
  2768.  
  2769.  
  2770.      XLISP 2.0                 THE FORMAT FUNCTION                  Page 60
  2771.  
  2772.  
  2773.  
  2774.      THE FORMAT FUNCTION
  2775.  
  2776.      (format <stream> <fmt> <arg>...)                   DO FORMATTED OUTPUT
  2777.           <stream>  the output stream
  2778.           <fmt>     the format string
  2779.           <arg>     the format arguments
  2780.           returns   output string if <stream> is nil, nil otherwise
  2781.  
  2782.      I_f_ <_s_t_r_e_a_m_>_ i_s_ T_,_ t_h_e_n_ *_S_T_A_N_D_A_R_D_-_O_U_T_P_U_T_*_ i_s_ a_s_s_u_m_e_d_._
  2783.  
  2784.      The format  string  can  contain  characters  that  should  be  copied
  2785.      directly  to  the output  and  formatting  directives. The  formatting
  2786.      directives are:
  2787.  
  2788.           ~A o_r_ ~_a_  print next argument using princ
  2789.           ~S o_r_ ~_s_  print next argument using prin1
  2790.           ~%        start a new line
  2791.           ~~        print a tilde character
  2792.           ~_\_n_       i_g_n_o_r_e_ r_e_t_u_r_n_ a_n_d_ f_o_l_l_o_w_i_n_g_ w_h_i_t_e_s_p_a_c_e_
  2793.  
  2794.      I_f_  X_L_I_S_P_  i_s_   c_o_m_p_i_l_e_d_  w_i_t_h_  E_N_H_F_O_R_M_A_T_  d_e_f_i_n_e_d_,_  t_h_e_n_  t_h_e_  f_o_r_m_a_t_
  2795.      d_i_r_e_c_t_i_v_e_s_ c_a_n_ c_o_n_t_a_i_n_ o_p_t_i_o_n_a_l_  p_r_e_f_i_x_ a_n_d_ o_p_t_i_o_n_a_l_ c_o_l_o_n_ (_:_)_  o_r_ a_t_-_
  2796.      s_i_g_n_ (_@_)_ m_o_d_i_f_i_e_r_s_ b_e_t_w_e_e_n_ t_h_e_  t_i_l_d_e_ a_n_d_ d_i_r_e_c_t_i_v_e_ c_h_a_r_a_c_t_e_r_._  P_r_e_f_i_x_
  2797.      c_h_a_r_a_c_t_e_r_s_ a_r_e_ u_n_s_i_g_n_e_d_ i_n_t_e_g_e_r_s_,_ o_r_ t_h_e_ c_h_a_r_a_c_t_e_r_ '_v_'_ t_o_ i_n_d_i_c_a_t_e_ t_h_e_
  2798.      n_u_m_b_e_r_ i_s_ t_a_k_e_n_ f_r_o_m_ t_h_e_ n_e_x_t_ a_r_g_u_m_e_n_t_,_ o_r_ a_ s_i_n_g_l_e_ q_u_o_t_e_ (_'_)_ f_o_l_l_o_w_e_d_
  2799.      b_y_ a_  s_i_n_g_l_e_ c_h_a_r_a_c_t_e_r_  f_o_r_ t_h_o_s_e_ p_a_r_a_m_e_t_e_r_s_  t_h_a_t_ s_h_o_u_l_d_ b_e_  a_ s_i_n_g_l_e_
  2800.      c_h_a_r_a_c_t_e_r_._
  2801.  
  2802.      F_o_r_ ~_A_ a_n_d_ ~_S_ t_h_e_ f_u_l_l_ f_o_r_m_ i_s_:_
  2803.  
  2804.           ~_m_i_n_c_o_l_,_c_o_l_i_n_c_,_m_i_n_p_a_d_,_p_a_d_c_h_a_r_:_@_A_        (_o_r_ S_)_
  2805.  
  2806.      T_h_e_ s_t_r_i_n_g_  i_s_ p_a_d_d_e_d_ o_n_  t_h_e_ r_i_g_h_t_ (_o_r_ l_e_f_t_,_  i_s_ @_ i_s_  g_i_v_e_n_)_ w_i_t_h_ a_t_
  2807.      l_e_a_s_t_ "_m_i_n_p_a_d_"_  c_o_p_i_e_s_ o_f_ t_h_e_  "_p_a_d_c_h_a_r_"_._ P_a_d_d_i_n_g_ c_h_a_r_a_c_t_e_r_s_  a_r_e_ t_h_e_n_
  2808.      i_n_s_e_r_t_e_d_ "_c_o_l_i_n_c_"_ c_h_a_r_a_c_t_e_r_s_  a_t_ a_ t_i_m_e_  u_n_t_i_l_ t_h_e_ t_o_t_a_l_  w_i_d_t_h_ i_s_  a_t_
  2809.      l_e_a_s_t_  "_m_i_n_c_o_l_"_._ T_h_e_  d_e_f_a_u_l_t_s_  a_r_e_ 0_  f_o_r_  m_i_n_c_o_l_ a_n_d_  m_i_n_p_a_d_,_  1_ f_o_r_
  2810.      c_o_l_i_n_c_,_ a_n_d_ s_p_a_c_e_ f_o_r_ p_a_d_c_h_a_r_._ F_o_r_ e_x_a_m_p_l_e_:_
  2811.  
  2812.           ~_1_5_,_,_2_,_'_._@_A_
  2813.  
  2814.      T_h_e_  o_u_t_p_u_t_ i_s_ p_a_d_d_e_d_ o_n_  t_h_e_ l_e_f_t_ w_i_t_h_  a_t_ l_e_a_s_t_ 2_  p_e_r_i_o_d_s_ u_n_t_i_l_ t_h_e_
  2815.      o_u_t_p_u_t_ i_s_ a_t_ l_e_a_s_t_ 1_5_ c_h_a_r_a_c_t_e_r_s_ w_i_d_e_._
  2816.  
  2817.      F_o_r_ ~_%_  a_n_d_ ~_~_,_ t_h_e_ f_u_l_l_  f_o_r_m_ i_s_ ~_n_%_ o_r_  ~_n_~_,_ w_h_e_r_e_ n_  i_s_ a_n_ u_n_s_i_g_n_e_d_
  2818.      i_n_t_e_g_e_r_._ "_n_"_ c_o_p_i_e_s_ (_d_e_f_a_u_l_t_=_1_)_ o_f_ t_h_e_ c_h_a_r_a_c_t_e_r_ a_r_e_ o_u_t_p_u_t_._
  2819.  
  2820.      F_o_r_ ~_\_n_,_ i_f_ t_h_e_ c_o_l_o_n_  m_o_d_i_f_i_e_r_ i_s_ u_s_e_d_,_ t_h_e_n_ t_h_e_ f_o_r_m_a_t_  d_i_r_e_c_t_i_v_e_ i_s_
  2821.      i_g_n_o_r_e_d_  (_a_l_l_o_w_i_n_g_  e_m_b_e_d_d_e_d_  r_e_t_u_r_n_s_   i_n_  t_h_e_  s_o_u_r_c_e_  f_o_r_  e_n_h_a_n_c_e_d_
  2822.      r_e_a_d_a_b_i_l_i_t_y_)_._  I_f_ t_h_e_ a_t_-_s_i_g_n_ m_o_d_i_f_i_e_r_ i_s_ u_s_e_d_,_ t_h_e_n_ a_ c_a_r_r_i_a_g_e_ r_e_t_u_r_n_
  2823.      i_s_ e_m_i_t_t_e_d_,_ a_n_d_ f_o_l_l_o_w_i_n_g_ w_h_i_t_e_s_p_a_c_e_ i_s_ i_g_n_o_r_e_d_._ 
  2824.  
  2825.  
  2826.  
  2827.  
  2828.  
  2829.  
  2830.  
  2831.      XLISP 2.0                 FILE I/O FUNCTIONS                   Page 61
  2832.  
  2833.  
  2834.  
  2835.      FILE I/O FUNCTIONS
  2836.  
  2837.      N_o_t_e_ t_h_a_t_ i_n_i_t_i_a_l_l_y_,_ w_h_e_n_ s_t_a_r_t_i_n_g_ x_l_i_s_p_,_ t_h_e_r_e_ a_r_e_ f_i_v_e_ s_y_s_t_e_m_ s_t_r_e_a_m_
  2838.      s_y_m_b_o_l_s_ w_h_i_c_h_  a_r_e_ a_s_s_o_c_i_a_t_e_d_ w_i_t_h_ t_h_r_e_e_  s_t_r_e_a_m_s_._ *_S_T_A_N_D_A_R_D_-_I_N_P_U_T_*_ i_s_
  2839.      b_o_u_n_d_  t_o_ s_t_a_n_d_a_r_d_ i_n_p_u_t_  a_n_d_ *_S_T_A_N_D_A_R_D_-_O_U_T_P_U_T_*_  i_s_ b_o_u_n_d_  t_o_ s_t_a_n_d_a_r_d_
  2840.      o_u_t_p_u_t_._  *_E_R_R_O_R_-_O_U_T_P_U_T_*_ (_e_r_r_o_r_  m_e_s_s_a_g_e_ o_u_t_p_u_t_)_,_  *_T_R_A_C_E_-_O_U_T_P_U_T_*_ (_f_r_o_m_
  2841.      T_R_A_C_E_  f_u_n_c_t_i_o_n_)_,_ a_n_d_  *_D_E_B_U_G_-_I_O_*_ (_b_r_e_a_k_  l_o_o_p_ i_/_o_)_  a_r_e_ a_l_l_  b_o_u_n_d_ t_o_
  2842.      s_t_a_n_d_a_r_d_ e_r_r_o_r_,_ w_h_i_c_h_ i_s_ j_u_s_t_ a_b_o_u_t_ a_l_w_a_y_s_ t_h_e_ c_o_n_s_o_l_e_._
  2843.  
  2844.      W_h_e_n_ t_h_e_  t_r_a_n_s_c_r_i_p_t_ i_s_ a_c_t_i_v_e_ (_e_i_t_h_e_r_  -_t_ o_n_ t_h_e_ c_o_m_m_a_n_d_  l_i_n_e_ o_r_ t_h_e_
  2845.      D_R_I_B_B_L_E_  f_u_n_c_t_i_o_n_)_,_ a_l_l_ c_h_a_r_a_c_t_e_r_s_ t_h_a_t_  w_o_u_l_d_ b_e_ s_e_n_t_  t_o_ t_h_e_ d_i_s_p_l_a_y_
  2846.      v_i_a_  e_i_t_h_e_r_ s_t_a_n_d_a_r_d_ o_u_t_p_u_t_  o_r_ s_t_a_n_d_a_r_d_ e_r_r_o_r_ a_r_e_  a_l_s_o_ p_l_a_c_e_d_ i_n_ t_h_e_
  2847.      t_r_a_n_s_c_r_i_p_t_ f_i_l_e_._
  2848.  
  2849.      X_L_I_S_P_   g_i_v_e_s_   s_p_e_c_i_a_l_    t_r_e_a_t_m_e_n_t_   t_o_    i_/_o_   t_h_r_o_u_g_h_    s_t_a_n_d_a_r_d_
  2850.      i_n_p_u_t_/_o_u_t_p_u_t_/_e_r_r_o_r_,_  a_s_ s_h_o_w_n_ o_n_ p_a_g_e_ 3_._ A_n_ X_L_I_S_P_ p_r_o_g_r_a_m_ w_h_i_c_h_ a_l_t_e_r_s_
  2851.      a_n_y_ o_f_ t_h_e_  s_y_s_t_e_m_ s_t_r_e_a_m_ v_a_l_u_e_s_  s_h_o_u_l_d_ s_a_v_e_  t_h_e_ o_r_i_g_i_n_a_l_ v_a_l_u_e_s_  t_o_
  2852.      r_e_s_t_o_r_e_ t_h_e_m_._ U_s_i_n_g_ t_h_e_ O_P_E_N_ f_u_n_c_t_i_o_n_ t_o_ r_e_-_o_p_e_n_ t_h_e_  c_o_n_s_o_l_e_ w_i_l_l_ n_o_t_
  2853.      r_e_s_t_o_r_e_ i_/_o_ t_h_r_o_u_g_h_ s_t_a_n_d_a_r_d_ i_n_p_u_t_/_o_u_t_p_u_t_/_e_r_r_o_r_._
  2854.  
  2855.      (open <fname> &key :direction :_e_l_e_m_e_n_t_-_t_y_p_e_)        OPEN A FILE STREAM
  2856.           <fname>   the file name string or symbol
  2857.           :direction          :input, :output, or :_i_o_ (default  is :input).
  2858.                               A file opened for input must already exist. A
  2859.                               file  opened  for   output  will  delete  any
  2860.                               existing file by the same name. A file opened
  2861.                               for input or io is positioned at its start.
  2862.           :_e_l_e_m_e_n_t_-_t_y_p_e_       F_I_X_N_U_M_ o_r_ C_H_A_R_A_C_T_E_R_  (_d_e_f_a_u_l_t_ i_s_  C_H_A_R_A_C_T_E_R_)_,_
  2863.                               a_s_ r_e_t_u_r_n_e_d_ b_y_ t_y_p_e_-_o_f_ f_u_n_c_t_i_o_n_._ F_i_l_e_s_ o_p_e_n_e_d_
  2864.                               w_i_t_h_ t_y_p_e_  F_I_X_N_U_M_ a_r_e_ b_i_n_a_r_y_ f_i_l_e_s_ i_n_s_t_e_a_d_ o_f_
  2865.                               a_s_c_i_i_,_  w_h_i_c_h_   m_e_a_n_s_  n_o_  c_r_l_f_   t_o_/_f_r_o_m_  l_f_
  2866.                               c_o_n_v_e_r_s_i_o_n_  t_a_k_e_s_  p_l_a_c_e_,_ a_n_d_  c_o_n_t_r_o_l_-_Z_ w_i_l_l_
  2867.                               n_o_t_ t_e_r_m_i_n_a_t_e_ a_n_ i_n_p_u_t_ f_i_l_e_._ I_t_ i_s_ t_h_e_ i_n_t_e_n_t_
  2868.                               o_f_  C_o_m_m_o_n_ L_i_s_p_  t_h_a_t_  b_i_n_a_r_y_  f_i_l_e_s_ o_n_l_y_  b_e_
  2869.                               a_c_c_e_s_s_e_d_ w_i_t_h_ r_e_a_d_-_b_y_t_e_ a_n_d_  w_r_i_t_e_-_b_y_t_e_ w_h_i_l_e_
  2870.                               a_s_c_i_i_ f_i_l_e_s_ b_e_ a_c_c_e_s_s_e_d_ w_i_t_h_ a_n_y_ f_u_n_c_t_i_o_n_ b_u_t_
  2871.                               r_e_a_d_-_b_y_t_e_  a_n_d_  w_r_i_t_e_-_b_y_t_e_._  X_L_I_S_P_  d_o_e_s_  n_o_t_
  2872.                               e_n_f_o_r_c_e_ t_h_a_t_ d_i_s_t_i_n_c_t_i_o_n_._
  2873.           returns   a file stream
  2874.  
  2875.      (close <stream>)                                   CLOSE A FILE STREAM
  2876.           <stream>  the file stream
  2877.           returns   nil
  2878.  
  2879.      (_f_i_l_e_-_l_e_n_g_t_h_ <_s_t_r_e_a_m_>_)_                              G_E_T_ L_E_N_G_T_H_ O_F_ F_I_L_E_
  2880.           F_o_r_ a_n_ a_s_c_i_i_  f_i_l_e_,_ t_h_e_ l_e_n_g_t_h_  r_e_p_o_r_t_e_d_ m_a_y_ b_e_  l_a_r_g_e_r_ t_h_a_n_  t_h_e_
  2881.           n_u_m_b_e_r_ o_f_ c_h_a_r_a_c_t_e_r_s_ r_e_a_d_ o_r_ w_r_i_t_t_e_n_ b_e_c_a_u_s_e_ o_f_ C_R_ c_o_n_v_e_r_s_i_o_n_._
  2882.           <_s_t_r_e_a_m_>_  t_h_e_ f_i_l_e_ s_t_r_e_a_m_ (_s_h_o_u_l_d_ b_e_ d_i_s_k_ f_i_l_e_)_
  2883.           r_e_t_u_r_n_s_   l_e_n_g_t_h_ o_f_ f_i_l_e_,_ o_r_ N_I_L_ i_f_ c_a_n_n_o_t_ b_e_ d_e_t_u_r_m_i_n_e_d_._
  2884.  
  2885.  
  2886.  
  2887.  
  2888.  
  2889.  
  2890.  
  2891.      XLISP 2.0                 FILE I/O FUNCTIONS                   Page 62
  2892.  
  2893.  
  2894.      (_f_i_l_e_-_p_o_s_i_t_i_o_n_ <_s_t_r_e_a_m_>_ [_<_e_x_p_r_>_]_)_             G_E_T_ O_R_ S_E_T_ F_I_L_E_ P_O_S_I_T_I_O_N_
  2895.           F_o_r_  a_n_ a_s_c_i_i_ f_i_l_e_,_ t_h_e_ f_i_l_e_ p_o_s_i_t_i_o_n_ m_a_y_  n_o_t_ b_e_ t_h_e_ s_a_m_e_ a_s_ t_h_e_
  2896.           n_u_m_b_e_r_ o_f_ c_h_a_r_a_c_t_e_r_s_ r_e_a_d_ o_r_ w_r_i_t_t_e_n_ b_e_c_a_u_s_e_ o_f_ C_R_ c_o_n_v_e_r_s_i_o_n_._ I_t_
  2897.           w_i_l_l_ b_e_ t_r_u_e_ h_o_w_e_v_e_r_,_ t_h_a_t_ u_s_i_n_g_ f_i_l_e_-_p_o_s_i_t_i_o_n_ t_o_ p_o_s_i_t_i_o_n_ a_ f_i_l_e_
  2898.           a_t_ a_ l_o_c_a_t_i_o_n_ e_a_r_l_i_e_r_ r_e_p_o_r_t_e_d_ b_y_ f_i_l_e_-_p_o_s_i_t_i_o_n_._
  2899.           <_s_t_r_e_a_m_>_  t_h_e_ f_i_l_e_ s_t_r_e_a_m_ (_s_h_o_u_l_d_ b_e_ a_ d_i_s_k_ f_i_l_e_)_
  2900.           <_e_x_p_r_>_    d_e_s_i_r_e_d_ f_i_l_e_ p_o_s_i_t_i_o_n_,_ i_f_ s_e_t_t_i_n_g_ p_o_s_i_t_i_o_n_
  2901.           r_e_t_u_r_n_s_   i_f_ s_e_t_t_i_n_g_ p_o_s_i_t_i_o_n_,_ a_n_d_ s_u_c_c_e_s_s_f_u_l_,_ t_h_e_n_ T_;_ i_f_ g_e_t_t_i_n_g_
  2902.                     p_o_s_i_t_i_o_n_  a_n_d_ s_u_c_c_e_s_s_f_u_l_  t_h_e_n_ t_h_e_  p_o_s_i_t_i_o_n_;_ o_t_h_e_r_w_i_s_e_
  2903.                     N_I_L_
  2904.  
  2905.      (read-char [<stream>])                  READ A CHARACTER FROM A STREAM
  2906.           <stream>  the input stream (default is *standard-input*)
  2907.           returns   the character
  2908.  
  2909.      (peek-char [<flag> [<stream>]])             PEEK AT THE NEXT CHARACTER
  2910.           <flag>    flag for skipping white space (default is nil)
  2911.           <stream>  the input stream (default is *standard-input*)
  2912.           returns   the character (integer)
  2913.  
  2914.      (write-char <ch> [<stream>])             WRITE A CHARACTER TO A STREAM
  2915.           <ch>      the character to write
  2916.           <stream>  the output stream (default is *standard-output*)
  2917.           returns   the character
  2918.  
  2919.      (read-line [<stream>])                       READ A LINE FROM A STREAM
  2920.           <stream>  the input stream (default is *standard-input*)
  2921.           returns   the string
  2922.  
  2923.      (read-byte [<stream>])                       READ A BYTE FROM A STREAM
  2924.           <stream>  the input stream (default is *standard-input*)
  2925.           returns   the byte (integer)
  2926.  
  2927.      (write-byte <byte> [<stream>])                WRITE A BYTE TO A STREAM
  2928.           <byte>    the byte to write (integer)
  2929.           <stream>  the output stream (default is *standard-output*)
  2930.           returns   the byte (integer)
  2931.  
  2932.  
  2933.  
  2934.  
  2935.  
  2936.  
  2937.  
  2938.      XLISP 2.0               STRING STREAM FUNCTIONS                Page 63
  2939.  
  2940.  
  2941.  
  2942.      STRING STREAM FUNCTIONS
  2943.  
  2944.      These  functions operate on unnamed  streams. An unnamed output stream
  2945.      collects characters sent  to it when it is used  as the destination of
  2946.      any output function. The functions 'get-output-stream' string and list
  2947.      return a sting or list of the characters.
  2948.  
  2949.      An unnamed  input stream is setup  with the 'make-string-input-stream'
  2950.      function  and returns each character of the  string when it is used as
  2951.      the source of any input function.
  2952.  
  2953.      N_o_t_e_  t_h_a_t_ t_h_e_r_e_  i_s_ n_o_  d_i_f_f_e_r_e_n_c_e_ b_e_t_w_e_e_n_  u_n_n_a_m_e_d_ i_n_p_u_t_  a_n_d_ o_u_t_p_u_t_
  2954.      s_t_r_e_a_m_s_._  U_n_n_a_m_e_d_ i_n_p_u_t_ s_t_r_e_a_m_s_ m_a_y_ b_e_ w_r_i_t_t_e_n_ t_o_ b_y_ o_u_t_p_u_t_ f_u_n_c_t_i_o_n_s_,_
  2955.      i_n_  w_h_i_c_h_ c_a_s_e_  t_h_e_ c_h_a_r_a_c_t_e_r_s_  a_r_e_ a_p_p_e_n_d_e_d_  t_o_ t_h_e_  t_a_i_l_ e_n_d_  o_f_ t_h_e_
  2956.      s_t_r_e_a_m_._ U_n_n_a_m_e_d_ o_u_t_p_u_t_ s_t_r_e_a_m_s_ m_a_y_ a_l_s_o_ b_e_ (_d_e_s_t_r_u_c_t_i_v_e_l_y_)_ r_e_a_d_ b_y_ a_n_y_
  2957.      i_n_p_u_t_ f_u_n_c_t_i_o_n_ a_s_ w_e_l_l_ a_s_ t_h_e_ g_e_t_-_o_u_t_p_u_t_-_s_t_r_e_a_m_ f_u_n_c_t_i_o_n_s_._
  2958.  
  2959.      (make-string-input-stream <str> [<start> [<end>]])
  2960.           <str>     the string
  2961.           <start>   the starting offset
  2962.           <end>     the ending offset + 1 o_r_ N_I_L_ f_o_r_ e_n_d_ o_f_ s_t_r_i_n_g_
  2963.           returns   an unnamed stream that reads from the string
  2964.  
  2965.      (make-string-output-stream)
  2966.           returns   an unnamed output stream
  2967.  
  2968.      (get-output-stream-string <stream>)
  2969.           <stream>  the output stream
  2970.           returns   the output so far as a string
  2971.           Note:  the output stream is emptied by this function
  2972.  
  2973.      (get-output-stream-list <stream>)
  2974.           <stream>  the output stream
  2975.           returns   the output so far as a list
  2976.           Note:  the output stream is emptied by this function
  2977.  
  2978.  
  2979.  
  2980.  
  2981.  
  2982.  
  2983.  
  2984.      XLISP 2.0            DEBUGGING AND ERROR HANDLING              Page 64
  2985.  
  2986.  
  2987.  
  2988.      DEBUGGING AND ERROR HANDLING FUNCTIONS
  2989.  
  2990.      (trace [<sym>...])                    ADD A FUNCTION TO THE TRACE LIST
  2991.           f_s_u_b_r_
  2992.           <sym>     the function(s) to add (quoted)
  2993.           returns   the trace list
  2994.  
  2995.      (untrace [<sym>...])             REMOVE A FUNCTION FROM THE TRACE LIST
  2996.           f_s_u_b_r_._  I_f_ n_o_ f_u_n_c_t_i_o_n_s_ g_i_v_e_n_,_ a_l_l_ f_u_n_c_t_i_o_n_s_ a_r_e_ r_e_m_o_v_e_d_ f_r_o_m_ t_h_e_
  2997.           t_r_a_c_e_ l_i_s_t_._
  2998.           <sym>     the function(s) to remove (quoted)
  2999.           returns   the trace list
  3000.  
  3001.      (error <emsg> [<arg>])                  SIGNAL A NON-CORRECTABLE ERROR
  3002.           <emsg>    the error message string
  3003.           <arg>     the argument expression (printed after the message)
  3004.           returns   never returns
  3005.  
  3006.      (cerror <cmsg> <emsg> [<arg>])              SIGNAL A CORRECTABLE ERROR
  3007.           <cmsg>    the continue message string
  3008.           <emsg>    the error message string
  3009.           <arg>     the argument expression (printed after the message)
  3010.           returns   nil when continued from the break loop
  3011.  
  3012.      (break [<bmsg> [<arg>]])                            ENTER A BREAK LOOP
  3013.           <bmsg>    the break message string (defaults to "**BREAK**")
  3014.           <arg>     the argument expression (printed after the message)
  3015.           returns   nil when continued from the break loop
  3016.  
  3017.      (clean-up)                                     CLEAN-UP AFTER AN ERROR
  3018.           returns   never returns
  3019.  
  3020.      (top-level)        CLEAN-UP AFTER AN ERROR AND RETURN TO THE TOP LEVEL
  3021.           returns   never returns
  3022.  
  3023.      (continue)                           CONTINUE FROM A CORRECTABLE ERROR
  3024.           returns   never returns
  3025.  
  3026.      (errset <expr> [<pflag>])                                  TRAP ERRORS
  3027.           f_s_u_b_r_
  3028.           <expr>    the expression to execute
  3029.           <pflag>   flag to control printing of the error message
  3030.           returns   the value of the last expression consed with nil or nil
  3031.                     on error
  3032.  
  3033.      (baktrace [<n>])              PRINT N LEVELS OF TRACE BACK INFORMATION
  3034.           <n>       the number of levels (defaults to all levels)
  3035.           returns   nil
  3036.  
  3037.  
  3038.  
  3039.  
  3040.  
  3041.  
  3042.  
  3043.      XLISP 2.0            DEBUGGING AND ERROR HANDLING              Page 65
  3044.  
  3045.  
  3046.      (evalhook <expr> <ehook> <ahook> [<env>])          EVALUATE WITH HOOKS
  3047.           <expr>    the expression to evaluate. <_e_h_o_o_k_>_ i_s_ n_o_t_ u_s_e_d_  a_t_ t_h_e_
  3048.                     t_o_p_ l_e_v_e_l_._
  3049.           <ehook>   the value for *evalhook*
  3050.           <ahook>   the value for *applyhook*
  3051.           <env>     the  environment  (default is  nil).  T_h_e_  f_o_r_m_a_t_ i_s_  a_
  3052.                     d_o_t_t_e_d_ p_a_i_r_  o_f_ v_a_l_u_e_ (_c_a_r_)_ a_n_d_  f_u_n_c_t_i_o_n_ (_c_d_r_)_ b_i_n_d_i_n_g_
  3053.                     l_i_s_t_s_._  E_a_c_h_ b_i_n_d_i_n_g_ l_i_s_t_ i_s_ a_ l_i_s_t_ o_f_ l_e_v_e_l_ b_i_n_d_i_n_g_ a_-_
  3054.                     l_i_s_t_s_,_  w_i_t_h_  t_h_e_  i_n_n_e_r_m_o_s_t_  a_-_l_i_s_t_ f_i_r_s_t_._  T_h_e_  l_e_v_e_l_
  3055.                     b_i_n_d_i_n_g_  a_-_l_i_s_t_ a_s_s_o_c_i_a_t_e_s_  t_h_e_ b_o_u_n_d_  s_y_m_b_o_l_  w_i_t_h_ i_t_s_
  3056.                     v_a_l_u_e_._
  3057.           returns   the result of evaluating the expression
  3058.  
  3059.      (_a_p_p_l_y_h_o_o_k_ <_f_u_n_>_ <_a_r_g_l_i_s_t_>_ <_e_h_o_o_k_>_ <_a_h_o_o_k_>_)_           A_P_P_L_Y_ W_I_T_H_ H_O_O_K_S_
  3060.           <_f_u_n_>_     T_h_e_  f_u_n_c_t_i_o_n_ c_l_o_s_u_r_e_._  <_a_h_o_o_k_>_  i_s_ n_o_t_  u_s_e_d_ f_o_r_  t_h_i_s_
  3061.                     f_u_n_c_t_i_o_n_ a_p_p_l_i_c_a_t_i_o_n_._
  3062.           <_a_r_g_l_i_s_t_>_ T_h_e_ l_i_s_t_ o_f_ a_r_g_u_m_e_n_t_s_._
  3063.           <_e_h_o_o_k_>_   t_h_e_ v_a_l_u_e_ f_o_r_ *_e_v_a_l_h_o_o_k_*_
  3064.           <_a_h_o_o_k_>_   t_h_e_ v_a_l_u_e_ f_o_r_ *_a_p_p_l_y_h_o_o_k_*_
  3065.           r_e_t_u_r_n_s_   t_h_e_ r_e_s_u_l_t_ o_f_ a_p_p_l_y_i_n_g_ <_f_u_n_>_ t_o_ <_a_r_g_l_i_s_t_>_
  3066.  
  3067.      (_d_e_b_u_g_)_                                            E_N_A_B_L_E_ D_E_B_U_G_ B_R_E_A_K_S_
  3068.      (_n_o_d_e_b_u_g_)_                                         D_I_S_A_B_L_E_ D_E_B_U_G_ B_R_E_A_K_S_
  3069.           D_e_f_i_n_e_d_ i_n_ i_n_i_t_._l_s_p_
  3070.  
  3071.  
  3072.  
  3073.  
  3074.  
  3075.  
  3076.  
  3077.      XLISP 2.0                  SYSTEM FUNCTIONS                    Page 66
  3078.  
  3079.  
  3080.  
  3081.      SYSTEM FUNCTIONS
  3082.  
  3083.      (load <fname> &key :verbose :print)                 LOAD A SOURCE FILE
  3084.           <fname>   the filename string or symbol
  3085.           :verbose  the verbose flag (default is t)
  3086.           :print    the print flag (default is nil)
  3087.           returns   the filename
  3088.  
  3089.      (restore <fname>)                        RESTORE WORKSPACE FROM A FILE
  3090.           <fname>   the filename string or symbol
  3091.           returns   nil on failure, otherwise never returns
  3092.  
  3093.      (save <fname>)                                SAVE WORKSPACE TO A FILE
  3094.           <fname>   the filename string or symbol
  3095.           returns   t if workspace was written, nil otherwise
  3096.  
  3097.      (_s_a_v_e_f_u_n_ <_f_c_n_>_)_                                S_A_V_E_ F_U_N_C_T_I_O_N_ T_O_ A_ F_I_L_E_
  3098.           d_e_f_i_n_e_d_ i_n_ i_n_i_t_._l_s_p_
  3099.           <_f_c_n_>_     f_u_n_c_t_i_o_n_  n_a_m_e_ (_s_a_v_e_s_  i_t_  t_o_ f_i_l_e_  o_f_ s_a_m_e_  n_a_m_e_,_ w_i_t_h_
  3100.                     e_x_t_e_n_s_i_o_n_ "_._l_s_p_"_)_
  3101.           r_e_t_u_r_n_s_   t_ i_f_ s_u_c_c_e_s_s_f_u_l_
  3102.  
  3103.      (dribble [<fname>])       CREATE A FILE WITH A TRANSCRIPT OF A SESSION
  3104.           <fname>   file name string or symbol
  3105.                     (if missing, close current transcript)
  3106.           returns   t if the transcript is opened, nil if it is closed
  3107.  
  3108.      (gc)                                          FORCE GARBAGE COLLECTION
  3109.           returns   nil
  3110.  
  3111.      (expand [<num>])                      EXPAND MEMORY BY ADDING SEGMENTS
  3112.           <num>     the number of segments to add, default 1
  3113.           returns   the number of segments added
  3114.  
  3115.      (alloc <num>)       CHANGE NUMBER OF NODES TO ALLOCATE IN EACH SEGMENT
  3116.           <num>     the number of nodes to allocate
  3117.           returns   the old number of nodes to allocate
  3118.  
  3119.      (room)                               SHOW MEMORY ALLOCATION STATISTICS
  3120.           returns   nil
  3121.  
  3122.      (_t_i_m_e_ <_e_x_p_r_>_)_                                   M_E_A_S_U_R_E_ E_X_E_C_U_T_I_O_N_ T_I_M_E_
  3123.           f_s_u_b_r_._ N_o_t_e_:_ a_d_d_e_d_ f_u_n_c_t_i_o_n_
  3124.           <_e_x_p_r_>_    t_h_e_ e_x_p_r_e_s_s_i_o_n_ t_o_ e_v_a_l_u_a_t_e_
  3125.           r_e_t_u_r_n_s_   t_h_e_ e_x_e_c_u_t_i_o_n_ t_i_m_e_,_ i_n_ s_e_c_o_n_d_s_ (_f_l_o_a_t_i_n_g_ p_o_i_n_t_)_
  3126.  
  3127.  
  3128.  
  3129.  
  3130.  
  3131.  
  3132.  
  3133.      XLISP 2.0                  SYSTEM FUNCTIONS                    Page 67
  3134.  
  3135.  
  3136.      (_c_o_e_r_c_e_ <_e_x_p_r_>_ <_t_y_p_e_>_)_             F_O_R_C_E_ E_X_P_R_E_S_S_I_O_N_ T_O_ D_E_S_I_G_N_A_T_E_D_ T_Y_P_E_
  3137.           N_o_t_e_:_ a_d_d_e_d_ f_u_n_c_t_i_o_n_
  3138.           <_e_x_p_r_>_    t_h_e_ e_x_p_r_e_s_s_i_o_n_ t_o_ c_o_e_r_c_e_
  3139.           <_t_y_p_e_>_    d_e_s_i_r_e_d_ t_y_p_e_,_ a_s_ r_e_t_u_r_n_e_d_ b_y_ t_y_p_e_-_o_f_
  3140.           r_e_t_u_r_n_s_   <_e_x_p_r_>_ i_f_ t_y_p_e_ i_s_ c_o_r_r_e_c_t_,_ o_r_ c_o_n_v_e_r_t_e_d_ o_b_j_e_c_t_._
  3141.           S_e_q_u_e_n_c_e_s_ c_a_n_  b_e_ c_o_e_r_c_e_d_ i_n_t_o_ o_t_h_e_r_  s_e_q_u_e_n_c_e_s_,_ s_i_n_g_l_e_ c_h_a_r_a_c_t_e_r_
  3142.           s_t_r_i_n_g_s_  o_r_  s_y_m_b_o_l_s_  w_i_t_h_  s_i_n_g_l_e_ c_h_a_r_a_c_t_e_r_  p_r_i_n_t_n_a_m_e_s_  c_a_n_  b_e_
  3143.           c_o_e_r_c_e_d_ i_n_t_o_ c_h_a_r_a_c_t_e_r_s_,_ i_n_t_e_g_e_r_s_  c_a_n_ b_e_ c_o_e_r_c_e_d_ i_n_t_o_ c_h_a_r_a_c_t_e_r_s_
  3144.           o_r_ f_l_o_n_u_m_s_._
  3145.  
  3146.      (type-of <expr>)                    RETURNS THE TYPE OF THE EXPRESSION
  3147.           <expr>    the expression to return the type of
  3148.           returns   nil if the value is nil otherwise one of the symbols:
  3149.                     SYMBOL              for symbols
  3150.                     OBJECT              for objects
  3151.                     CONS                for conses
  3152.                     SUBR                for built-in functions
  3153.                     FSUBR               for special forms
  3154.                     CLOSURE             for defined functions
  3155.                     STRING              for strings
  3156.                     FIXNUM              for integers
  3157.                     FLONUM              for floating point numbers
  3158.                     CHARACTER           for characters
  3159.                     FILE-STREAM         for file pointers
  3160.                     UNNAMED-STREAM      for unnamed streams
  3161.                     ARRAY               for arrays
  3162.                     s_y_m_                 f_o_r_ s_t_r_u_c_t_u_r_e_s_ o_f_ t_y_p_e_ "_s_y_m_"_
  3163.  
  3164.      (_g_e_n_e_r_i_c_ <_e_x_p_r_>_)_         C_R_E_A_T_E_ A_ G_E_N_E_R_I_C_ T_Y_P_E_D_ C_O_P_Y_ O_F_ T_H_E_ E_X_P_R_E_S_S_I_O_N_
  3165.           N_o_t_e_:_ a_d_d_e_d_ f_u_n_c_t_i_o_n_,_ T_o_m_ A_l_m_y_'_s_ i_n_v_e_n_t_i_o_n_._
  3166.           <_e_x_p_r_>_    t_h_e_ e_x_p_r_e_s_s_i_o_n_ t_o_ c_o_p_y_
  3167.           r_e_t_u_r_n_s_   n_i_l_ i_f_ v_a_l_u_e_ i_s_ n_i_l_,_ o_t_h_e_r_w_i_s_e_ i_f_ t_y_p_e_ i_s_:_
  3168.                     S_Y_M_B_O_L_              c_o_p_y_ a_s_ a_n_ A_R_R_A_Y_
  3169.                     O_B_J_E_C_T_              c_o_p_y_ a_s_ a_n_ A_R_R_A_Y_
  3170.                     C_O_N_S_                (_C_O_N_S_ (_C_A_R_ <_e_x_p_r_>_)_(_C_D_R_ <_e_x_p_r_>_)_)_
  3171.                     C_L_O_S_U_R_E_             c_o_p_y_ a_s_ a_n_ A_R_R_A_Y_
  3172.                     S_T_R_I_N_G_              c_o_p_y_ o_f_ t_h_e_ s_t_r_i_n_g_
  3173.                     F_I_X_N_U_M_              v_a_l_u_e_
  3174.                     F_L_O_N_U_M_              v_a_l_u_e_
  3175.                     C_H_A_R_A_C_T_E_R_           v_a_l_u_e_
  3176.                     U_N_N_A_M_E_D_-_S_T_R_E_A_M_      c_o_p_y_ a_s_ a_ C_O_N_S_
  3177.                     A_R_R_A_Y_               c_o_p_y_ o_f_ t_h_e_ a_r_r_a_y_
  3178.  
  3179.      (peek <addrs>)                            PEEK AT A LOCATION IN MEMORY
  3180.           <addrs>   the address to peek at (integer)
  3181.           returns   the value at the specified address (integer)
  3182.  
  3183.      (poke <addrs> <value>)                        POKE A VALUE INTO MEMORY
  3184.           <addrs>   the address to poke (integer)
  3185.           <value>   the value to poke into the address (integer)
  3186.           returns   the value
  3187.  
  3188.  
  3189.  
  3190.  
  3191.  
  3192.  
  3193.  
  3194.      XLISP 2.0                  SYSTEM FUNCTIONS                    Page 68
  3195.  
  3196.  
  3197.      (address-of <expr>)                   GET THE ADDRESS OF AN XLISP NODE
  3198.           <expr>    the node
  3199.           returns   the address of the node (integer)
  3200.  
  3201.      (_g_e_t_k_e_y_)_                                 R_E_A_D_ A_ K_E_Y_S_T_R_O_K_E_ F_R_O_M_ C_O_N_S_O_L_E_
  3202.           r_e_t_u_r_n_s_   i_n_t_e_g_e_r_ v_a_l_u_e_ o_f_ k_e_y_ (_n_o_ e_c_h_o_)_
  3203.  
  3204.      (_s_y_s_t_e_m_ <_c_o_m_m_a_n_d_>_)_                            E_X_E_C_U_T_E_ A_ S_Y_S_T_E_M_ C_O_M_M_A_N_D_
  3205.           <_c_o_m_m_a_n_d_>_ C_o_m_m_a_n_d_ s_t_r_i_n_g_,_ i_f_ 0_ l_e_n_g_t_h_ t_h_e_n_ s_p_a_w_n_ O_S_ s_h_e_l_l_
  3206.           r_e_t_u_r_n_s_   T_ i_f_  s_u_c_c_e_s_s_f_u_l_ (_n_o_t_e_  t_h_a_t_ M_S_/_D_O_S_ c_o_m_m_a_n_d_._c_o_m_  a_l_w_a_y_s_
  3207.                     r_e_t_u_r_n_s_ s_u_c_c_e_s_s_)_
  3208.  
  3209.      (_e_x_i_t_)_                                                      E_X_I_T_ X_L_I_S_P_
  3210.           r_e_t_u_r_n_s_   n_e_v_e_r_ r_e_t_u_r_n_s_
  3211.  
  3212.      The following graphic functions represent an extension by Tom Almy:
  3213.  
  3214.      (mode <ax> [<bx> <width> <height>)                    SET DISPLAY MODE
  3215.           <ax>      Graphic mode (value passed in register AX)
  3216.           <bx>      BX value for some extended graphic modes
  3217.           <width>   width for extended graphic modes
  3218.           <height>  height for extended graphic modes
  3219.           returns   T
  3220.  
  3221.      (color <value>)                                      SET DRAWING COLOR
  3222.           <value>   Drawing color (not checked for validity)
  3223.           returns   <value>
  3224.  
  3225.      (move <x1> <y1> [<x2> <y2> ...])                         ABSOLUTE MOVE
  3226.      (moverel <x1> <y2> [<x2> <y2> ...])                      RELATIVE MOVE
  3227.           For  moverel,  all coordinates  are  relative  to the  preceeding
  3228.           point.
  3229.           <x1> <y1> Moves to point x1,y1 in anticipation of draw.
  3230.           <x2> <y2> Draws to points specified in additional arguments.
  3231.           returns   T if succeeds, else NIL
  3232.  
  3233.      (draw [<x1> <y1> ...])                                   ABSOLUTE DRAW
  3234.      (drawrel [<x1> <y1> ...])                                RELATIVE DRAW
  3235.           For  drawrel,  all coordinates  are  relative  to the  preceeding
  3236.           point.
  3237.           <x1> <y1> Point(s) drawn to, in order.
  3238.           returns   T if succeeds, else NIL
  3239.  
  3240.  
  3241.  
  3242.  
  3243.  
  3244.  
  3245.  
  3246.      XLISP 2.0                ADDITIONAL FUNCTIONS                  Page 69
  3247.  
  3248.  
  3249.  
  3250.      ADDITIONAL FUNCTIONS AND UTILITIES
  3251.  
  3252.      T_h_i_s_ s_e_c_t_i_o_n_ i_s_ c_o_m_p_l_e_t_e_l_y_ n_e_w_ (_a_d_d_e_d_ b_y_ T_o_m_ A_l_m_y_)_._
  3253.  
  3254.      STEP.LSP
  3255.  
  3256.      This file contains a simple Lisp single-step debugger. It   started as
  3257.      an  implementation of  the "hook"  example in  chapter 20  of Steele's
  3258.      "Common Lisp". This version was brought up on Xlisp 1.7 for the Amiga,
  3259.      and then on VAXLISP.
  3260.  
  3261.      To invoke: (step (whatever-form with args))
  3262.  
  3263.      For each  list  (interpreted function  call), the  stepper prints  the
  3264.      environment  and the list, then enters a read-eval-print loop. At this
  3265.      point the available commands are:
  3266.  
  3267.      (a list)<CR>   evaluate the list in the current environment, print the
  3268.                     result, and repeat.
  3269.      <CR>           step into the called function
  3270.      anything_else<CR>        step over the called function.
  3271.  
  3272.      If the stepper comes to a form that  is not a list it prints the  form
  3273.      and the value, and continues on without stopping.
  3274.  
  3275.      Note that  stepper commands are  executed in the  current environment.
  3276.      Since this  is the case, the  stepper commands can change  the current
  3277.      environment.  For example, a SETF will  change an environment variable
  3278.      and thus can alter the course of execution.
  3279.  
  3280.      Global variables - newline, *hooklevel*
  3281.  
  3282.      Functions/macros  -  while step  eval-hool-function  step-spaces step-
  3283.      flush
  3284.  
  3285.      Note     an  even more  powerful  stepper  package  is in  stepper.lsp
  3286.      (documented in stepper.doc).
  3287.  
  3288.  
  3289.  
  3290.  
  3291.  
  3292.  
  3293.  
  3294.      XLISP 2.0                ADDITIONAL FUNCTIONS                  Page 70
  3295.  
  3296.  
  3297.      PP.LSP
  3298.  
  3299.      In addition to  the pretty-printer  itself, this file  contains a  few
  3300.      functions that illustrate some simple but useful applications.
  3301.  
  3302.      (pp <object> [<stream>])                       PRETTY PRINT EXPRESSION
  3303.      (pp-def <funct> [<stream>])                PRETTY PRINT FUNCTION/MACRO
  3304.      (pp-file <file> [<stream>])                          PRETTY PRINT FILE
  3305.           <object>  The expression to print
  3306.           <funct>   Function to print (as DEFUN or DEFMACRO)
  3307.           <file>    File  to  print (specify  either  as  string or  quoted
  3308.                     symbol)
  3309.           <stream>  Output stream (default is *standard-output*)
  3310.           returns   T
  3311.  
  3312.      Global variables: tabsize maxsize miser-size min-miser-car max-normal-
  3313.      car
  3314.  
  3315.      Functions/Macros: sym-function  pp-file pp-def make-def pp  pp1 moveto
  3316.      spaces pp-rest-across pp-rest  printmacrop pp-binding-form  pp-do-form
  3317.      pp-defining-form pp-pair-form
  3318.  
  3319.      See the source file for more information.
  3320.  
  3321.  
  3322.  
  3323.  
  3324.  
  3325.  
  3326.  
  3327.      XLISP 2.0                ADDITIONAL FUNCTIONS                  Page 71
  3328.  
  3329.  
  3330.      REPAIR.LSP
  3331.  
  3332.      This file contains a structure editor.
  3333.      Execute (repair 'symbol) to edit a symbol.
  3334.           or  (repairf symbol)  to edit  the function  binding of  a symbol
  3335.                     (allows changing  the argument list  or function  type,
  3336.                     lambda or macro).
  3337.  
  3338.      The  editor alters the current  selection by copying  so that aborting
  3339.      all  changes is  generally posible;  the exception  is when  editing a
  3340.      closure, if the closure is BACKed out of, the change is permanent.
  3341.  
  3342.      For all commands taking a  numeric argument, the first element of  the
  3343.      selection is the 0th (as in NTH function).
  3344.  
  3345.      Any array elements  become lists when they are selected, and return to
  3346.      arrays upon RETURN or BACK commands.
  3347.  
  3348.      Do not create new closures, because the environment will be incorrect.
  3349.      Closures become LAMBDA or MACRO expressions as the selection. Only the
  3350.      closure  body may be changed; the argument list cannot be successfully
  3351.      modified, nor can the environment.
  3352.  
  3353.      For class objects, only the methods and message names can be modified.
  3354.      For  instance  objects, instance  variables  can be  examined  (if the
  3355.      object under-stands  the message :<ivar> for the particular ivar), and
  3356.      changed  (if  :SET-IVAR is  defined  for  that  class,  as  it  is  if
  3357.      CLASSES.LSP is used).
  3358.  
  3359.      (command list on next page)
  3360.  
  3361.  
  3362.  
  3363.  
  3364.  
  3365.  
  3366.  
  3367.      XLISP 2.0                ADDITIONAL FUNCTIONS                  Page 72
  3368.  
  3369.  
  3370.      COMMANDS (general):
  3371.           ?         list available commands for the selection.
  3372.           RETURN    exit, saving all changes.
  3373.           ABORT     exit, without changes.
  3374.           BACK      go back one level (as before CAR CDR or N commands).
  3375.           B n       go back n levels.
  3376.           L         display selection using pprint; if selection is symbol,
  3377.                     give short description.
  3378.           MAP       pprints each  element of selection, or  if selection is
  3379.                     symbol then gives complete description of properties.
  3380.           PLEV x    set *print-level* to x. (Initial default is *rep-print-
  3381.                     level*)
  3382.           PLEN x    set *print-length to x. (Initial default is *rep-print-
  3383.                     length*)
  3384.           EVAL x    evaluates x and prints result. The symbol @ is bound to
  3385.                     the selection.
  3386.           REPLACE x replaces the  current selection  with evaluated x.  The
  3387.                     symbol @ is bound to the selection.
  3388.      COMMANDS (if selection is symbol):
  3389.           VALUE     edit the value binding.
  3390.           FUNCTION  edit the function binding (must be a closure).
  3391.           PROP x    edit property x.
  3392.      COMMANDS (if selection is list):
  3393.           CAR       select the CAR of the current selection.
  3394.           CDR       select the CDR of the current selection.
  3395.           n         where n is small  non-negative integer, changes current
  3396.                     selection to (NTH n list).
  3397.           SUBST x y all occurances of (quoted) y are replaced with (quoted)
  3398.                     x. EQUAL is used for the comparison.
  3399.           RAISE n   removes   parenthesis   surrounding   nth  element   of
  3400.                     selection.
  3401.           LOWER n m inserts parenthesis starting with the nth  element, for
  3402.                     m elements.
  3403.           ARRAY n m as in LOWER, but makes elements into an array.
  3404.           I n x     inserts (quoted) x before nth element in selection.
  3405.           R n x     replaces nth element in selection with (quoted) x.
  3406.           D n       deletes nth element in selection.
  3407.  
  3408.      All function names and  global variables start with the  string "rep-"
  3409.      or "*rep-*".
  3410.  
  3411.  
  3412.  
  3413.  
  3414.  
  3415.  
  3416.  
  3417.      XLISP 2.0                      EXAMPLES                        Page 73
  3418.  
  3419.  
  3420.  
  3421.      EXAMPLES: FILE I/O FUNCTIONS
  3422.  
  3423.  
  3424.      Input from a File
  3425.  
  3426.      To  open a  file for  input, use  the OPEN  function with  the keyword
  3427.      argument :DIRECTION set to :INPUT. To  open a file for output, use the
  3428.      OPEN function with the keyword argument :DIRECTION set to :OUTPUT. The
  3429.      OPEN function  takes a single required  argument which is  the name of
  3430.      the file to be  opened. This name can be in the form  of a string or a
  3431.      symbol. The OPEN function returns an  object of type FILE-STREAM if it
  3432.      succeeds in opening the specified file. It returns the value NIL if it
  3433.      fails. In  order to manipulate the  file, it is necessary  to save the
  3434.      value returned by the OPEN function. This is usually done by assigning
  3435.      it to a variable with the SETQ special form or by binding it using LET
  3436.      or LET*. Here is an example:
  3437.  
  3438.          (setq fp (open "init.lsp" :direction :input))
  3439.  
  3440.      Evaluating  this expression will  result in the  file "init.lsp" being
  3441.      opened. The file  object that  will be returned  by the OPEN  function
  3442.      will be assigned to the variable "fp".
  3443.  
  3444.      It is now possible to  use the file for  input. To read an  expression
  3445.      from  the file,  just supply  the value  of the  "fp" variable  as the
  3446.      optional "stream" argument to READ.
  3447.  
  3448.          (read fp)
  3449.  
  3450.      Evaluating this expression will result in reading the first expression
  3451.      from  the  file "init.lsp".  The expression  will  be returned  as the
  3452.      result of the  READ function.  More expressions can  be read from  the
  3453.      file using further calls to the READ function. When there  are no more
  3454.      expressions  to read, the READ  function will return  NIL (or whatever
  3455.      value was supplied as the second argument to READ).
  3456.  
  3457.      Once you are done reading from the file, you should close it. To close
  3458.      the file, use the following expression:
  3459.  
  3460.          (close fp)
  3461.  
  3462.      Evaluating this expression will cause the file to be closed.
  3463.  
  3464.  
  3465.  
  3466.  
  3467.  
  3468.  
  3469.  
  3470.      XLISP 2.0                      EXAMPLES                        Page 74
  3471.  
  3472.  
  3473.  
  3474.      Output to a File
  3475.  
  3476.      Writing to a  file is pretty  much the same as  reading from one.  You
  3477.      need  to open  the  file first.  This  time you  should  use the  OPEN
  3478.      function to indicate that you will do output to the file. For example:
  3479.  
  3480.          (setq fp (open "test.dat" :direction :output))
  3481.  
  3482.      Evaluating this expression will  open the file "test.dat"  for output.
  3483.      If the file already exists, its current contents will be discarded. If
  3484.      it  doesn't already exist,  it will be  created. In any  case, a FILE-
  3485.      STREAM object will be returned by the OPEN  function. This file object
  3486.      will be assigned to the "fp" variable.
  3487.  
  3488.      It is now possible to write to this file by supplying the value of the
  3489.      "fp"  variable  as  the  optional  "stream"  parameter  in  the  PRINT
  3490.      function.
  3491.  
  3492.          (print "Hello there" fp)
  3493.  
  3494.      Evaluating this  expression will  result in  the string "Hello  there"
  3495.      being written to the file "test.dat".  More data can be written to the
  3496.      file using the same technique.
  3497.  
  3498.      Once you are done writing to the file, you should close it. Closing an
  3499.      output file is just like closing an input file.
  3500.  
  3501.          (close fp)
  3502.  
  3503.      Evaluating  this expression  will close  the output  file and  make it
  3504.      permanent.
  3505.  
  3506.  
  3507.  
  3508.      A Slightly More Complicated File Example
  3509.  
  3510.      This example shows how to open  a file, read each Lisp expression from
  3511.      the file and print it. It demonstrates the use of files and the use of
  3512.      the optional "stream" argument to the READ
  3513.      function.
  3514.  
  3515.          (do* ((fp (open "test.dat" :direction :input))
  3516.                (ex (read fp) (read fp)))
  3517.               ((null ex) nil)
  3518.            (print ex))
  3519.  
  3520.  
  3521.  
  3522.  
  3523.  
  3524.  
  3525.  
  3526.      XLISP 2.0                        INDEX                         Page 75
  3527.  
  3528.  
  3529.      INDEX
  3530.  
  3531.      :answer  18
  3532.      :class  17
  3533.      :constituent  12
  3534.      :iskindof  17
  3535.      :ismemberof  17
  3536.      :isnew  17, 18
  3537.      :mescape  12
  3538.      :messages  18
  3539.      :new  18
  3540.      :nmacro  12
  3541.      :prin1  17
  3542.      :respondsto  17
  3543.      :sescape  12
  3544.      :show  17
  3545.      :storeon  17, 18
  3546.      :superclass  17, 18
  3547.      :tmacro  12
  3548.      :white-space  12
  3549.      +  20, 37
  3550.      ++  20
  3551.      +++  20
  3552.      -  20, 37
  3553.      *  20, 37
  3554.      **  20
  3555.      ***  20
  3556.      *applyhook*  9, 20
  3557.      *breakenable*  5, 20
  3558.      *debug-io*  20
  3559.      *dos-input*  3, 20
  3560.      *error-output*  20
  3561.      *evalhook*  9, 20
  3562.      *float-format*  20
  3563.      *gc-flag*  20
  3564.      *gc-hook*  20
  3565.      *integer-format*  20
  3566.      *obarray*  20
  3567.      *print-case*  20
  3568.      *print-length*  20
  3569.      *print-level*  20
  3570.      *readtable*  12, 20
  3571.      *standard-input*  20
  3572.      *standard-output*  20
  3573.      *trace-output*  20
  3574.      *tracelimit*  5, 20
  3575.      *tracelist*  20
  3576.      *tracenable*  5, 20
  3577.      *unbound*  20
  3578.      /  37
  3579.      /=  39                                <  39
  3580.                                            <=  39
  3581.                                            =  39
  3582.                                            >  39
  3583.                                            >=  39
  3584.                                            &aux  14
  3585.                                            &key  14
  3586.                                            &optional  14
  3587.                                            &rest  14
  3588.                                            1+  37
  3589.                                            1-  37
  3590.                                            abs  38
  3591.                                            acos  38
  3592.                                            address-of  68
  3593.                                            alloc  66
  3594.                                            and  52
  3595.                                            append  32
  3596.                                            apply  21
  3597.                                            applyhook  9, 65
  3598.                                            aref  23, 27
  3599.                                            arrayp  50
  3600.                                            asin  38
  3601.                                            assoc  33
  3602.                                            atan  38
  3603.                                            atom  49
  3604.                                            backquote  21
  3605.                                            baktrace  64
  3606.                                            block  56
  3607.                                            both-case-p  43
  3608.                                            boundp  50
  3609.                                            break  64
  3610.                                            car  23, 32
  3611.                                            case  53
  3612.                                            catch  53
  3613.                                            cdr  23, 32
  3614.                                            cerror  64
  3615.                                            char  43
  3616.                                            char-code  43
  3617.                                            char-downcase  43
  3618.                                            char-equalp  44
  3619.                                            char-greaterp  44
  3620.                                            char-int  43
  3621.                                            char-lessp  44
  3622.                                            char-not-equalp  44
  3623.                                            char-not-greaterp  44
  3624.                                            char-not-lessp  44
  3625.                                            char-upcase  43
  3626.                                            char/=  44
  3627.                                            char<  44
  3628.  
  3629.  
  3630.  
  3631.  
  3632.  
  3633.  
  3634.  
  3635.      XLISP 2.0                        INDEX                         Page 76
  3636.  
  3637.  
  3638.      char<=  44
  3639.      char=  44
  3640.      char>  44
  3641.      char>=  44
  3642.      characterp  49
  3643.      class  20
  3644.      classp  50
  3645.      clean-up  4, 64
  3646.      clean-up,  5
  3647.      close  61
  3648.      code-char  43
  3649.      coerce  67
  3650.      color  68
  3651.      comma  21
  3652.      comma-at  21
  3653.      concatenate  28
  3654.      cond  52
  3655.      cons  32
  3656.      consp  49
  3657.      continue  4, 5, 64
  3658.      copy-alist  34
  3659.      copy-list  34
  3660.      copy-tree  34
  3661.      cos  38
  3662.      count-if  30
  3663.      cxxr  32
  3664.      cxxxr  32
  3665.      cxxxxr  32
  3666.      debug  65
  3667.      defclass  47
  3668.      definst  48
  3669.      defmacro  24
  3670.      defmethod  47
  3671.      defstruct  45
  3672.      defun  24
  3673.      delete  30
  3674.      delete-if  31
  3675.      delete-if-not  31
  3676.      digit-char  43
  3677.      digit-char-p  43
  3678.      do  55
  3679.      do*  55
  3680.      dolist  55
  3681.      dotimes  55
  3682.      draw  68
  3683.      drawrel  68
  3684.      dribble  66
  3685.      elt  23, 28
  3686.      endp  49
  3687.      eq  50
  3688.      eql  51                               equal  51
  3689.                                            error  64
  3690.                                            errset  5, 64
  3691.                                            eval  21
  3692.                                            evalhook  9, 65
  3693.                                            evenp  50
  3694.                                            every  28
  3695.                                            exit  68
  3696.                                            exp  38
  3697.                                            expand  66
  3698.                                            expt  38
  3699.                                            fboundp  50
  3700.                                            file-length  61
  3701.                                            file-position  62
  3702.                                            find-if  30
  3703.                                            first  32
  3704.                                            flatc  59
  3705.                                            flatsize  59
  3706.                                            flet  53
  3707.                                            float  37
  3708.                                            floatp  49
  3709.                                            fmakunbound  25
  3710.                                            format  60
  3711.                                            fourth  32
  3712.                                            funcall  21
  3713.                                            function  21
  3714.                                            gc  66
  3715.                                            gcd  38
  3716.                                            generic  67
  3717.                                            gensym  24
  3718.                                            get  23, 26
  3719.                                            get-lambda-expression  22
  3720.                                            get-macro-character  58
  3721.                                            get-output-stream-list  63
  3722.                                            get-output-stream-string
  3723.                                                      63
  3724.                                            getkey  68
  3725.                                            go  56
  3726.                                            hash  24
  3727.                                            if  52
  3728.                                            int-char  43
  3729.                                            integerp  49
  3730.                                            intern  24
  3731.                                            labels  53
  3732.                                            lambda  21
  3733.                                            last  32
  3734.                                            lconc  35
  3735.                                            length  28
  3736.                                            let  53
  3737.                                            let*  53
  3738.                                            list  32
  3739.  
  3740.  
  3741.  
  3742.  
  3743.  
  3744.  
  3745.  
  3746.      XLISP 2.0                        INDEX                         Page 77
  3747.  
  3748.  
  3749.      listp  49
  3750.      load  66
  3751.      logand  40
  3752.      logior  40
  3753.      lognot  40
  3754.      logxor  40
  3755.      loop  55
  3756.      lower-case-p  43
  3757.      macroexpand  22
  3758.      macroexpand-1  22
  3759.      macrolet  53
  3760.      make-array  27
  3761.      make-string-input-stream
  3762.                63
  3763.      make-string-output-stream
  3764.                63
  3765.      make-symbol  24
  3766.      make_tconc  34
  3767.      makunbound  25
  3768.      map  28
  3769.      mapc  33
  3770.      mapcan  33
  3771.      mapcar  33
  3772.      mapcon  33
  3773.      mapl  33
  3774.      maplist  33
  3775.      max  37
  3776.      member  32
  3777.      min  37
  3778.      minusp  50
  3779.      mode  68
  3780.      move  68
  3781.      moverel  68
  3782.      nconc  36
  3783.      nil  20
  3784.      nodebug  65
  3785.      not  49
  3786.      notany  28
  3787.      notevery  28
  3788.      nreverse  29
  3789.      nstring-downcase  41
  3790.      nstring-upcase  41
  3791.      nth  23, 33
  3792.      nthcdr  33
  3793.      null  49
  3794.      numberp  49
  3795.      object  20
  3796.      objectp  50
  3797.      oddp  50
  3798.      open  61
  3799.      or  52                                pairlis  34
  3800.                                            peek  67
  3801.                                            peek-char  62
  3802.                                            plusp  50
  3803.                                            poke  67
  3804.                                            pop  24
  3805.                                            position-if  30
  3806.                                            pp  70
  3807.                                            pprint  58
  3808.                                            prin1  58
  3809.                                            princ  58
  3810.                                            print  58
  3811.                                            prog  56
  3812.                                            prog*  56
  3813.                                            prog1  57
  3814.                                            prog2  57
  3815.                                            progn  57
  3816.                                            progv  56
  3817.                                            psetq  23
  3818.                                            push  24
  3819.                                            putprop  26
  3820.                                            quote  21
  3821.                                            random  38
  3822.                                            read  58
  3823.                                            read-byte  62
  3824.                                            read-char  62
  3825.                                            read-line  62
  3826.                                            rem  37
  3827.                                            remove  29
  3828.                                            remove-head  35
  3829.                                            remove-if  29
  3830.                                            remove-if-not  30
  3831.                                            remprop  26
  3832.                                            repair  71
  3833.                                            rest  32
  3834.                                            restore  66
  3835.                                            return  56
  3836.                                            return-from  56
  3837.                                            reverse  29
  3838.                                            room  66
  3839.                                            rplaca  36
  3840.                                            rplacd  36
  3841.                                            save  66
  3842.                                            search  29
  3843.                                            second  32
  3844.                                            self  16, 20
  3845.                                            send  16, 23, 47
  3846.                                            send-super  16, 47
  3847.                                            set  23
  3848.                                            set-macro-character  58
  3849.                                            setf  23
  3850.  
  3851.  
  3852.  
  3853.  
  3854.  
  3855.  
  3856.  
  3857.      XLISP 2.0                        INDEX                         Page 78
  3858.  
  3859.  
  3860.      setq  23
  3861.      sin  38
  3862.      some  28
  3863.      sort  36
  3864.      sqrt  38
  3865.      step  69
  3866.      strcat  42
  3867.      streamp  50
  3868.      string  41
  3869.      string-downcase  41
  3870.      string-equalp  42
  3871.      string-greaterp  42
  3872.      string-left-trim  41
  3873.      string-lessp  42
  3874.      string-not-equalp  42
  3875.      string-not-greaterp  42
  3876.      string-not-lessp  42
  3877.      string-right-trim  41
  3878.      string-trim  41
  3879.      string-upcase  41
  3880.      string/=  42
  3881.      string<  42
  3882.      string<=  42
  3883.      string=  42
  3884.      string>  42
  3885.      string>=  42
  3886.      stringp  49
  3887.      sublis  34
  3888.      subseq  29
  3889.      subst  34
  3890.      symbol-function  23, 24
  3891.      symbol-name  24
  3892.      symbol-plist  23, 24
  3893.      symbol-value  23, 24
  3894.      symbolp  49
  3895.      system  68
  3896.      t  20
  3897.      tagbody  56
  3898.      tan  38
  3899.      tconc  35
  3900.      terpri  58
  3901.      third  32
  3902.      throw  53
  3903.      time  66
  3904.      top-level  4, 64
  3905.      trace  64
  3906.      truncate  37
  3907.      type-of  67
  3908.      unless  52
  3909.      untrace  64
  3910.      unwind-protect  54                    upper-case-p  43
  3911.                                            vector  27
  3912.                                            when  52
  3913.                                            write-byte  62
  3914.                                            write-char  62
  3915.                                            zerop  50
  3916.