Annotation of 43BSD/ucb/lisp/lisplib/manual/ch7.r, revision 1.1

1.1     ! root        1: 
        !             2: 
        !             3: 
        !             4: 
        !             5: 
        !             6: 
        !             7: 
        !             8:                          CHAPTER  7
        !             9: 
        !            10: 
        !            11:                       The Lisp Reader
        !            12: 
        !            13: 
        !            14: 
        !            15: 
        !            16: 
        !            17: 
        !            18:    7.1.  Introduction
        !            19: 
        !            20:            The _r_e_a_d function is responsible for converting a
        !            21:       stream  of characters into a Lisp expression.  _R_e_a_d is
        !            22:       table driven and the table it uses is called a  _r_e_a_d_t_-
        !            23:       _a_b_l_e.  The _p_r_i_n_t function does the inverse of _r_e_a_d; it
        !            24:       converts a Lisp expression into a  stream  of  charac-
        !            25:       ters.   Typically the conversion is done in such a way
        !            26:       that if that stream of characters were read  by  _r_e_a_d,
        !            27:       the  result  would  be  an expression equal to the one
        !            28:       _p_r_i_n_t was given.  _P_r_i_n_t must also refer to the  readt-
        !            29:       able  in  order to determine how to format its output.
        !            30:       The _e_x_p_l_o_d_e function, which returns a list of  charac-
        !            31:       ters  rather  than  printing them,  must also refer to
        !            32:       the readtable.
        !            33: 
        !            34:            A readtable is  created  with  the  _m_a_k_e_r_e_a_d_t_a_b_l_e
        !            35:       function,  modified  with  the  _s_e_t_s_y_n_t_a_x function and
        !            36:       interrogated with the _g_e_t_s_y_n_t_a_x function.  The  struc-
        !            37:       ture  of  a  readtable  is  hidden  from the user  - a
        !            38:       readtable should only be manipulated  with  the  three
        !            39:       functions mentioned above.
        !            40: 
        !            41:            There is one distinguished readtable  called  the
        !            42:       _c_u_r_r_e_n_t  _r_e_a_d_t_a_b_l_e  whose  value determines what _r_e_a_d,
        !            43:       _p_r_i_n_t and _e_x_p_l_o_d_e do.  The current  readtable  is  the
        !            44:       value  of  the symbol _r_e_a_d_t_a_b_l_e.  Thus it is  possible
        !            45:       to rapidly change the current syntax by lambda binding
        !            46:       a  different  readtable to the symbol _r_e_a_d_t_a_b_l_e.  When
        !            47:       the binding is undone, the syntax reverts to  its  old
        !            48:       form.
        !            49: 
        !            50: 
        !            51: 
        !            52:    7.2.  Syntax Classes
        !            53: 
        !            54:            The readtable describes how each of the 128 ascii
        !            55:       characters   should  be  treated  by  the  reader  and
        !            56:       printer.  Each character belongs  to  a  _s_y_n_t_a_x  _c_l_a_s_s
        !            57:       which has three properties:
        !            58: 
        !            59:       character class -
        !            60:            Tells what the reader should do when it sees this
        !            61: 
        !            62: 
        !            63: The Lisp Reader                                          7-1
        !            64: 
        !            65: 
        !            66: 
        !            67: 
        !            68: 
        !            69: 
        !            70: 
        !            71: The Lisp Reader                                          7-2
        !            72: 
        !            73: 
        !            74:            character.  There are a large number of character
        !            75:            classes. They are described below.
        !            76: 
        !            77:       separator -
        !            78:            Most types of tokens the  reader  constructs  are
        !            79:            one  character  long.   Four  token types have an
        !            80:            arbitrary length:  number  (1234),  symbol  print
        !            81:            name   (franz),   escaped   symbol   print   name
        !            82:            (|franz|), and string ("franz").  The reader  can
        !            83:            easily  determine  when it has come to the end of
        !            84:            one of the last two types: it just looks for  the
        !            85:            matching  delimiter (| or ").  When the reader is
        !            86:            reading a number or symbol print name,  it  stops
        !            87:            reading  when  it  comes  to a character with the
        !            88:            _s_e_p_a_r_a_t_o_r property.  The separator  character  is
        !            89:            pushed back into the input stream and will be the
        !            90:            first character read when the  reader  is  called
        !            91:            again.
        !            92: 
        !            93:       escape -
        !            94:            Tells the printer when to put  escapes  in  front
        !            95:            of, or around, a symbol whose print name contains
        !            96:            this character.  There are  three  possibilities:
        !            97:            always escape a symbol with this character in it,
        !            98:            only escape a symbol if this is the only  charac-
        !            99:            ter  in  the  symbol, and only escape a symbol if
        !           100:            this  is  the  first  character  in  the  symbol.
        !           101:            [note:  The  printer  will always escape a symbol
        !           102:            which, if printed out, would look  like  a  valid
        !           103:            number.]
        !           104: 
        !           105:            When the Lisp system is built, Lisp code is added
        !           106:       to  a  C-coded kernel and the result becomes the stan-
        !           107:       dard lisp system.  The readtable  present  in  the  C-
        !           108:       coded  kernel,  called the _r_a_w _r_e_a_d_t_a_b_l_e, contains the
        !           109:       bare necessities for reading in Lisp code.  During the
        !           110:       construction  of  the  complete Lisp system, a copy is
        !           111:       made of the raw readtable and then the copy  is  modi-
        !           112:       fied  by  adding macro characters.  The result is what
        !           113:       is called the _s_t_a_n_d_a_r_d _r_e_a_d_t_a_b_l_e.  When a  new  readt-
        !           114:       able  is created with _m_a_k_e_r_e_a_d_t_a_b_l_e, a copy is made of
        !           115:       either the raw  readtable  or  the  current  readtable
        !           116:       (which is likely to be the standard readtable).
        !           117: 
        !           118: 
        !           119: 
        !           120:    7.3.  Reader Operations
        !           121: 
        !           122:            The reader has a very simple  algorithm.   It  is
        !           123:       either  _s_c_a_n_n_i_n_g  for  a token, _c_o_l_l_e_c_t_i_n_g a token, or
        !           124:       _p_r_o_c_e_s_s_i_n_g a token.  Scanning involves reading charac-
        !           125:       ters  and throwing away those which don't start tokens
        !           126:       (such as blanks and tabs).  Collecting means gathering
        !           127: 
        !           128: 
        !           129:                                    Printed: January 31, 1984
        !           130: 
        !           131: 
        !           132: 
        !           133: 
        !           134: 
        !           135: 
        !           136: 
        !           137: The Lisp Reader                                          7-3
        !           138: 
        !           139: 
        !           140:       the  characters  which  make up a token into a buffer.
        !           141:       Processing  may  involve  creating  symbols,  strings,
        !           142:       lists,  fixnums,  bignums or flonums or calling a user
        !           143:       written function called a character macro.
        !           144: 
        !           145:            The components of the syntax class determine when
        !           146:       the  reader  switches between the scanning, collecting
        !           147:       and processing states.  The reader will continue scan-
        !           148:       ning  as long as the character class of the characters
        !           149:       it reads is _c_s_e_p_a_r_a_t_o_r.  When  it  reads  a  character
        !           150:       whose character class is not _c_s_e_p_a_r_a_t_o_r it stores that
        !           151:       character in its  buffer  and  begins  the  collecting
        !           152:       phase.
        !           153: 
        !           154:            If the character class of that first character is
        !           155:       _c_c_h_a_r_a_c_t_e_r,  _c_n_u_m_b_e_r, _c_p_e_r_i_o_d, or _c_s_i_g_n.  then it will
        !           156:       continue collecting until it  runs  into  a  character
        !           157:       whose  syntax class has the _s_e_p_a_r_a_t_o_r property.  (That
        !           158:       last character will be  pushed  back  into  the  input
        !           159:       buffer  and  will  be  the  first  character read next
        !           160:       time.) Now the reader goes into the processing  phase,
        !           161:       checking  to  see  if the token it read is a number or
        !           162:       symbol.  It is important to note that  after the first
        !           163:       character  is  collected  the  component of the syntax
        !           164:       class which tells the reader to   stop  collecting  is
        !           165:       the _s_e_p_a_r_a_t_o_r property, not the character class.
        !           166: 
        !           167:            If the character class  of  the  character  which
        !           168:       stopped  the  scanning  is  not  _c_c_h_a_r_a_c_t_e_r,  _c_n_u_m_b_e_r,
        !           169:       _c_p_e_r_i_o_d, or _c_s_i_g_n.  then  the  reader  processes  that
        !           170:       character    immediately.    The   character   classes
        !           171:       _c_s_i_n_g_l_e-_m_a_c_r_o,  _c_s_i_n_g_l_e-_s_p_l_i_c_i_n_g-_m_a_c_r_o,  and  _c_s_i_n_g_l_e-
        !           172:       _i_n_f_i_x-_m_a_c_r_o  will act like _c_c_h_a_r_a_c_t_e_r if the following
        !           173:       token is not a _s_e_p_a_r_a_t_o_r.   The  processing  which  is
        !           174:       done  for  a  given  character  class  is described in
        !           175:       detail in the next section.
        !           176: 
        !           177: 
        !           178: 
        !           179:    7.4.  Character Classes
        !           180: 
        !           181: 
        !           182: _c_c_h_a_r_a_c_t_e_r    raw readtable:A-Z a-z ^H !#$%&*,/:;<=>?@^_`{}~
        !           183:             standard readtable:A-Z a-z ^H !$%&*/:;<=>?@^_{}~
        !           184:       A normal character.
        !           185: 
        !           186: 
        !           187: _c_n_u_m_b_e_r                                    raw readtable:0-9
        !           188:                                       standard readtable:0-9
        !           189:       This type is a digit. The syntax for an integer  (fix-
        !           190:       num  or  bignum)  is  a  string  of _c_n_u_m_b_e_r characters
        !           191:       optionally followed by a _c_p_e_r_i_o_d.  If the  digits  are
        !           192:       not  followed  by a _c_p_e_r_i_o_d, then they are interpreted
        !           193: 
        !           194: 
        !           195:                                    Printed: January 31, 1984
        !           196: 
        !           197: 
        !           198: 
        !           199: 
        !           200: 
        !           201: 
        !           202: 
        !           203: The Lisp Reader                                          7-4
        !           204: 
        !           205: 
        !           206:       in base _i_b_a_s_e which must be eight or ten.  The  syntax
        !           207:       for  a  floating  point  number is either zero or more
        !           208:       _c_n_u_m_b_e_r's followed by a _c_p_e_r_i_o_d and then  followed  by
        !           209:       one  or  more  _c_n_u_m_b_e_r's.  A floating point number may
        !           210:       also be  an integer or floating point number  followed
        !           211:       by 'e' or 'd', an optional '+' or '-' and then zero or
        !           212:       more _c_n_u_m_b_e_r's.
        !           213: 
        !           214: 
        !           215: _c_s_i_g_n                                       raw readtable:+-
        !           216:                                        standard readtable:+-
        !           217:       A leading sign  for  a  number.  No  other  characters
        !           218:       should be given this class.
        !           219: 
        !           220: 
        !           221: _c_l_e_f_t_-_p_a_r_e_n                                  raw readtable:(
        !           222:                                         standard readtable:(
        !           223:       A left parenthesis.  Tells the reader to begin forming
        !           224:       a list.
        !           225: 
        !           226: 
        !           227: _c_r_i_g_h_t_-_p_a_r_e_n                                 raw readtable:)
        !           228:                                         standard readtable:)
        !           229:       A right parenthesis.  Tells the  reader  that  it  has
        !           230:       reached the end of a list.
        !           231: 
        !           232: 
        !           233: _c_l_e_f_t_-_b_r_a_c_k_e_t                                raw readtable:[
        !           234:                                         standard readtable:[
        !           235:       A left bracket.  Tells the reader that it should begin
        !           236:       forming a list.  See the description of _c_r_i_g_h_t-_b_r_a_c_k_e_t
        !           237:       for the difference between  cleft-bracket  and  cleft-
        !           238:       paren.
        !           239: 
        !           240: 
        !           241: _c_r_i_g_h_t_-_b_r_a_c_k_e_t                               raw readtable:]
        !           242:                                         standard readtable:]
        !           243:       A right bracket.  A _c_r_i_g_h_t-_b_r_a_c_k_e_t finishes the forma-
        !           244:       tion of the current list and all enclosing lists until
        !           245:       it finds one which  begins  with  a  _c_l_e_f_t-_b_r_a_c_k_e_t  or
        !           246:       until it reaches the top level list.
        !           247: 
        !           248: 
        !           249: _c_p_e_r_i_o_d                                      raw readtable:.
        !           250:                                         standard readtable:.
        !           251:       The period is used to separate element of a cons  cell
        !           252:       [e.g.  (a . (b . nil)) is the same as (a b)].  _c_p_e_r_i_o_d
        !           253:       is also used in numbers as described above.
        !           254: 
        !           255: 
        !           256: _c_s_e_p_a_r_a_t_o_r                     raw readtable:^I-^M esc space
        !           257:                           standard readtable:^I-^M esc space
        !           258:       Separates tokens.  When the reader is scanning,  these
        !           259: 
        !           260: 
        !           261:                                    Printed: January 31, 1984
        !           262: 
        !           263: 
        !           264: 
        !           265: 
        !           266: 
        !           267: 
        !           268: 
        !           269: The Lisp Reader                                          7-5
        !           270: 
        !           271: 
        !           272:       character  are  passed over.  Note: there is a differ-
        !           273:       ence between the _c_s_e_p_a_r_a_t_o_r character  class  and  the
        !           274:       _s_e_p_a_r_a_t_o_r property of a syntax class.
        !           275: 
        !           276: 
        !           277: _c_s_i_n_g_l_e_-_q_u_o_t_e                                raw readtable:'
        !           278:                                         standard readtable:'
        !           279:       This causes _r_e_a_d to be called recursively and the list
        !           280:       (quote <value read>) to be returned.
        !           281: 
        !           282: 
        !           283: _c_s_y_m_b_o_l_-_d_e_l_i_m_i_t_e_r                            raw readtable:|
        !           284:                                         standard readtable:|
        !           285:       This causes the reader to begin collecting  characters
        !           286:       and  to  stop  only  when  another  identical _c_s_y_m_b_o_l-
        !           287:       _d_e_l_i_m_i_t_e_r is seen. The only way to escape  a  _c_s_y_m_b_o_l-
        !           288:       _d_e_l_i_m_i_t_e_r within a symbol name is with a _c_e_s_c_a_p_e char-
        !           289:       acter.  The collected characters are converted into  a
        !           290:       string which becomes the print name of a symbol.  If a
        !           291:       symbol with an identical print  name  already  exists,
        !           292:       then  the  allocation is not done, rather the existing
        !           293:       symbol is used.
        !           294: 
        !           295: 
        !           296: _c_e_s_c_a_p_e                                      raw readtable:\
        !           297:                                         standard readtable:\
        !           298:       This causes the  next  character  to  read  in  to  be
        !           299:       treated  as  a  vcharacter.   A character whose syntax
        !           300:       class is vcharacter has a character  class  _c_c_h_a_r_a_c_t_e_r
        !           301:       and  does  not  have the _s_e_p_a_r_a_t_o_r property so it will
        !           302:       not separate symbols.
        !           303: 
        !           304: 
        !           305: _c_s_t_r_i_n_g_-_d_e_l_i_m_i_t_e_r                            raw readtable:"
        !           306:                                         standard readtable:"
        !           307:       This is  the  same  as  _c_s_y_m_b_o_l-_d_e_l_i_m_i_t_e_r  except  the
        !           308:       result is returned as a string instead of a symbol.
        !           309: 
        !           310: 
        !           311: _c_s_i_n_g_l_e_-_c_h_a_r_a_c_t_e_r_-_s_y_m_b_o_l                  raw readtable:none
        !           312:                                      standard readtable:none
        !           313:       This returns a symbol whose print name is the the sin-
        !           314:       gle character which has been collected.
        !           315: 
        !           316: 
        !           317: _c_m_a_c_r_o                                    raw readtable:none
        !           318:                                        standard readtable:`,
        !           319:       The reader calls the macro  function  associated  with
        !           320:       this  character  and the current readtable, passing it
        !           321:       no arguments.  The result of the macro is added to the
        !           322:       structure the reader is building, just as if that form
        !           323:       were directly read by the  reader.   More  details  on
        !           324:       macros are provided below.
        !           325: 
        !           326: 
        !           327:                                    Printed: January 31, 1984
        !           328: 
        !           329: 
        !           330: 
        !           331: 
        !           332: 
        !           333: 
        !           334: 
        !           335: The Lisp Reader                                          7-6
        !           336: 
        !           337: 
        !           338: _c_s_p_l_i_c_i_n_g_-_m_a_c_r_o                           raw readtable:none
        !           339:                                        standard readtable:#;
        !           340:       A _c_s_p_l_i_c_i_n_g-_m_a_c_r_o differs from a _c_m_a_c_r_o in the way the
        !           341:       result  is incorporated in the structure the reader is
        !           342:       building.  A _c_s_p_l_i_c_i_n_g-_m_a_c_r_o must  return  a  list  of
        !           343:       forms (possibly empty).  The reader acts as if it read
        !           344:       each element of the list itself without the  surround-
        !           345:       ing parenthesis.
        !           346: 
        !           347: 
        !           348: _c_s_i_n_g_l_e_-_m_a_c_r_o                             raw readtable:none
        !           349:                                      standard readtable:none
        !           350:       This causes to reader to check the next character.  If
        !           351:       it is a _c_s_e_p_a_r_a_t_o_r then this acts like a _c_m_a_c_r_o.  Oth-
        !           352:       erwise, it acts like a _c_c_h_a_r_a_c_t_e_r.
        !           353: 
        !           354: 
        !           355: _c_s_i_n_g_l_e_-_s_p_l_i_c_i_n_g_-_m_a_c_r_o                    raw readtable:none
        !           356:                                      standard readtable:none
        !           357:       This is triggered like  a  _c_s_i_n_g_l_e-_m_a_c_r_o  however  the
        !           358:       result is spliced in like a _c_s_p_l_i_c_i_n_g-_m_a_c_r_o.
        !           359: 
        !           360: 
        !           361: _c_i_n_f_i_x_-_m_a_c_r_o                              raw readtable:none
        !           362:                                      standard readtable:none
        !           363:       This is differs from a _c_m_a_c_r_o in that the macro  func-
        !           364:       tion is passed a form representing what the reader has
        !           365:       read so far. The result of the macro replaces what the
        !           366:       reader had read so far.
        !           367: 
        !           368: 
        !           369: _c_s_i_n_g_l_e_-_i_n_f_i_x_-_m_a_c_r_o                       raw readtable:none
        !           370:                                      standard readtable:none
        !           371:       This differs from the _c_i_n_f_i_x-_m_a_c_r_o in that  the  macro
        !           372:       will  only be triggered if the character following the
        !           373:       _c_s_i_n_g_l_e-_i_n_f_i_x-_m_a_c_r_o character is a _c_s_e_p_a_r_a_t_o_r.
        !           374: 
        !           375: 
        !           376: _c_i_l_l_e_g_a_l                 raw readtable:^@-^G^N-^Z^\-^_rubout
        !           377:                     standard readtable:^@-^G^N-^Z^\-^_rubout
        !           378:       The characters cause the reader to signal an error  if
        !           379:       read.
        !           380: 
        !           381: 
        !           382: 
        !           383:    7.5.  Syntax Classes
        !           384: 
        !           385:            The readtable maps each character into  a  syntax
        !           386:       class.   The  syntax  class  contains  three pieces of
        !           387:       information: the character class, whether  this  is  a
        !           388:       separator,  and  the escape properties.  The first two
        !           389:       properties are used by the reader,  the  last  by  the
        !           390:       printer  (and  _e_x_p_l_o_d_e).   The initial lisp system has
        !           391: 
        !           392: 
        !           393:                                    Printed: January 31, 1984
        !           394: 
        !           395: 
        !           396: 
        !           397: 
        !           398: 
        !           399: 
        !           400: 
        !           401: The Lisp Reader                                          7-7
        !           402: 
        !           403: 
        !           404:       the following syntax classes defined.   The  user  may
        !           405:       add  syntax  classes  with _a_d_d-_s_y_n_t_a_x-_c_l_a_s_s.  For each
        !           406:       syntax class, we list the properties of the class  and
        !           407:       which  characters  have  this syntax class by default.
        !           408:       More information about each syntax class can be  found
        !           409:       under  the description of the syntax class's character
        !           410:       class.
        !           411: 
        !           412: vcharacter    raw readtable:A-Z a-z ^H !#$%&*,/:;<=>?@^_`{}~
        !           413: _c_c_h_a_r_a_c_t_e_r  standard readtable:A-Z a-z ^H !$%&*/:;<=>?@^_{}~
        !           414: 
        !           415: 
        !           416: 
        !           417: vnumber                                    raw readtable:0-9
        !           418: _c_n_u_m_b_e_r                               standard readtable:0-9
        !           419: 
        !           420: 
        !           421: 
        !           422: vsign                                       raw readtable:+-
        !           423: _c_s_i_g_n                                  standard readtable:+-
        !           424: 
        !           425: 
        !           426: 
        !           427: vleft-paren                                  raw readtable:(
        !           428: _c_l_e_f_t_-_p_a_r_e_n                             standard readtable:(
        !           429: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           430: _s_e_p_a_r_a_t_o_r
        !           431: 
        !           432: vright-paren                                 raw readtable:)
        !           433: _c_r_i_g_h_t_-_p_a_r_e_n                            standard readtable:)
        !           434: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           435: _s_e_p_a_r_a_t_o_r
        !           436: 
        !           437: vleft-bracket                                raw readtable:[
        !           438: _c_l_e_f_t_-_b_r_a_c_k_e_t                           standard readtable:[
        !           439: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           440: _s_e_p_a_r_a_t_o_r
        !           441: 
        !           442: vright-bracket                               raw readtable:]
        !           443: _c_r_i_g_h_t_-_b_r_a_c_k_e_t                          standard readtable:]
        !           444: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           445: _s_e_p_a_r_a_t_o_r
        !           446: 
        !           447: vperiod                                      raw readtable:.
        !           448: _c_p_e_r_i_o_d                                 standard readtable:.
        !           449: _e_s_c_a_p_e_-_w_h_e_n_-_u_n_i_q_u_e
        !           450: 
        !           451: 
        !           452: vseparator                     raw readtable:^I-^M esc space
        !           453: _c_s_e_p_a_r_a_t_o_r                standard readtable:^I-^M esc space
        !           454: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           455: _s_e_p_a_r_a_t_o_r
        !           456: 9
        !           457: 
        !           458: 9                                   Printed: January 31, 1984
        !           459: 
        !           460: 
        !           461: 
        !           462: 
        !           463: 
        !           464: 
        !           465: 
        !           466: The Lisp Reader                                          7-8
        !           467: 
        !           468: 
        !           469: vsingle-quote                                raw readtable:'
        !           470: _c_s_i_n_g_l_e_-_q_u_o_t_e                           standard readtable:'
        !           471: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           472: _s_e_p_a_r_a_t_o_r
        !           473: 
        !           474: vsymbol-delimiter                            raw readtable:|
        !           475: _c_s_i_n_g_l_e_-_d_e_l_i_m_i_t_e_r                       standard readtable:|
        !           476: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           477: 
        !           478: 
        !           479: vescape                                      raw readtable:\
        !           480: _c_e_s_c_a_p_e                                 standard readtable:\
        !           481: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           482: 
        !           483: 
        !           484: vstring-delimiter                            raw readtable:"
        !           485: _c_s_t_r_i_n_g_-_d_e_l_i_m_i_t_e_r                       standard readtable:"
        !           486: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           487: 
        !           488: 
        !           489: vsingle-character-symbol                  raw readtable:none
        !           490: _c_s_i_n_g_l_e_-_c_h_a_r_a_c_t_e_r_-_s_y_m_b_o_l             standard readtable:none
        !           491: _s_e_p_a_r_a_t_o_r
        !           492: 
        !           493: 
        !           494: vmacro                                    raw readtable:none
        !           495: _c_m_a_c_r_o                                 standard readtable:`,
        !           496: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           497: _s_e_p_a_r_a_t_o_r
        !           498: 
        !           499: vsplicing-macro                           raw readtable:none
        !           500: _c_s_p_l_i_c_i_n_g_-_m_a_c_r_o                        standard readtable:#;
        !           501: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           502: _s_e_p_a_r_a_t_o_r
        !           503: 
        !           504: vsingle-macro                             raw readtable:none
        !           505: _c_s_i_n_g_l_e_-_m_a_c_r_o                        standard readtable:none
        !           506: _e_s_c_a_p_e_-_w_h_e_n_-_u_n_i_q_u_e
        !           507: 
        !           508: 
        !           509: vsingle-splicing-macro                    raw readtable:none
        !           510: _c_s_i_n_g_l_e_-_s_p_l_i_c_i_n_g_-_m_a_c_r_o               standard readtable:none
        !           511: _e_s_c_a_p_e_-_w_h_e_n_-_u_n_i_q_u_e
        !           512: 
        !           513: 
        !           514: vinfix-macro                              raw readtable:none
        !           515: _c_i_n_f_i_x_-_m_a_c_r_o                         standard readtable:none
        !           516: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           517: _s_e_p_a_r_a_t_o_r
        !           518: 
        !           519: vsingle-infix-macro                       raw readtable:none
        !           520: _c_s_i_n_g_l_e_-_i_n_f_i_x_-_m_a_c_r_o                  standard readtable:none
        !           521: _e_s_c_a_p_e_-_w_h_e_n_-_u_n_i_q_u_e
        !           522: 
        !           523: 
        !           524:                                    Printed: January 31, 1984
        !           525: 
        !           526: 
        !           527: 
        !           528: 
        !           529: 
        !           530: 
        !           531: 
        !           532: The Lisp Reader                                          7-9
        !           533: 
        !           534: 
        !           535: 
        !           536: 
        !           537: villegal                 raw readtable:^@-^G^N-^Z^\-^_rubout
        !           538: _c_i_l_l_e_g_a_l            standard readtable:^@-^G^N-^Z^\-^_rubout
        !           539: _e_s_c_a_p_e_-_a_l_w_a_y_s
        !           540: _s_e_p_a_r_a_t_o_r
        !           541: 
        !           542: 
        !           543: 
        !           544:    7.6.  Character Macros
        !           545: 
        !           546:            Character macros are user written functions which
        !           547:       are  executed  during  the reading process.  The value
        !           548:       returned by a character macro may or may not  be  used
        !           549:       by  the reader, depending on the type of macro and the
        !           550:       value returned.  Character macros are always  attached
        !           551:       to a single character with the _s_e_t_s_y_n_t_a_x function.
        !           552: 
        !           553: 
        !           554: 
        !           555:       7.6.1.  Types   There are  three  types  of  character
        !           556:          macros:  normal,  splicing  and infix.  These types
        !           557:          differ in the arguments they are given or  in  what
        !           558:          is done with the result they return.
        !           559: 
        !           560: 
        !           561: 
        !           562:          7.6.1.1.  Normal
        !           563: 
        !           564:                  A normal macro is passed no arguments.  The
        !           565:             value  returned by a normal macro is simply used
        !           566:             by the reader  as  if  it  had  read  the  value
        !           567:             itself.   Here  is  an  example of a macro which
        !           568:             returns the abbreviation for a given state.
        !           569: 
        !           570: 
        !           571:     ____________________________________________________
        !           572: 
        !           573:     ->(_d_e_f_u_n _s_t_a_t_e_a_b_b_r_e_v _n_i_l
        !           574:          (_c_d_r (_a_s_s_q (_r_e_a_d) '((_c_a_l_i_f_o_r_n_i_a . _c_a) (_p_e_n_n_s_y_l_v_a_n_i_a . _p_a)))))
        !           575:     stateabbrev
        !           576:     -> (_s_e_t_s_y_n_t_a_x '_\! '_v_m_a_c_r_o '_s_t_a_t_e_a_b_b_r_e_v)
        !           577:     t
        !           578:     -> '( ! _c_a_l_i_f_o_r_n_i_a ! _w_y_o_m_i_n_g ! _p_e_n_n_s_y_l_v_a_n_i_a)
        !           579:     (ca nil pa)
        !           580:     ____________________________________________________
        !           581: 
        !           582: 
        !           583: 
        !           584: Notice what happened to
        !           585:  ! _w_y_o_m_i_n_g.  Since it wasn't in the  table,  the  associated
        !           586: function  returned  nil.   The creator of the macro may have
        !           587: wanted to leave the list alone, in such a case, but couldn't
        !           588: 
        !           589: 
        !           590:                                    Printed: January 31, 1984
        !           591: 
        !           592: 
        !           593: 
        !           594: 
        !           595: 
        !           596: 
        !           597: 
        !           598: The Lisp Reader                                         7-10
        !           599: 
        !           600: 
        !           601: with  this  type  of  reader  macro.   The  splicing  macro,
        !           602: described next, allows a character macro function to  return
        !           603: a value that is ignored.
        !           604: 
        !           605: 
        !           606: 
        !           607:          7.6.1.2.  Splicing
        !           608: 
        !           609:                  The value returned from  a  splicing  macro
        !           610:             must  be  a  list  or nil.  If the value is nil,
        !           611:             then the value is ignored, otherwise the  reader
        !           612:             acts  as  if  it  read  each object in the list.
        !           613:             Usually the list only contains one  element.  If
        !           614:             the reader is reading at the top level (i.e. not
        !           615:             collecting elements of list), then it is illegal
        !           616:             for  a  splicing  macro  to return more then one
        !           617:             element in the list.  The major advantage  of  a
        !           618:             splicing  macro over a normal macro is the abil-
        !           619:             ity of the splicing macro to return nothing. The
        !           620:             comment  character  (usually  ;)  is  a splicing
        !           621:             macro bound to a function which reads to the end
        !           622:             of the line and always returns nil.  Here is the
        !           623:             previous example written as a splicing macro
        !           624: 
        !           625: 
        !           626:     ____________________________________________________
        !           627: 
        !           628:     -> (_d_e_f_u_n _s_t_a_t_e_a_b_b_r_e_v _n_i_l
        !           629:           ((_l_a_m_b_d_a (_v_a_l_u_e)
        !           630:                (_c_o_n_d (_v_a_l_u_e (_l_i_s_t _v_a_l_u_e))
        !           631:                      (_t _n_i_l)))
        !           632:            (_c_d_r (_a_s_s_q (_r_e_a_d) '((_c_a_l_i_f_o_r_n_i_a . _c_a) (_p_e_n_n_s_y_l_v_a_n_i_a . _p_a))))))
        !           633:     -> (_s_e_t_s_y_n_t_a_x '! '_v_s_p_l_i_c_i_n_g-_m_a_c_r_o '_s_t_a_t_e_a_b_b_r_e_v)
        !           634:     -> '(!_p_e_n_n_s_y_l_v_a_n_i_a ! _f_o_o !_c_a_l_i_f_o_r_n_i_a)
        !           635:     (pa ca)
        !           636:     -> '!_f_o_o !_b_a_r !_p_e_n_n_s_y_l_v_a_n_i_a
        !           637:     pa
        !           638:     ->
        !           639:     ____________________________________________________
        !           640: 
        !           641: 
        !           642: 
        !           643: 
        !           644: 
        !           645: 
        !           646:          7.6.1.3.  Infix
        !           647: 
        !           648:                  Infix macros are passed  a  _c_o_n_c  structure
        !           649:             representing   what   has   been  read  so  far.
        !           650:             Briefly, a tconc structure is a single list cell
        !           651:             whose  car points to a list and whose cdr points
        !           652:             to  the  last  list  cell  in  that  list.   The
        !           653:             interpretation   by  the  reader  of  the  value
        !           654: 
        !           655: 
        !           656:                                    Printed: January 31, 1984
        !           657: 
        !           658: 
        !           659: 
        !           660: 
        !           661: 
        !           662: 
        !           663: 
        !           664: The Lisp Reader                                         7-11
        !           665: 
        !           666: 
        !           667:             returned by  an infix macro depends  on  whether
        !           668:             the  macro  is  called  while the reader is con-
        !           669:             structing a list or whether it is called at  the
        !           670:             top level of the reader.  If the macro is called
        !           671:             while a list  is  being  constructed,  then  the
        !           672:             value  returned  should  be   a tconc structure.
        !           673:             The car of that structure replaces the  list  of
        !           674:             elements  that  the  reader has been collecting.
        !           675:             If the macro is called at  top  level,  then  it
        !           676:             will  be  passed the value nil, and the value it
        !           677:             returns should either be nil or a  tconc  struc-
        !           678:             ture.   If the macro returns nil, then the value
        !           679:             is ignored and the reader continues to read.  If
        !           680:             the  macro returns a tconc structure of one ele-
        !           681:             ment (i.e. whose car is a list of one  element),
        !           682:             then  that  single  element  is  returned as the
        !           683:             value of _r_e_a_d.  If the  macro  returns  a  tconc
        !           684:             structure  of  more  than one element, then that
        !           685:             list of elements is returned  as  the  value  of
        !           686:             read.
        !           687: 
        !           688: 
        !           689:     ____________________________________________________
        !           690: 
        !           691:     -> (_d_e_f_u_n _p_l_u_s_o_p (_x)
        !           692:           (_c_o_n_d ((_n_u_l_l _x) (_t_c_o_n_c _n_i_l '_\+))
        !           693:                 (_t (_l_c_o_n_c _n_i_l (_l_i_s_t '_p_l_u_s (_c_a_a_r _x) (_r_e_a_d))))))
        !           694: 
        !           695:     plusop
        !           696:     -> (_s_e_t_s_y_n_t_a_x '_\+ '_v_i_n_f_i_x-_m_a_c_r_o '_p_l_u_s_o_p)
        !           697:     t
        !           698:     -> '(_a + _b)
        !           699:     (plus a b)
        !           700:     -> '+
        !           701:     |+|
        !           702:     ->
        !           703:     ____________________________________________________
        !           704: 
        !           705: 
        !           706: 
        !           707: 
        !           708: 
        !           709: 
        !           710:       7.6.2.  Invocations
        !           711: 
        !           712:               There are  three  different  circumstances  in
        !           713:          which  you  would like a macro function to be trig-
        !           714:          gered.
        !           715: 
        !           716:          _A_l_w_a_y_s -
        !           717:               Whenever the  macro  character  is  seen,  the
        !           718:               macro should be invoked.  This is accomplished
        !           719:               by  using  the   character   classes   _c_m_a_c_r_o,
        !           720: 
        !           721: 
        !           722:                                    Printed: January 31, 1984
        !           723: 
        !           724: 
        !           725: 
        !           726: 
        !           727: 
        !           728: 
        !           729: 
        !           730: The Lisp Reader                                         7-12
        !           731: 
        !           732: 
        !           733:               _c_s_p_l_i_c_i_n_g-_m_a_c_r_o, or _c_i_n_f_i_x-_m_a_c_r_o, and by using
        !           734:               the _s_e_p_a_r_a_t_o_r property.   The  syntax  classes
        !           735:               vmacro, vsplicing-macro, and vsingle-macro are
        !           736:               defined this way.
        !           737: 
        !           738:          _W_h_e_n _f_i_r_s_t -
        !           739:               The macro should only be  triggered  when  the
        !           740:               macro  character  is the first character found
        !           741:               after the scanning process.   A  syntax  class
        !           742:               for  a _w_h_e_n _f_i_r_s_t macro would be defined using
        !           743:               _c_m_a_c_r_o, _c_s_p_l_i_c_i_n_g-_m_a_c_r_o, or  _c_i_n_f_i_x-_m_a_c_r_o  and
        !           744:               not including the _s_e_p_a_r_a_t_o_r property.
        !           745: 
        !           746:          _W_h_e_n _u_n_i_q_u_e -
        !           747:               The macro should only be  triggered  when  the
        !           748:               macro  character  is  the  only character col-
        !           749:               lected in the token collection  phase  of  the
        !           750:               reader,  i.e  the macro character is preceeded
        !           751:               by zero or more _c_s_e_p_a_r_a_t_o_rs and followed by  a
        !           752:               _s_e_p_a_r_a_t_o_r.   A  syntax class for a _w_h_e_n _u_n_i_q_u_e
        !           753:               macro would be  defined  using  _c_s_i_n_g_l_e-_m_a_c_r_o,
        !           754:               _c_s_i_n_g_l_e-_s_p_l_i_c_i_n_g-_m_a_c_r_o, or _c_s_i_n_g_l_e-_i_n_f_i_x-_m_a_c_r_o
        !           755:               and not including the _s_e_p_a_r_a_t_o_r property.  The
        !           756:               syntax  classes  so defined are vsingle-macro,
        !           757:               vsingle-splicing-macro,   and   vsingle-infix-
        !           758:               macro.
        !           759: 
        !           760: 
        !           761: 
        !           762:    7.7.  Functions
        !           763: 
        !           764: (setsyntax 's_symbol 's_synclass ['ls_func])
        !           765: 
        !           766:      WHERE:   ls_func is the name of a function or a  lambda
        !           767:               body.
        !           768: 
        !           769:      RETURNS: t
        !           770: 
        !           771:      SIDE EFFECT: S_symbol should be a  symbol  whose  print
        !           772:                   name  is  only  one character.  The syntax
        !           773:                   class  for  that  character  is   set   to
        !           774:                   s_synclass  in  the current readtable.  If
        !           775:                   s_synclass is  a  class  that  requires  a
        !           776:                   character macro, then ls_func must be sup-
        !           777:                   plied.
        !           778: 
        !           779:      NOTE: The symbolic syntax codes are  new  to  Opus  38.
        !           780:            For  compatibility,  s_synclass can be one of the
        !           781:            fixnum syntax codes which appeared in older  ver-
        !           782:            sions of the FRANZ LISP Manual.  This compatibil-
        !           783:            ity is only temporary: existing code  which  uses
        !           784:            the fixnum syntax codes should be converted.
        !           785: 9
        !           786: 
        !           787: 9                                   Printed: January 31, 1984
        !           788: 
        !           789: 
        !           790: 
        !           791: 
        !           792: 
        !           793: 
        !           794: 
        !           795: The Lisp Reader                                         7-13
        !           796: 
        !           797: 
        !           798: (getsyntax 's_symbol)
        !           799: 
        !           800:      RETURNS: the syntax class of  the  first  character  of
        !           801:               s_symbol's  print name.  s_symbol's print name
        !           802:               must be exactly one character long.
        !           803: 
        !           804:      NOTE: This function is new to Opus 38.   It  supercedes
        !           805:            (_s_t_a_t_u_s _s_y_n_t_a_x) which no longer exists.
        !           806: 
        !           807: (add-syntax-class 's_synclass 'l_properties)
        !           808: 
        !           809:      RETURNS: s_synclass
        !           810: 
        !           811:      SIDE EFFECT: Defines the  syntax  class  s_synclass  to
        !           812:                   have  properties  l_properties.   The list
        !           813:                   l_properties should  contain  a  character
        !           814:                   classes mentioned above.  l_properties may
        !           815:                   contain  one  of  the  escape  properties:
        !           816:                   _e_s_c_a_p_e-_a_l_w_a_y_s,    _e_s_c_a_p_e-_w_h_e_n-_u_n_i_q_u_e,   or
        !           817:                   _e_s_c_a_p_e-_w_h_e_n-_f_i_r_s_t.  l_properties may  con-
        !           818:                   tain the _s_e_p_a_r_a_t_o_r property.  After a syn-
        !           819:                   tax  class  has  been  defined  with  _a_d_d-
        !           820:                   _s_y_n_t_a_x-_c_l_a_s_s,  the  _s_e_t_s_y_n_t_a_x function can
        !           821:                   be used to  give  characters  that  syntax
        !           822:                   class.
        !           823: 
        !           824: 
        !           825:     ____________________________________________________
        !           826: 
        !           827:     ; Define a non-separating macro character.
        !           828:     ; This type of macro character is used in UCI-Lisp, and
        !           829:     ; it corresponds to a  FIRST MACRO in Interlisp
        !           830:     -> (_a_d_d-_s_y_n_t_a_x-_c_l_a_s_s '_v_u_c_i-_m_a_c_r_o '(_c_m_a_c_r_o _e_s_c_a_p_e-_w_h_e_n-_f_i_r_s_t))
        !           831:     vuci-macro
        !           832:     ->
        !           833:     ____________________________________________________
        !           834: 
        !           835: 
        !           836: 
        !           837: 
        !           838: 
        !           839: 
        !           840: 
        !           841: 
        !           842: 
        !           843: 
        !           844: 
        !           845: 
        !           846: 
        !           847: 
        !           848: 
        !           849: 
        !           850: 9
        !           851: 
        !           852: 9                                   Printed: January 31, 1984
        !           853: 
        !           854: 
        !           855: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.