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

1.1     ! root        1: 
        !             2: 
        !             3: 
        !             4: 
        !             5: 
        !             6: 
        !             7: 
        !             8:                          CHAPTER  2
        !             9: 
        !            10: 
        !            11:                    Data Structure Access
        !            12: 
        !            13: 
        !            14: 
        !            15: 
        !            16:      The following functions allow one to create and manipu-
        !            17: late  the  various  types of lisp data structures.  Refer to
        !            18: 1.2 for details of the data structures known to FRANZ LISP.
        !            19: 
        !            20: 
        !            21: 
        !            22:    2.1.  Lists
        !            23: 
        !            24:            The following functions exist  for  the  creation
        !            25:       and  manipulating  of  lists.  Lists are composed of a
        !            26:       linked list of objects  called  either  'list  cells',
        !            27:       'cons cells' or 'dtpr cells'.  Lists are normally ter-
        !            28:       minated with the special symbol nil.  nil  is  both  a
        !            29:       symbol and a representation for the empty list ().
        !            30: 
        !            31: 
        !            32: 
        !            33:       2.1.1.  list creation
        !            34: 
        !            35: (cons 'g_arg1 'g_arg2)
        !            36: 
        !            37:      RETURNS: a new list cell whose car is g_arg1 and  whose
        !            38:               cdr is g_arg2.
        !            39: 
        !            40: (xcons 'g_arg1 'g_arg2)
        !            41: 
        !            42:      EQUIVALENT TO: (_c_o_n_s '_g__a_r_g_2 '_g__a_r_g_1)
        !            43: 
        !            44: (ncons 'g_arg)
        !            45: 
        !            46:      EQUIVALENT TO: (_c_o_n_s '_g__a_r_g _n_i_l)
        !            47: 
        !            48: (list ['g_arg1 ... ])
        !            49: 
        !            50:      RETURNS: a list whose elements are the g_arg_i.
        !            51: 
        !            52: 
        !            53: 
        !            54: 
        !            55: 
        !            56: 
        !            57: 
        !            58: 
        !            59: 
        !            60: 9
        !            61: 
        !            62: 9Data Structure Access                                    2-1
        !            63: 
        !            64: 
        !            65: 
        !            66: 
        !            67: 
        !            68: 
        !            69: 
        !            70: Data Structure Access                                    2-2
        !            71: 
        !            72: 
        !            73: (append 'l_arg1 'l_arg2)
        !            74: 
        !            75:      RETURNS: a list containing the elements of l_arg1  fol-
        !            76:               lowed by l_arg2.
        !            77: 
        !            78:      NOTE: To generate the result, the top level list  cells
        !            79:            of  l_arg1 are duplicated and the cdr of the last
        !            80:            list cell is set to point to l_arg2.   Thus  this
        !            81:            is  an  expensive  operation  if l_arg1 is large.
        !            82:            See the  descriptions  of  _n_c_o_n_c  and  _t_c_o_n_c  for
        !            83:            cheaper  ways  of  doing  the  _a_p_p_e_n_d if the list
        !            84:            l_arg1 can be altered.
        !            85: 
        !            86: (append1 'l_arg1 'g_arg2)
        !            87: 
        !            88:      RETURNS: a list like l_arg1 with  g_arg2  as  the  last
        !            89:               element.
        !            90: 
        !            91:      NOTE: this  is  equivalent  to  (append  'l_arg1  (list
        !            92:            'g_arg2)).
        !            93: 
        !            94: 
        !            95:     ____________________________________________________
        !            96: 
        !            97:     ; A common mistake is using append to add one element to the end of a list
        !            98:     -> (_a_p_p_e_n_d '(_a _b _c _d) '_e)
        !            99:     (a b c d . e)
        !           100:     ; The user intended to say:
        !           101:     -> (_a_p_p_e_n_d '(_a _b _c _d) '(_e))
        !           102:     (_a _b _c _d _e)
        !           103:     ; _b_e_t_t_e_r _i_s _a_p_p_e_n_d_1
        !           104:     -> (_a_p_p_e_n_d_1 '(_a _b _c _d) '_e)
        !           105:     (_a _b _c _d _e)
        !           106:     ____________________________________________________
        !           107: 
        !           108: 
        !           109: 
        !           110: 
        !           111: (quote! [g_qform_i] ...[! 'g_eform_i] ...  [!! 'l_form_i] ...)
        !           112: 
        !           113:      RETURNS: The list  resulting  from  the   splicing  and
        !           114:               insertion process described below.
        !           115: 
        !           116:      NOTE: _q_u_o_t_e!  is the complement of the  _l_i_s_t  function.
        !           117:            _l_i_s_t  forms  a list by evaluating each for in the
        !           118:            argument list; evaluation is  suppressed  if  the
        !           119:            form  is _q_u_o_t_eed.  In _q_u_o_t_e!, each form is impli-
        !           120:            citly _q_u_o_t_eed.  To be evaluated, a form  must  be
        !           121:            preceded  by one of the evaluate operations ! and
        !           122:            !!. ! g_eform evaluates g_form and the  value  is
        !           123:            inserted  in  the  place  of  the call; !! l_form
        !           124:            evaluates l_form and the value  is  spliced  into
        !           125:            the place of the call.
        !           126: 
        !           127: 
        !           128:                                    Printed: January 31, 1984
        !           129: 
        !           130: 
        !           131: 
        !           132: 
        !           133: 
        !           134: 
        !           135: 
        !           136: Data Structure Access                                    2-3
        !           137: 
        !           138: 
        !           139:            `Splicing in' means  that  the  parentheses  sur-
        !           140:            rounding  the  list  are  removed  as the example
        !           141:            below shows.  Use of the evaluate  operators  can
        !           142:            occur at any level in a form argument.
        !           143: 
        !           144:            Another way to get the effect of the _q_u_o_t_e! func-
        !           145:            tion is to use the backquote character macro (see
        !           146:             8.3.3).
        !           147: 
        !           148: 
        !           149:     ____________________________________________________
        !           150: 
        !           151:     (_q_u_o_t_e! _c_o_n_s ! (_c_o_n_s _1 _2) _3) = (_c_o_n_s (_1 . _2) _3)
        !           152:     (_q_u_o_t_e! _1 !! (_l_i_s_t _2 _3 _4) _5) = (_1 _2 _3 _4 _5)
        !           153:     (_s_e_t_q _q_u_o_t_e_d '_e_v_a_l_e_d)(_q_u_o_t_e! ! ((_I _a_m  ! _q_u_o_t_e_d))) = ((_I _a_m _e_v_a_l_e_d))
        !           154:     (_q_u_o_t_e! _t_r_y ! '(_t_h_i_s ! _o_n_e)) = (_t_r_y (_t_h_i_s ! _o_n_e))
        !           155:     ____________________________________________________
        !           156: 
        !           157: 
        !           158: 
        !           159: 
        !           160: 
        !           161: (bignum-to-list 'b_arg)
        !           162: 
        !           163:      RETURNS: A list  of  the  fixnums  which  are  used  to
        !           164:               represent the bignum.
        !           165: 
        !           166:      NOTE: the inverse of this function is _l_i_s_t-_t_o-_b_i_g_n_u_m.
        !           167: 
        !           168: (list-to-bignum 'l_ints)
        !           169: 
        !           170:      WHERE:   l_ints is a list of fixnums.
        !           171: 
        !           172:      RETURNS: a bignum constructed of the given fixnums.
        !           173: 
        !           174:      NOTE: the inverse of this function is _b_i_g_n_u_m-_t_o-_l_i_s_t.
        !           175: 
        !           176: 
        !           177: 
        !           178: 
        !           179:       2.1.2.  list predicates
        !           180: 
        !           181: 
        !           182: 
        !           183: 
        !           184: 
        !           185: 
        !           186: 
        !           187: 
        !           188: 
        !           189: 
        !           190: 
        !           191: 9
        !           192: 
        !           193: 9                                   Printed: January 31, 1984
        !           194: 
        !           195: 
        !           196: 
        !           197: 
        !           198: 
        !           199: 
        !           200: 
        !           201: Data Structure Access                                    2-4
        !           202: 
        !           203: 
        !           204: (dtpr 'g_arg)
        !           205: 
        !           206:      RETURNS: t iff g_arg is a list cell.
        !           207: 
        !           208:      NOTE: that (dtpr '()) is nil.  The name dtpr is a  con-
        !           209:            traction for ``dotted pair''.
        !           210: 
        !           211: (listp 'g_arg)
        !           212: 
        !           213:      RETURNS: t iff g_arg is a list object or nil.
        !           214: 
        !           215: (tailp 'l_x 'l_y)
        !           216: 
        !           217:      RETURNS: l_x, if a list cell _e_q  to  l_x  is  found  by
        !           218:               _c_d_ring down l_y zero or more times, nil other-
        !           219:               wise.
        !           220: 
        !           221: 
        !           222:     ____________________________________________________
        !           223: 
        !           224:     -> (_s_e_t_q _x '(_a _b _c _d) _y (_c_d_d_r _x))
        !           225:     (c d)
        !           226:     -> (_a_n_d (_d_t_p_r _x) (_l_i_s_t_p _x))     ; x and y are dtprs and lists
        !           227:     t
        !           228:     -> (_d_t_p_r '())           ; () is the same as nil and is not a dtpr
        !           229:     nil
        !           230:     -> (_l_i_s_t_p '())          ; however it is a list
        !           231:     t
        !           232:     -> (_t_a_i_l_p _y _x)
        !           233:     (c d)
        !           234:     ____________________________________________________
        !           235: 
        !           236: 
        !           237: 
        !           238: 
        !           239: (length 'l_arg)
        !           240: 
        !           241:      RETURNS: the number of elements in  the  top  level  of
        !           242:               list l_arg.
        !           243: 
        !           244: 
        !           245: 
        !           246:       2.1.3.  list accessing
        !           247: 
        !           248: 
        !           249: 
        !           250: 
        !           251: 
        !           252: 
        !           253: 
        !           254: 
        !           255: 
        !           256: 9
        !           257: 
        !           258: 9                                   Printed: January 31, 1984
        !           259: 
        !           260: 
        !           261: 
        !           262: 
        !           263: 
        !           264: 
        !           265: 
        !           266: Data Structure Access                                    2-5
        !           267: 
        !           268: 
        !           269: (car 'l_arg)
        !           270: (cdr 'l_arg)
        !           271: 
        !           272:      RETURNS: _c_o_n_s cell.  (_c_a_r (_c_o_n_s x y)) is always x, (_c_d_r
        !           273:               (_c_o_n_s  x  y)) is always y.  In FRANZ LISP, the
        !           274:               cdr portion is located first in memory.   This
        !           275:               is  hardly  noticeable, and we mention it pri-
        !           276:               marily as a curiosity.
        !           277: 
        !           278: (c..r 'lh_arg)
        !           279: 
        !           280:      WHERE:   the .. represents any positive number  of  a's
        !           281:               and d's.
        !           282: 
        !           283:      RETURNS: the result of accessing the list structure  in
        !           284:               the  way determined by the function name.  The
        !           285:               a's and d's are read from right to left,  a  d
        !           286:               directing  the access down the cdr part of the
        !           287:               list cell and an a down the car part.
        !           288: 
        !           289:      NOTE: lh_arg may also be nil, and it is guaranteed that
        !           290:            the  car  and  cdr of nil is nil.  If lh_arg is a
        !           291:            hunk,  then  (_c_a_r '_l_h__a_r_g)   is   the   same   as
        !           292:            (_c_x_r _1 '_l_h__a_r_g) and  (_c_d_r '_l_h__a_r_g) is the same as
        !           293:            (_c_x_r _0 '_l_h__a_r_g).
        !           294:            It is generally hard to read and  understand  the
        !           295:            context  of  functions  with large strings of a's
        !           296:            and d's, but these  functions  are  supported  by
        !           297:            rapid  accessing  and open-compiling (see Chapter
        !           298:            12).
        !           299: 
        !           300: (nth 'x_index 'l_list)
        !           301: 
        !           302:      RETURNS: the nth element of l_list, assuming zero-based
        !           303:               index.   Thus  (nth  0  l_list) is the same as
        !           304:               (car l_list).  _n_t_h is both a function,  and  a
        !           305:               compiler  macro,  so  that more efficient code
        !           306:               might be generated than for _n_t_h_e_l_e_m (described
        !           307:               below).
        !           308: 
        !           309:      NOTE: If x_arg1 is non-positive  or  greater  than  the
        !           310:            length of the list, nil is returned.
        !           311: 
        !           312: 
        !           313: 
        !           314: 
        !           315: 
        !           316: 
        !           317: 
        !           318: 
        !           319: 
        !           320: 
        !           321: 9
        !           322: 
        !           323: 9                                   Printed: January 31, 1984
        !           324: 
        !           325: 
        !           326: 
        !           327: 
        !           328: 
        !           329: 
        !           330: 
        !           331: Data Structure Access                                    2-6
        !           332: 
        !           333: 
        !           334: (nthcdr 'x_index 'l_list)
        !           335: 
        !           336:      RETURNS: the result of  _c_d_ring  down  the  list  l_list
        !           337:               x_index times.
        !           338: 
        !           339:      NOTE: If    x_index    is    less    than    0,    then
        !           340:            (_c_o_n_s _n_i_l '_l__l_i_s_t) is returned.
        !           341: 
        !           342: (nthelem 'x_arg1 'l_arg2)
        !           343: 
        !           344:      RETURNS: The x_arg1'_s_t element of the list l_arg2.
        !           345: 
        !           346:      NOTE: This function comes from the PDP-11 Lisp system.
        !           347: 
        !           348: (last 'l_arg)
        !           349: 
        !           350:      RETURNS: the last list cell in the list l_arg.
        !           351: 
        !           352:      EXAMPLE: _l_a_s_t does NOT return the  last  element  of  a
        !           353:               list!
        !           354:               (_l_a_s_t '(_a _b)) = (b)
        !           355: 
        !           356: (ldiff 'l_x 'l_y)
        !           357: 
        !           358:      RETURNS: a  list  of all elements in l_x but not in l_y
        !           359:               , i.e., the list difference of l_x and l_y.
        !           360: 
        !           361:      NOTE: l_y must be a tail of l_x, i.e., _e_q to the result
        !           362:            of  applying  some  number  of _c_d_r's to l_x. Note
        !           363:            that  the  value   of   _l_d_i_f_f   is   always   new
        !           364:            list  structure  unless l_y is nil, in which case
        !           365:            (_l_d_i_f_f _l__x _n_i_l) is l_x itself.  If l_y   is   not
        !           366:            a  tail  of  l_x, _l_d_i_f_f generates an error.
        !           367: 
        !           368:      EXAMPLE: (_l_d_i_f_f '_l__x (_m_e_m_b_e_r '_g__f_o_o  '_l__x))  gives  all
        !           369:               elements in l_x up to the first g_foo.
        !           370: 
        !           371: 
        !           372: 
        !           373:       2.1.4.  list manipulation
        !           374: 
        !           375: (rplaca 'lh_arg1 'g_arg2)
        !           376: 
        !           377:      RETURNS: the modified lh_arg1.
        !           378: 
        !           379:      SIDE EFFECT: the car of lh_arg1 is set to  g_arg2.   If
        !           380:                   lh_arg1  is a hunk then the second element
        !           381:                   of the hunk is set to g_arg2.
        !           382: 
        !           383: 
        !           384: 
        !           385: 
        !           386: 9
        !           387: 
        !           388: 9                                   Printed: January 31, 1984
        !           389: 
        !           390: 
        !           391: 
        !           392: 
        !           393: 
        !           394: 
        !           395: 
        !           396: Data Structure Access                                    2-7
        !           397: 
        !           398: 
        !           399: (rplacd 'lh_arg1 'g_arg2)
        !           400: 
        !           401:      RETURNS: the modified lh_arg1.
        !           402: 
        !           403:      SIDE EFFECT: the cdr of lh_arg2 is set to  g_arg2.   If
        !           404:                   lh_arg1  is  a hunk then the first element
        !           405:                   of the hunk is set to g_arg2.
        !           406: 
        !           407: 
        !           408: (attach 'g_x 'l_l)
        !           409: 
        !           410:      RETURNS: l_l whose _c_a_r is now g_x, whose  _c_a_d_r  is  the
        !           411:               original (_c_a_r _l__l), and whose _c_d_d_r is the ori-
        !           412:               ginal (_c_d_r _l__l).
        !           413: 
        !           414:      NOTE: what happens is that g_x is added to  the  begin-
        !           415:            ning  of  list l_l  yet maintaining the same list
        !           416:            cell  at the beginning of the list.
        !           417: 
        !           418: (delete 'g_val 'l_list ['x_count])
        !           419: 
        !           420:      RETURNS: the result of  splicing  g_val  from  the  top
        !           421:               level of l_list no more than x_count times.
        !           422: 
        !           423:      NOTE: x_count defaults to a very large number, thus  if
        !           424:            x_count  is  not  given, all occurrences of g_val
        !           425:            are removed from the top level of l_list.   g_val
        !           426:            is compared with successive _c_a_r's of l_list using
        !           427:            the function _e_q_u_a_l.
        !           428: 
        !           429:      SIDE EFFECT: l_list is modified using  rplacd,  no  new
        !           430:                   list cells are used.
        !           431: 
        !           432: (delq 'g_val 'l_list ['x_count])
        !           433: (dremove 'g_val 'l_list ['x_count])
        !           434: 
        !           435:      RETURNS: the result of  splicing  g_val  from  the  top
        !           436:               level of l_list no more than x_count times.
        !           437: 
        !           438:      NOTE: _d_e_l_q (and _d_r_e_m_o_v_e) are the same as _d_e_l_e_t_e  except
        !           439:            that _e_q is used for comparison instead of _e_q_u_a_l.
        !           440: 
        !           441: 
        !           442: 
        !           443: 
        !           444: 
        !           445: 
        !           446: 
        !           447: 
        !           448: 
        !           449: 
        !           450: 
        !           451: 9
        !           452: 
        !           453: 9                                   Printed: January 31, 1984
        !           454: 
        !           455: 
        !           456: 
        !           457: 
        !           458: 
        !           459: 
        !           460: 
        !           461: Data Structure Access                                    2-8
        !           462: 
        !           463: 
        !           464: 
        !           465:     ____________________________________________________
        !           466: 
        !           467:     ; note that you should use the value returned by _d_e_l_e_t_e or _d_e_l_q
        !           468:     ; and not assume that g_val will always show the deletions.
        !           469:     ; For example
        !           470: 
        !           471:     -> (_s_e_t_q _t_e_s_t '(_a _b _c _a _d _e))
        !           472:     (a b c a d e)
        !           473:     -> (_d_e_l_e_t_e '_a _t_e_s_t)
        !           474:     (b c d e)         ; the value returned is what we would expect
        !           475:     -> _t_e_s_t
        !           476:     (a b c d e)       ; but test still has the first a in the list!
        !           477:     ____________________________________________________
        !           478: 
        !           479: 
        !           480: 
        !           481: 
        !           482: (remq 'g_x 'l_l ['x_count])
        !           483: (remove 'g_x 'l_l)
        !           484: 
        !           485:      RETURNS: a _c_o_p_y of l_l  with  all  top  level  elements
        !           486:               _e_q_u_a_l to g_x removed.  _r_e_m_q uses _e_q instead of
        !           487:               _e_q_u_a_l for comparisons.
        !           488: 
        !           489:      NOTE: remove does not modify its arguments like _d_e_l_e_t_e,
        !           490:            and _d_e_l_q do.
        !           491: 
        !           492: (insert 'g_object 'l_list 'u_comparefn 'g_nodups)
        !           493: 
        !           494:      RETURNS: a list consisting of l_list with g_object des-
        !           495:               tructively  inserted  in a place determined by
        !           496:               the ordering function u_comparefn.
        !           497: 
        !           498:      NOTE: (_c_o_m_p_a_r_e_f_n '_g__x  '_g__y)  should  return  something
        !           499:            non-nil  if  g_x can precede g_y in sorted order,
        !           500:            nil if g_y must precede g_x.  If  u_comparefn  is
        !           501:            nil, alphabetical order will be used. If g_nodups
        !           502:            is non-nil, an element will not be inserted if an
        !           503:            equal  element  is  already  in the list.  _i_n_s_e_r_t
        !           504:            does binary search to determine where  to  insert
        !           505:            the new element.
        !           506: 
        !           507: 
        !           508: 
        !           509: 
        !           510: 
        !           511: 
        !           512: 
        !           513: 
        !           514: 
        !           515: 
        !           516: 9
        !           517: 
        !           518: 9                                   Printed: January 31, 1984
        !           519: 
        !           520: 
        !           521: 
        !           522: 
        !           523: 
        !           524: 
        !           525: 
        !           526: Data Structure Access                                    2-9
        !           527: 
        !           528: 
        !           529: (merge 'l_data1 'l_data2 'u_comparefn)
        !           530: 
        !           531:      RETURNS: the merged list of the two input sorted  lists
        !           532:               l_data1  and  l_data1  using binary comparison
        !           533:               function u_comparefn.
        !           534: 
        !           535:      NOTE: (_c_o_m_p_a_r_e_f_n '_g__x  '_g__y)  should  return  something
        !           536:            non-nil  if  g_x can precede g_y in sorted order,
        !           537:            nil if g_y must precede g_x.  If  u_comparefn  is
        !           538:            nil,    alphabetical    order   will   be   used.
        !           539:            u_comparefn should be thought of as "less than or
        !           540:            equal".   _m_e_r_g_e  changes  both  of its data argu-
        !           541:            ments.
        !           542: 
        !           543: (subst 'g_x 'g_y 'l_s)
        !           544: (dsubst 'g_x 'g_y 'l_s)
        !           545: 
        !           546:      RETURNS: the result of substituting g_x for  all  _e_q_u_a_l
        !           547:               occurrences of g_y  at all levels in l_s.
        !           548: 
        !           549:      NOTE: If g_y is a symbol, _e_q will be used for comparis-
        !           550:            ons.   The function _s_u_b_s_t does not modify l_s but
        !           551:            the function  _d_s_u_b_s_t  (destructive  substitution)
        !           552:            does.
        !           553: 
        !           554: (lsubst 'l_x 'g_y 'l_s)
        !           555: 
        !           556:      RETURNS: a copy of l_s  with l_x spliced in  for  every
        !           557:               occurrence  of  of g_y at all levels. Splicing
        !           558:               in means that the parentheses surrounding  the
        !           559:               list  l_x  are  removed  as  the example below
        !           560:               shows.
        !           561: 
        !           562: 
        !           563:     ____________________________________________________
        !           564: 
        !           565:     -> (_s_u_b_s_t '(_a _b _c) '_x '(_x _y _z (_x _y _z) (_x _y _z)))
        !           566:     ((a b c) y z ((a b c) y z) ((a b c) y z))
        !           567:     -> (_l_s_u_b_s_t '(_a _b _c) '_x '(_x _y _z (_x _y _z) (_x _y _z)))
        !           568:     (a b c y z (a b c y z) (a b c y z))
        !           569:     ____________________________________________________
        !           570: 
        !           571: 
        !           572: 
        !           573: 
        !           574: 
        !           575: 
        !           576: 
        !           577: 
        !           578: 
        !           579: 
        !           580: 
        !           581: 9
        !           582: 
        !           583: 9                                   Printed: January 31, 1984
        !           584: 
        !           585: 
        !           586: 
        !           587: 
        !           588: 
        !           589: 
        !           590: 
        !           591: Data Structure Access                                   2-10
        !           592: 
        !           593: 
        !           594: (subpair 'l_old 'l_new 'l_expr)
        !           595: 
        !           596:      WHERE:   there are  the  same  number  of  elements  in
        !           597:               l_old as l_new.
        !           598: 
        !           599:      RETURNS: the list l_expr  with  all  occurrences  of  a
        !           600:               object  in l_old replaced by the corresponding
        !           601:               one in l_new.  When a substitution is made,  a
        !           602:               copy  of  the  value  to  substitute in is not
        !           603:               made.
        !           604: 
        !           605:      EXAMPLE: (_s_u_b_p_a_i_r '(_a _c)' (_x _y) '(_a _b _c _d)) = (_x _b _y _d)
        !           606: 
        !           607: 
        !           608: (nconc 'l_arg1 'l_arg2 ['l_arg3 ...])
        !           609: 
        !           610:      RETURNS: A list consisting of the  elements  of  l_arg1
        !           611:               followed by the elements of l_arg2 followed by
        !           612:               l_arg3 and so on.
        !           613: 
        !           614:      NOTE: The _c_d_r of  the  last  list  cell  of  l_arg_i  is
        !           615:            changed to point to l_arg_i+_1.
        !           616: 
        !           617: 
        !           618:     ____________________________________________________
        !           619: 
        !           620:     ; _n_c_o_n_c is faster than _a_p_p_e_n_d because it doesn't allocate new list cells.
        !           621:     -> (_s_e_t_q _l_i_s_1 '(_a _b _c))
        !           622:     (a b c)
        !           623:     -> (_s_e_t_q _l_i_s_2 '(_d _e _f))
        !           624:     (d e f)
        !           625:     -> (_a_p_p_e_n_d _l_i_s_1 _l_i_s_2)
        !           626:     (a b c d e f)
        !           627:     -> _l_i_s_1
        !           628:     (a b c)       ; note that lis1 has not been changed by _a_p_p_e_n_d
        !           629:     -> (_n_c_o_n_c _l_i_s_1 _l_i_s_2)
        !           630:     (a b c d e f) ; _n_c_o_n_c returns the same value as _a_p_p_e_n_d
        !           631:     -> _l_i_s_1
        !           632:     (a b c d e f) ; but in doing so alters lis1
        !           633:     ____________________________________________________
        !           634: 
        !           635: 
        !           636: 
        !           637: 
        !           638: 
        !           639: 
        !           640: 
        !           641: 
        !           642: 
        !           643: 
        !           644: 
        !           645: 
        !           646: 9
        !           647: 
        !           648: 9                                   Printed: January 31, 1984
        !           649: 
        !           650: 
        !           651: 
        !           652: 
        !           653: 
        !           654: 
        !           655: 
        !           656: Data Structure Access                                   2-11
        !           657: 
        !           658: 
        !           659: (reverse 'l_arg)
        !           660: (nreverse 'l_arg)
        !           661: 
        !           662:      RETURNS: the list l_arg with the elements  at  the  top
        !           663:               level in reverse  order.
        !           664: 
        !           665:      NOTE: The function _n_r_e_v_e_r_s_e does the reversal in place,
        !           666:            that is the list structure is modified.
        !           667: 
        !           668: (nreconc 'l_arg 'g_arg)
        !           669: 
        !           670:      EQUIVALENT TO: (_n_c_o_n_c (_n_r_e_v_e_r_s_e '_l__a_r_g) '_g__a_r_g)
        !           671: 
        !           672: 
        !           673: 
        !           674: 
        !           675:    2.2.  Predicates
        !           676: 
        !           677:            The following functions test  for  properties  of
        !           678:       data  objects.  When  the result of the test is either
        !           679:       'false' or 'true',  then  nil  will  be  returned  for
        !           680:       'false' and something other than nil (often t) will be
        !           681:       returned for 'true'.
        !           682: 
        !           683: (arrayp 'g_arg)
        !           684: 
        !           685:      RETURNS: t iff g_arg is of type array.
        !           686: 
        !           687: (atom 'g_arg)
        !           688: 
        !           689:      RETURNS: t iff g_arg is not a list or hunk object.
        !           690: 
        !           691:      NOTE: (_a_t_o_m '()) returns t.
        !           692: 
        !           693: (bcdp 'g_arg)
        !           694: 
        !           695:      RETURNS: t iff g_arg is a data object of type binary.
        !           696: 
        !           697:      NOTE: This function is a throwback to the  PDP-11  Lisp
        !           698:            system.   The  name stands for binary code predi-
        !           699:            cate.
        !           700: 
        !           701: 
        !           702: 
        !           703: 
        !           704: 
        !           705: 
        !           706: 
        !           707: 
        !           708: 
        !           709: 
        !           710: 
        !           711: 9
        !           712: 
        !           713: 9                                   Printed: January 31, 1984
        !           714: 
        !           715: 
        !           716: 
        !           717: 
        !           718: 
        !           719: 
        !           720: 
        !           721: Data Structure Access                                   2-12
        !           722: 
        !           723: 
        !           724: (bigp 'g_arg)
        !           725: 
        !           726:      RETURNS: t iff g_arg is a bignum.
        !           727: 
        !           728: (dtpr 'g_arg)
        !           729: 
        !           730:      RETURNS: t iff g_arg is a list cell.
        !           731: 
        !           732:      NOTE: that (dtpr '()) is nil.
        !           733: 
        !           734: (hunkp 'g_arg)
        !           735: 
        !           736:      RETURNS: t iff g_arg is a hunk.
        !           737: 
        !           738: (listp 'g_arg)
        !           739: 
        !           740:      RETURNS: t iff g_arg is a list object or nil.
        !           741: 
        !           742: (stringp 'g_arg)
        !           743: 
        !           744:      RETURNS: t iff g_arg is a string.
        !           745: 
        !           746: (symbolp 'g_arg)
        !           747: 
        !           748:      RETURNS: t iff g_arg is a symbol.
        !           749: 
        !           750: (valuep 'g_arg)
        !           751: 
        !           752:      RETURNS: t iff g_arg is a value cell
        !           753: 
        !           754: (vectorp 'v_vector)
        !           755: 
        !           756:      RETURNS: t iff the argument is a vector.
        !           757: 
        !           758: (vectorip 'v_vector)
        !           759: 
        !           760:      RETURNS: t iff the argument is an immediate-vector.
        !           761: 
        !           762: (type 'g_arg)
        !           763: (typep 'g_arg)
        !           764: 
        !           765:      RETURNS: a symbol whose pname  describes  the  type  of
        !           766:               g_arg.
        !           767: 
        !           768: 
        !           769: 
        !           770: 
        !           771: 
        !           772: 
        !           773: 
        !           774: 
        !           775: 
        !           776: 9
        !           777: 
        !           778: 9                                   Printed: January 31, 1984
        !           779: 
        !           780: 
        !           781: 
        !           782: 
        !           783: 
        !           784: 
        !           785: 
        !           786: Data Structure Access                                   2-13
        !           787: 
        !           788: 
        !           789: (signp s_test 'g_val)
        !           790: 
        !           791:      RETURNS: t iff g_val is a number  and  the  given  test
        !           792:               s_test on g_val returns true.
        !           793: 
        !           794:      NOTE: The fact that _s_i_g_n_p simply returns nil  if  g_val
        !           795:            is  not  a  number is probably the most important
        !           796:            reason that _s_i_g_n_p is used.  The permitted  values
        !           797:            for  s_test  and what they mean are given in this
        !           798:            table.
        !           799: 
        !           800: 8                         ____________________
        !           801:                           s_test   tested
        !           802: 
        !           803: 8                         ________________________________________
        !           804:                           l        g_val < 0
        !           805:                           le       g_val <_ 0
        !           806:                           e        g_val = 0
        !           807:                           n        g_val =/ 0
        !           808:                           ge       g_val >_ 0
        !           809:                           g        g_val > 0
        !           810: 8                         ____________________
        !           811: 7                        |7|7|7|7|7|7|7|7|
        !           812: 
        !           813: 
        !           814: 
        !           815: 
        !           816: 
        !           817: 
        !           818: 
        !           819:                                             |7|7|7|7|7|7|7|7|
        !           820: 
        !           821: 
        !           822: 
        !           823: 
        !           824: 
        !           825: 
        !           826: 
        !           827: 
        !           828: 
        !           829: 
        !           830: (eq 'g_arg1 'g_arg2)
        !           831: 
        !           832:      RETURNS: t if g_arg1 and g_arg2 are the exact same lisp
        !           833:               object.
        !           834: 
        !           835:      NOTE: _E_q simply tests if g_arg1 and g_arg2 are  located
        !           836:            in  the exact same place in memory.  Lisp objects
        !           837:            which print the same are not necessarily _e_q.  The
        !           838:            only  objects  guaranteed  to  be _e_q are interned
        !           839:            symbols with the same print name.  [Unless a sym-
        !           840:            bol  is  created  in  a special way (such as with
        !           841:            _u_c_o_n_c_a_t or _m_a_k_n_a_m) it will be interned.]
        !           842: 
        !           843: (neq 'g_x 'g_y)
        !           844: 
        !           845:      RETURNS: t if g_x is not _e_q to g_y, otherwise nil.
        !           846: 
        !           847: (equal 'g_arg1 'g_arg2)
        !           848: (eqstr 'g_arg1 'g_arg2)
        !           849: 
        !           850:      RETURNS: t iff g_arg1 and g_arg2 have the  same  struc-
        !           851:               ture as described below.
        !           852: 
        !           853:      NOTE: g_arg and g_arg2 are _e_q_u_a_l if
        !           854: 
        !           855:      (1)  they are _e_q.
        !           856: 
        !           857:      (2)  they are both fixnums with the same value
        !           858: 
        !           859: 
        !           860: 
        !           861: 
        !           862: 9                                   Printed: January 31, 1984
        !           863: 
        !           864: 
        !           865: 
        !           866: 
        !           867: 
        !           868: 
        !           869: 
        !           870: Data Structure Access                                   2-14
        !           871: 
        !           872: 
        !           873:      (3)  they are both flonums with the same value
        !           874: 
        !           875:      (4)  they are both bignums with the same value
        !           876: 
        !           877:      (5)  they are both strings and are identical.
        !           878: 
        !           879:      (6)  they are both lists and their cars  and  cdrs  are
        !           880:           _e_q_u_a_l.
        !           881: 
        !           882: 
        !           883:     ____________________________________________________
        !           884: 
        !           885:     ; _e_q is much faster than _e_q_u_a_l, especially in compiled code,
        !           886:     ; however you cannot use _e_q to test for equality of numbers outside
        !           887:     ; of the range -1024 to 1023.  _e_q_u_a_l will always work.
        !           888:     -> (_e_q _1_0_2_3 _1_0_2_3)
        !           889:     t
        !           890:     -> (_e_q _1_0_2_4 _1_0_2_4)
        !           891:     nil
        !           892:     -> (_e_q_u_a_l _1_0_2_4 _1_0_2_4)
        !           893:     t
        !           894:     ____________________________________________________
        !           895: 
        !           896: 
        !           897: 
        !           898: 
        !           899: 
        !           900: (not 'g_arg)
        !           901: (null 'g_arg)
        !           902: 
        !           903:      RETURNS: t iff g_arg is nil.
        !           904: 
        !           905: 
        !           906: (member 'g_arg1 'l_arg2)
        !           907: (memq 'g_arg1 'l_arg2)
        !           908: 
        !           909:      RETURNS: that part of the  l_arg2  beginning  with  the
        !           910:               first  occurrence of g_arg1.  If g_arg1 is not
        !           911:               in the top level of l_arg2, nil is returned.
        !           912: 
        !           913:      NOTE: _m_e_m_b_e_r tests for equality with _e_q_u_a_l, _m_e_m_q  tests
        !           914:            for equality with _e_q.
        !           915: 
        !           916: 
        !           917: 
        !           918: 
        !           919:    2.3.  Symbols and Strings
        !           920: 
        !           921:            In many of the following functions  the  distinc-
        !           922:       tion  between symbols and strings is somewhat blurred.
        !           923:       To remind ourselves of the difference, a string  is  a
        !           924:       null terminated sequence of characters, stored as com-
        !           925:       pactly as possible.  Strings are used as constants  in
        !           926: 
        !           927: 
        !           928:                                    Printed: January 31, 1984
        !           929: 
        !           930: 
        !           931: 
        !           932: 
        !           933: 
        !           934: 
        !           935: 
        !           936: Data Structure Access                                   2-15
        !           937: 
        !           938: 
        !           939:       FRANZ  LISP.   They  _e_v_a_l to themselves.  A symbol has
        !           940:       additional structure: a value, property list, function
        !           941:       binding,  as  well  as its external representation (or
        !           942:       print-name).  If a symbol  is  given  to  one  of  the
        !           943:       string  manipulation  functions  below, its print name
        !           944:       will be used as the string.
        !           945: 
        !           946:            Another popular way to represent strings in  Lisp
        !           947:       is  as  a  list of fixnums which represent characters.
        !           948:       The suffix 'n' to a string manipulation function indi-
        !           949:       cates that it returns a string in this form.
        !           950: 
        !           951: 
        !           952: 
        !           953:       2.3.1.  symbol and string creation
        !           954: 
        !           955: (concat ['stn_arg1 ... ])
        !           956: (uconcat ['stn_arg1 ... ])
        !           957: 
        !           958:      RETURNS: a symbol whose print name  is  the  result  of
        !           959:               concatenating  the print names, string charac-
        !           960:               ters  or  numerical  representations  of   the
        !           961:               sn_arg_i.
        !           962: 
        !           963:      NOTE: If no arguments are given, a symbol with  a  null
        !           964:            pname  is  returned.   _c_o_n_c_a_t  places  the symbol
        !           965:            created on the oblist, the function _u_c_o_n_c_a_t  does
        !           966:            the  same thing but does not place the new symbol
        !           967:            on the oblist.
        !           968: 
        !           969:      EXAMPLE: (_c_o_n_c_a_t '_a_b_c (_a_d_d _3 _4) "_d_e_f") = abc7def
        !           970: 
        !           971: (concatl 'l_arg)
        !           972: 
        !           973:      EQUIVALENT TO: (_a_p_p_l_y '_c_o_n_c_a_t '_l__a_r_g)
        !           974: 
        !           975: 
        !           976: (implode 'l_arg)
        !           977: (maknam 'l_arg)
        !           978: 
        !           979:      WHERE:   l_arg is a list of symbols, strings and  small
        !           980:               fixnums.
        !           981: 
        !           982:      RETURNS: The symbol whose print name is the  result  of
        !           983:               concatenating  the  first  characters  of  the
        !           984:               print names of the symbols and strings in  the
        !           985:               list.    Any  fixnums  are  converted  to  the
        !           986:               equivalent ascii character.  In order to  con-
        !           987:               catenate  entire  strings  or print names, use
        !           988:               the function _c_o_n_c_a_t.
        !           989: 
        !           990:      NOTE: _i_m_p_l_o_d_e interns the  symbol  it  creates,  _m_a_k_n_a_m
        !           991:            does not.
        !           992: 
        !           993: 
        !           994:                                    Printed: January 31, 1984
        !           995: 
        !           996: 
        !           997: 
        !           998: 
        !           999: 
        !          1000: 
        !          1001: 
        !          1002: Data Structure Access                                   2-16
        !          1003: 
        !          1004: 
        !          1005: (gensym ['s_leader])
        !          1006: 
        !          1007:      RETURNS: a new uninterned atom beginning with the first
        !          1008:               character  of  s_leader's  pname, or beginning
        !          1009:               with g if s_leader is not given.
        !          1010: 
        !          1011:      NOTE: The  symbol  looks  like  x0nnnnn  where   x   is
        !          1012:            s_leader's  first  character  and  nnnnn  is  the
        !          1013:            number of times you have called gensym.
        !          1014: 
        !          1015: (copysymbol 's_arg 'g_pred)
        !          1016: 
        !          1017:      RETURNS: an uninterned symbol with the same print  name
        !          1018:               as  s_arg.   If  g_pred  is  non nil, then the
        !          1019:               value, function binding and property  list  of
        !          1020:               the new symbol are made _e_q to those of s_arg.
        !          1021: 
        !          1022: 
        !          1023: (ascii 'x_charnum)
        !          1024: 
        !          1025:      WHERE:   x_charnum is between 0 and 255.
        !          1026: 
        !          1027:      RETURNS: a symbol whose print name is the single  char-
        !          1028:               acter    whose    fixnum   representation   is
        !          1029:               x_charnum.
        !          1030: 
        !          1031: 
        !          1032: (intern 's_arg)
        !          1033: 
        !          1034:      RETURNS: s_arg
        !          1035: 
        !          1036:      SIDE EFFECT: s_arg is put on the oblist if  it  is  not
        !          1037:                   already there.
        !          1038: 
        !          1039: (remob 's_symbol)
        !          1040: 
        !          1041:      RETURNS: s_symbol
        !          1042: 
        !          1043:      SIDE EFFECT: s_symbol is removed from the oblist.
        !          1044: 
        !          1045: (rematom 's_arg)
        !          1046: 
        !          1047:      RETURNS: t if s_arg is indeed an atom.
        !          1048: 
        !          1049:      SIDE EFFECT: s_arg is  put  on  the  free  atoms  list,
        !          1050:                   effectively reclaiming an atom cell.
        !          1051: 
        !          1052:      NOTE: This function does _n_o_t check to see if  s_arg  is
        !          1053:            on  the  oblist  or is referenced anywhere.  Thus
        !          1054:            calling _r_e_m_a_t_o_m on an  atom  in  the  oblist  may
        !          1055:            result in disaster when that atom cell is reused!
        !          1056: 
        !          1057: 9
        !          1058: 
        !          1059: 9                                   Printed: January 31, 1984
        !          1060: 
        !          1061: 
        !          1062: 
        !          1063: 
        !          1064: 
        !          1065: 
        !          1066: 
        !          1067: Data Structure Access                                   2-17
        !          1068: 
        !          1069: 
        !          1070:       2.3.2.  string and symbol predicates
        !          1071: 
        !          1072: (boundp 's_name)
        !          1073: 
        !          1074:      RETURNS: nil  if s_name is unbound:  that  is,  it  has
        !          1075:               never  been  given a value.  If x_name has the
        !          1076:               value g_val, then (nil . g_val)  is  returned.
        !          1077:               See also _m_a_k_u_n_b_o_u_n_d.
        !          1078: 
        !          1079: (alphalessp 'st_arg1 'st_arg2)
        !          1080: 
        !          1081:      RETURNS: t iff the `name' of st_arg1 is  alphabetically
        !          1082:               less  than the name of st_arg2. If st_arg is a
        !          1083:               symbol then its `name' is its print name.   If
        !          1084:               st_arg  is  a  string,  then its `name' is the
        !          1085:               string itself.
        !          1086: 
        !          1087: 
        !          1088: 
        !          1089:       2.3.3.  symbol and string accessing
        !          1090: 
        !          1091: (symeval 's_arg)
        !          1092: 
        !          1093:      RETURNS: the value of symbol s_arg.
        !          1094: 
        !          1095:      NOTE: It is illegal to ask for the value of an  unbound
        !          1096:            symbol.   This  function  has  the same effect as
        !          1097:            _e_v_a_l, but compiles into much more efficient code.
        !          1098: 
        !          1099: (get_pname 's_arg)
        !          1100: 
        !          1101:      RETURNS: the string which is the print name of s_arg.
        !          1102: 
        !          1103: (plist 's_arg)
        !          1104: 
        !          1105:      RETURNS: the property list of s_arg.
        !          1106: 
        !          1107: (getd 's_arg)
        !          1108: 
        !          1109:      RETURNS: the function definition of  s_arg  or  nil  if
        !          1110:               there is no function definition.
        !          1111: 
        !          1112:      NOTE: the function definition may turn  out  to  be  an
        !          1113:            array header.
        !          1114: 
        !          1115: 
        !          1116: 
        !          1117: 
        !          1118: 
        !          1119: 
        !          1120: 
        !          1121: 
        !          1122: 9
        !          1123: 
        !          1124: 9                                   Printed: January 31, 1984
        !          1125: 
        !          1126: 
        !          1127: 
        !          1128: 
        !          1129: 
        !          1130: 
        !          1131: 
        !          1132: Data Structure Access                                   2-18
        !          1133: 
        !          1134: 
        !          1135: (getchar 's_arg 'x_index)
        !          1136: (nthchar 's_arg 'x_index)
        !          1137: (getcharn 's_arg 'x_index)
        !          1138: 
        !          1139:      RETURNS: the x_index_t_h character of the print  name  of
        !          1140:               s_arg  or  nil  if  x_index  is less than 1 or
        !          1141:               greater than the length of s_arg's print name.
        !          1142: 
        !          1143:      NOTE: _g_e_t_c_h_a_r and _n_t_h_c_h_a_r return a symbol with a single
        !          1144:            character print name, _g_e_t_c_h_a_r_n returns the fixnum
        !          1145:            representation of the character.
        !          1146: 
        !          1147: (substring 'st_string 'x_index ['x_length])
        !          1148: (substringn 'st_string 'x_index ['x_length])
        !          1149: 
        !          1150:      RETURNS: a string of length at most  x_length  starting
        !          1151:               at x_index_t_h character in the string.
        !          1152: 
        !          1153:      NOTE: If x_length is not given, all of  the  characters
        !          1154:            for   x_index  to  the  end  of  the  string  are
        !          1155:            returned.  If  x_index  is  negative  the  string
        !          1156:            begins  at  the x_index_t_h character from the end.
        !          1157:            If x_index is out of bounds, nil is returned.
        !          1158: 
        !          1159:      NOTE: _s_u_b_s_t_r_i_n_g returns a list of  symbols,  _s_u_b_s_t_r_i_n_g_n
        !          1160:            returns  a  list  of  fixnums.   If _s_u_b_s_t_r_i_n_g_n is
        !          1161:            given a 0 x_length argument then a single  fixnum
        !          1162:            which is the x_index_t_h character is returned.
        !          1163: 
        !          1164: 
        !          1165: 
        !          1166:       2.3.4.  symbol and string manipulation
        !          1167: 
        !          1168: (set 's_arg1 'g_arg2)
        !          1169: 
        !          1170:      RETURNS: g_arg2.
        !          1171: 
        !          1172:      SIDE EFFECT: the value of s_arg1 is set to g_arg2.
        !          1173: 
        !          1174: (setq s_atm1 'g_val1 [ s_atm2 'g_val2 ... ... ])
        !          1175: 
        !          1176:      WHERE:   the arguments are  pairs  of  atom  names  and
        !          1177:               expressions.
        !          1178: 
        !          1179:      RETURNS: the last g_val_i.
        !          1180: 
        !          1181:      SIDE EFFECT: each s_atm_i  is  set  to  have  the  value
        !          1182:                   g_val_i.
        !          1183: 
        !          1184:      NOTE: _s_e_t evaluates all of its arguments, _s_e_t_q does not
        !          1185:            evaluate the s_atm_i.
        !          1186: 
        !          1187: 9
        !          1188: 
        !          1189: 9                                   Printed: January 31, 1984
        !          1190: 
        !          1191: 
        !          1192: 
        !          1193: 
        !          1194: 
        !          1195: 
        !          1196: 
        !          1197: Data Structure Access                                   2-19
        !          1198: 
        !          1199: 
        !          1200: (desetq sl_pattern1 'g_exp1 [... ...])
        !          1201: 
        !          1202:      RETURNS: g_expn
        !          1203: 
        !          1204:      SIDE EFFECT: This  acts  just  like  _s_e_t_q  if  all  the
        !          1205:                   sl_pattern_i  are  symbols.  If sl_pattern_i
        !          1206:                   is a list then it   is  a  template  which
        !          1207:                   should  have  the same structure as g_exp_i
        !          1208:                   The symbols in sl_pattern are assigned  to
        !          1209:                   the  corresponding  parts  of g_exp.  (See
        !          1210:                   also _s_e_t_f )
        !          1211: 
        !          1212:      EXAMPLE: (_d_e_s_e_t_q (_a _b (_c . _d)) '(_1 _2 (_3 _4 _5)))
        !          1213:               sets a to 1, b to 2, c to 3, and d to (4 5).
        !          1214: 
        !          1215: 
        !          1216: (setplist 's_atm 'l_plist)
        !          1217: 
        !          1218:      RETURNS: l_plist.
        !          1219: 
        !          1220:      SIDE EFFECT: the property  list  of  s_atm  is  set  to
        !          1221:                   l_plist.
        !          1222: 
        !          1223: (makunbound 's_arg)
        !          1224: 
        !          1225:      RETURNS: s_arg
        !          1226: 
        !          1227:      SIDE EFFECT: the value of s_arg is made `unbound'.   If
        !          1228:                   the interpreter attempts to evaluate s_arg
        !          1229:                   before it  is  again  given  a  value,  an
        !          1230:                   unbound variable error will occur.
        !          1231: 
        !          1232: (aexplode 's_arg)
        !          1233: (explode 'g_arg)
        !          1234: (aexplodec 's_arg)
        !          1235: (explodec 'g_arg)
        !          1236: (aexploden 's_arg)
        !          1237: (exploden 'g_arg)
        !          1238: 
        !          1239:      RETURNS: a list of the characters  used  to  print  out
        !          1240:               s_arg or g_arg.
        !          1241: 
        !          1242:      NOTE: The functions beginning  with  'a'  are  internal
        !          1243:            functions  which are limited to symbol arguments.
        !          1244:            The functions _a_e_x_p_l_o_d_e and _e_x_p_l_o_d_e return a  list
        !          1245:            of  characters which _p_r_i_n_t would use to print the
        !          1246:            argument. These characters include all  necessary
        !          1247:            escape   characters.    Functions  _a_e_x_p_l_o_d_e_c  and
        !          1248:            _e_x_p_l_o_d_e_c return a list of characters which  _p_a_t_o_m
        !          1249:            would  use  to print the argument (i.e. no escape
        !          1250:            characters).  Functions  _a_e_x_p_l_o_d_e_n  and  _e_x_p_l_o_d_e_n
        !          1251:            are similar to _a_e_x_p_l_o_d_e_c and _e_x_p_l_o_d_e_c except that
        !          1252:            a list of fixnum equivalents  of  characters  are
        !          1253: 
        !          1254: 
        !          1255:                                    Printed: January 31, 1984
        !          1256: 
        !          1257: 
        !          1258: 
        !          1259: 
        !          1260: 
        !          1261: 
        !          1262: 
        !          1263: Data Structure Access                                   2-20
        !          1264: 
        !          1265: 
        !          1266:            returned.
        !          1267: 
        !          1268: 
        !          1269:     ____________________________________________________
        !          1270: 
        !          1271:     -> (_s_e_t_q _x '|_q_u_o_t_e _t_h_i_s _\| _o_k?|)
        !          1272:     |quote this \| ok?|
        !          1273:     -> (_e_x_p_l_o_d_e _x)
        !          1274:     (q u o t e |\\| | | t h i s |\\| | | |\\| |\|| |\\| | | o k ?)
        !          1275:     ; note that |\\| just means the single character: backslash.
        !          1276:     ; and |\|| just means the single character: vertical bar
        !          1277:     ; and | | means the single character: space
        !          1278: 
        !          1279:     -> (_e_x_p_l_o_d_e_c _x)
        !          1280:     (q u o t e | | t h i s | | |\|| | | o k ?)
        !          1281:     -> (_e_x_p_l_o_d_e_n _x)
        !          1282:     (113 117 111 116 101 32 116 104 105 115 32 124 32 111 107 63)
        !          1283:     ____________________________________________________
        !          1284: 
        !          1285: 
        !          1286: 
        !          1287: 
        !          1288: 
        !          1289: 
        !          1290:    2.4.  Vectors
        !          1291: 
        !          1292:            See Chapter 9 for a discussion of vectors.   They
        !          1293:       are  less efficient that hunks but more efficient than
        !          1294:       arrays.
        !          1295: 
        !          1296: 
        !          1297: 
        !          1298:       2.4.1.  vector creation
        !          1299: 
        !          1300: (new-vector 'x_size ['g_fill ['g_prop]])
        !          1301: 
        !          1302:      RETURNS: A vector of length x_size.  Each data entry is
        !          1303:               initialized to g_fill, or to nil, if the argu-
        !          1304:               ment g_fill is not present.  The vector's pro-
        !          1305:               perty is set to g_prop, or to nil, by default.
        !          1306: 
        !          1307: (new-vectori-byte 'x_size ['g_fill ['g_prop]])
        !          1308: (new-vectori-word 'x_size ['g_fill ['g_prop]])
        !          1309: (new-vectori-long 'x_size ['g_fill ['g_prop]])
        !          1310: 
        !          1311:      RETURNS: A vectori with x_size  elements  in  it.   The
        !          1312:               actual  memory requirement is two long words +
        !          1313:               x_size*(n  bytes),  where  n  is  1  for  new-
        !          1314:               vector-byte,  2  for new-vector-word, or 4 for
        !          1315:               new-vectori-long.  Each data entry is initial-
        !          1316:               ized  to  g_fill,  or to zero, if the argument
        !          1317:               g_fill is not present.  The vector's  property
        !          1318:               is set to g_prop, or nil, by default.
        !          1319: 
        !          1320: 
        !          1321:                                    Printed: January 31, 1984
        !          1322: 
        !          1323: 
        !          1324: 
        !          1325: 
        !          1326: 
        !          1327: 
        !          1328: 
        !          1329: Data Structure Access                                   2-21
        !          1330: 
        !          1331: 
        !          1332:      Vectors may be created by specifying  multiple  initial
        !          1333:      values:
        !          1334: 
        !          1335: (vector ['g_val0 'g_val1 ...])
        !          1336: 
        !          1337:      RETURNS: a vector, with as many data elements as  there
        !          1338:               are arguments.  It is quite possible to have a
        !          1339:               vector with no data  elements.   The  vector's
        !          1340:               property will be a null list.
        !          1341: 
        !          1342: (vectori-byte ['x_val0 'x_val2 ...])
        !          1343: (vectori-word ['x_val0 'x_val2 ...])
        !          1344: (vectori-long ['x_val0 'x_val2 ...])
        !          1345: 
        !          1346:      RETURNS: a vectori, with as many data elements as there
        !          1347:               are  arguments.  The arguments are required to
        !          1348:               be fixnums.  Only the low order byte  or  word
        !          1349:               is  used  in  the  case  of  vectori-byte  and
        !          1350:               vectori-word.  The vector's property  will  be
        !          1351:               null.
        !          1352: 
        !          1353: 
        !          1354: 
        !          1355:       2.4.2.  vector reference
        !          1356: 
        !          1357: (vref 'v_vect 'x_index)
        !          1358: (vrefi-byte 'V_vect 'x_bindex)
        !          1359: (vrefi-word 'V_vect 'x_windex)
        !          1360: (vrefi-long 'V_vect 'x_lindex)
        !          1361: 
        !          1362:      RETURNS: the desired data element from a  vector.   The
        !          1363:               indices  must  be  fixnums.  Indexing is zero-
        !          1364:               based.  The vrefi functions  sign  extend  the
        !          1365:               data.
        !          1366: 
        !          1367: (vprop 'Vv_vect)
        !          1368: 
        !          1369:      RETURNS: The Lisp property associated with a vector.
        !          1370: 
        !          1371: (vget 'Vv_vect 'g_ind)
        !          1372: 
        !          1373:      RETURNS: The value stored under g_ind if the Lisp  pro-
        !          1374:               perty  associated  with 'Vv_vect is a disembo-
        !          1375:               died property list.
        !          1376: 
        !          1377: 
        !          1378: 
        !          1379: 
        !          1380: 
        !          1381: 
        !          1382: 
        !          1383: 
        !          1384: 9
        !          1385: 
        !          1386: 9                                   Printed: January 31, 1984
        !          1387: 
        !          1388: 
        !          1389: 
        !          1390: 
        !          1391: 
        !          1392: 
        !          1393: 
        !          1394: Data Structure Access                                   2-22
        !          1395: 
        !          1396: 
        !          1397: (vsize 'Vv_vect)
        !          1398: (vsize-byte 'V_vect)
        !          1399: (vsize-word 'V_vect)
        !          1400: 
        !          1401:      RETURNS: the number of data  elements  in  the  vector.
        !          1402:               For  immediate-vectors,  the  functions vsize-
        !          1403:               byte and vsize-word return the number of  data
        !          1404:               elements,  if one thinks of the binary data as
        !          1405:               being comprised of bytes or words.
        !          1406: 
        !          1407: 
        !          1408: 
        !          1409:       2.4.3.  vector modfication
        !          1410: 
        !          1411: (vset 'v_vect 'x_index 'g_val)
        !          1412: (vseti-byte 'V_vect 'x_bindex 'x_val)
        !          1413: (vseti-word 'V_vect 'x_windex 'x_val)
        !          1414: (vseti-long 'V_vect 'x_lindex 'x_val)
        !          1415: 
        !          1416:      RETURNS: the datum.
        !          1417: 
        !          1418:      SIDE EFFECT: The indexed element of the vector  is  set
        !          1419:                   to  the value.  As noted above, for vseti-
        !          1420:                   word and vseti-byte,  the  index  is  con-
        !          1421:                   strued  as  the number of the data element
        !          1422:                   within the  vector.   It  is  not  a  byte
        !          1423:                   address.   Also,  for those two functions,
        !          1424:                   the low order byte or  word  of  x_val  is
        !          1425:                   what is stored.
        !          1426: 
        !          1427: (vsetprop 'Vv_vect 'g_value)
        !          1428: 
        !          1429:      RETURNS: g_value.  This should be either a symbol or  a
        !          1430:               disembodied  property list whose _c_a_r is a sym-
        !          1431:               bol identifying the type of the vector.
        !          1432: 
        !          1433:      SIDE EFFECT: the property list of  Vv_vect  is  set  to
        !          1434:                   g_value.
        !          1435: 
        !          1436: (vputprop 'Vv_vect 'g_value 'g_ind)
        !          1437: 
        !          1438:      RETURNS: g_value.
        !          1439: 
        !          1440:      SIDE EFFECT: If the vector property  of  Vv_vect  is  a
        !          1441:                   disembodied  property  list, then vputprop
        !          1442:                   adds the value g_value under the indicator
        !          1443:                   g_ind.  Otherwise, the old vector property
        !          1444:                   is made the first element of the list.
        !          1445: 
        !          1446: 
        !          1447: 
        !          1448: 
        !          1449: 9
        !          1450: 
        !          1451: 9                                   Printed: January 31, 1984
        !          1452: 
        !          1453: 
        !          1454: 
        !          1455: 
        !          1456: 
        !          1457: 
        !          1458: 
        !          1459: Data Structure Access                                   2-23
        !          1460: 
        !          1461: 
        !          1462:    2.5.  Arrays
        !          1463: 
        !          1464:            See Chapter  9  for  a  complete  description  of
        !          1465:       arrays.  Some of these functions are part of a Maclisp
        !          1466:       array compatibility package representing only one sim-
        !          1467:       ple way of using the array structure of FRANZ LISP.
        !          1468: 
        !          1469: 
        !          1470: 
        !          1471:       2.5.1.  array creation
        !          1472: 
        !          1473: (marray 'g_data 's_access 'g_aux 'x_length 'x_delta)
        !          1474: 
        !          1475:      RETURNS: an array type with the fields set up from  the
        !          1476:               above  arguments  in  the  obvious  way  (see
        !          1477:               1.2.10).
        !          1478: 
        !          1479: (*array 's_name 's_type 'x_dim1 ... 'x_dim_n)
        !          1480: (array s_name s_type x_dim1 ... x_dim_n)
        !          1481: 
        !          1482:      WHERE:   s_type may be one of t, nil,  fixnum,  flonum,
        !          1483:               fixnum-block and flonum-block.
        !          1484: 
        !          1485:      RETURNS: an array of type s_type with n  dimensions  of
        !          1486:               extents given by the x_dim_i.
        !          1487: 
        !          1488:      SIDE EFFECT: If s_name is non nil, the function defini-
        !          1489:                   tion  of s_name is set to the array struc-
        !          1490:                   ture returned.
        !          1491: 
        !          1492:      NOTE: These  functions  create  a  Maclisp   compatible
        !          1493:            array.  In FRANZ LISP arrays of type t, nil, fix-
        !          1494:            num and flonum are equivalent and the elements of
        !          1495:            these  arrays  can  be  any  type of lisp object.
        !          1496:            Fixnum-block and  flonum-block  arrays  are  res-
        !          1497:            tricted  to  fixnums and flonums respectively and
        !          1498:            are used mainly to communicate with foreign func-
        !          1499:            tions (see 8.5).
        !          1500: 
        !          1501:      NOTE: *_a_r_r_a_y evaluates its arguments, _a_r_r_a_y does not.
        !          1502: 
        !          1503: 
        !          1504: 
        !          1505:       2.5.2.  array predicate
        !          1506: 
        !          1507: 
        !          1508: 
        !          1509: 
        !          1510: 
        !          1511: 
        !          1512: 
        !          1513: 
        !          1514: 9
        !          1515: 
        !          1516: 9                                   Printed: January 31, 1984
        !          1517: 
        !          1518: 
        !          1519: 
        !          1520: 
        !          1521: 
        !          1522: 
        !          1523: 
        !          1524: Data Structure Access                                   2-24
        !          1525: 
        !          1526: 
        !          1527: (arrayp 'g_arg)
        !          1528: 
        !          1529:      RETURNS: t iff g_arg is of type array.
        !          1530: 
        !          1531: 
        !          1532: 
        !          1533:       2.5.3.  array accessors
        !          1534: 
        !          1535: 
        !          1536: (getaccess 'a_array)
        !          1537: (getaux 'a_array)
        !          1538: (getdelta 'a_array)
        !          1539: (getdata 'a_array)
        !          1540: (getlength 'a_array)
        !          1541: 
        !          1542:      RETURNS: the field of the array object a_array given by
        !          1543:               the function name.
        !          1544: 
        !          1545: (arrayref 'a_name 'x_ind)
        !          1546: 
        !          1547:      RETURNS: the  x_ind_t_h  element  of  the  array   object
        !          1548:               a_name.  x_ind of zero accesses the first ele-
        !          1549:               ment.
        !          1550: 
        !          1551:      NOTE: _a_r_r_a_y_r_e_f uses the data, length and  delta  fields
        !          1552:            of a_name to determine which object to return.
        !          1553: 
        !          1554: (arraycall s_type 'as_array 'x_ind1 ... )
        !          1555: 
        !          1556:      RETURNS: the element selected by  the indices from  the
        !          1557:               array a_array of type s_type.
        !          1558: 
        !          1559:      NOTE: If as_array is a symbol then the function binding
        !          1560:            of this symbol should contain an array object.
        !          1561:            s_type is ignored by _a_r_r_a_y_c_a_l_l  but  is  included
        !          1562:            for compatibility with Maclisp.
        !          1563: 
        !          1564: (arraydims 's_name)
        !          1565: 
        !          1566:      RETURNS: a list of the type and  bounds  of  the  array
        !          1567:               s_name.
        !          1568: 
        !          1569: 
        !          1570: 
        !          1571: 
        !          1572: 
        !          1573: 
        !          1574: 
        !          1575: 
        !          1576: 
        !          1577: 
        !          1578: 
        !          1579: 9
        !          1580: 
        !          1581: 9                                   Printed: January 31, 1984
        !          1582: 
        !          1583: 
        !          1584: 
        !          1585: 
        !          1586: 
        !          1587: 
        !          1588: 
        !          1589: Data Structure Access                                   2-25
        !          1590: 
        !          1591: 
        !          1592: (listarray 'sa_array ['x_elements])
        !          1593: 
        !          1594:      RETURNS: a  list  of  all  of  the  elements  in  array
        !          1595:               sa_array.   If  x_elements is given, then only
        !          1596:               the first x_elements are returned.
        !          1597: 
        !          1598: 
        !          1599: 
        !          1600:     ____________________________________________________
        !          1601: 
        !          1602:     ; We will create a 3 by 4 array of general lisp objects
        !          1603:     -> (_a_r_r_a_y _e_r_n_i_e _t _3 _4)
        !          1604:     array[12]
        !          1605: 
        !          1606:     ; the array header is stored in the function definition slot of the
        !          1607:     ; symbol ernie
        !          1608:     -> (_a_r_r_a_y_p (_g_e_t_d '_e_r_n_i_e))
        !          1609:     t
        !          1610:     -> (_a_r_r_a_y_d_i_m_s (_g_e_t_d '_e_r_n_i_e))
        !          1611:     (t 3 4)
        !          1612: 
        !          1613:     ; store in ernie[2][2] the list (test list)
        !          1614:     -> (_s_t_o_r_e (_e_r_n_i_e _2 _2) '(_t_e_s_t _l_i_s_t))
        !          1615:     (test list)
        !          1616: 
        !          1617:     ; check to see if it is there
        !          1618:     -> (_e_r_n_i_e _2 _2)
        !          1619:     (test list)
        !          1620: 
        !          1621:     ; now use the low level function _a_r_r_a_y_r_e_f to find the same element
        !          1622:     ; arrays are 0 based and row-major (the last subscript varies the fastest)
        !          1623:     ; thus element [2][2] is the 10th element , (starting at 0).
        !          1624:     -> (_a_r_r_a_y_r_e_f (_g_e_t_d '_e_r_n_i_e) _1_0)
        !          1625:     (ptr to)(test list)    ; the result is a value cell (thus the (ptr to))
        !          1626:     ____________________________________________________
        !          1627: 
        !          1628: 
        !          1629: 
        !          1630: 
        !          1631: 
        !          1632: 
        !          1633:       2.5.4.  array manipulation
        !          1634: 
        !          1635: 
        !          1636: 
        !          1637: 
        !          1638: 
        !          1639: 
        !          1640: 
        !          1641: 
        !          1642: 
        !          1643: 
        !          1644: 9
        !          1645: 
        !          1646: 9                                   Printed: January 31, 1984
        !          1647: 
        !          1648: 
        !          1649: 
        !          1650: 
        !          1651: 
        !          1652: 
        !          1653: 
        !          1654: Data Structure Access                                   2-26
        !          1655: 
        !          1656: 
        !          1657: (putaccess 'a_array 'su_func)
        !          1658: (putaux 'a_array 'g_aux)
        !          1659: (putdata 'a_array 'g_arg)
        !          1660: (putdelta 'a_array 'x_delta)
        !          1661: (putlength 'a_array 'x_length)
        !          1662: 
        !          1663:      RETURNS: the second argument to the function.
        !          1664: 
        !          1665:      SIDE EFFECT: The field of the array object given by the
        !          1666:                   function  name  is  replaced by the second
        !          1667:                   argument to the function.
        !          1668: 
        !          1669: (store 'l_arexp 'g_val)
        !          1670: 
        !          1671:      WHERE:   l_arexp is an expression which  references  an
        !          1672:               array element.
        !          1673: 
        !          1674:      RETURNS: g_val
        !          1675: 
        !          1676:      SIDE EFFECT: the array location which contains the ele-
        !          1677:                   ment  which  l_arexp references is changed
        !          1678:                   to contain g_val.
        !          1679: 
        !          1680: (fillarray 's_array 'l_itms)
        !          1681: 
        !          1682:      RETURNS: s_array
        !          1683: 
        !          1684:      SIDE EFFECT: the array s_array is filled with  elements
        !          1685:                   from l_itms.  If there are not enough ele-
        !          1686:                   ments in l_itms to fill the entire  array,
        !          1687:                   then the last element of l_itms is used to
        !          1688:                   fill the remaining parts of the array.
        !          1689: 
        !          1690: 
        !          1691: 
        !          1692:    2.6.  Hunks
        !          1693: 
        !          1694:            Hunks are  vector-like  objects  whose  size  can
        !          1695:       range  from  1 to 128 elements.  Internally, hunks are
        !          1696:       allocated in sizes which are powers of 2.  In order to
        !          1697:       create  hunks  of  a  given size, a hunk with at least
        !          1698:       that many elements is allocated  and  a  distinguished
        !          1699:       symbol   EMPTY   is   placed  in  those  elements  not
        !          1700:       requested.  Most hunk  functions  respect  those  dis-
        !          1701:       tinguished  symbols,  but  there are two (*_m_a_k_h_u_n_k and
        !          1702:       *_r_p_l_a_c_x) which will overwrite the  distinguished  sym-
        !          1703:       bol.
        !          1704: 
        !          1705: 
        !          1706: 
        !          1707: 
        !          1708: 
        !          1709: 9
        !          1710: 
        !          1711: 9                                   Printed: January 31, 1984
        !          1712: 
        !          1713: 
        !          1714: 
        !          1715: 
        !          1716: 
        !          1717: 
        !          1718: 
        !          1719: Data Structure Access                                   2-27
        !          1720: 
        !          1721: 
        !          1722:       2.6.1.  hunk creation
        !          1723: 
        !          1724: (hunk 'g_val1 ['g_val2 ... 'g_val_n])
        !          1725: 
        !          1726:      RETURNS: a hunk of length n whose elements are initial-
        !          1727:               ized to the g_val_i.
        !          1728: 
        !          1729:      NOTE: the maximum size of a hunk is 128.
        !          1730: 
        !          1731:      EXAMPLE: (_h_u_n_k _4 '_s_h_a_r_p '_k_e_y_s) = {4 sharp keys}
        !          1732: 
        !          1733: (makhunk 'xl_arg)
        !          1734: 
        !          1735:      RETURNS: a hunk of length  xl_arg  initialized  to  all
        !          1736:               nils  if  xl_arg  is a fixnum.  If xl_arg is a
        !          1737:               list,  then  we  return   a   hunk   of   size
        !          1738:               (_l_e_n_g_t_h '_x_l__a_r_g)  initialized  to the elements
        !          1739:               in xl_arg.
        !          1740: 
        !          1741:      NOTE: (_m_a_k_h_u_n_k '(_a _b _c))     is      equivalent      to
        !          1742:            (_h_u_n_k '_a '_b '_c).
        !          1743: 
        !          1744:      EXAMPLE: (_m_a_k_h_u_n_k _4) = {_n_i_l _n_i_l _n_i_l _n_i_l}
        !          1745: 
        !          1746: (*makhunk 'x_arg)
        !          1747: 
        !          1748:      RETURNS: a hunk of size 2[x_arg] initialized to EMPTY.
        !          1749: 
        !          1750:      NOTE: This is only to be used by such functions as _h_u_n_k
        !          1751:            and _m_a_k_h_u_n_k which create and initialize hunks for
        !          1752:            users.
        !          1753: 
        !          1754: 
        !          1755: 
        !          1756:       2.6.2.  hunk accessor
        !          1757: 
        !          1758: (cxr 'x_ind 'h_hunk)
        !          1759: 
        !          1760:      RETURNS: element x_ind (starting at 0) of hunk h_hunk.
        !          1761: 
        !          1762: (hunk-to-list 'h_hunk)
        !          1763: 
        !          1764:      RETURNS: a list consisting of the elements of h_hunk.
        !          1765: 
        !          1766: 
        !          1767: 
        !          1768:       2.6.3.  hunk manipulators
        !          1769: 
        !          1770: 
        !          1771: 
        !          1772: 
        !          1773: 
        !          1774: 9
        !          1775: 
        !          1776: 9                                   Printed: January 31, 1984
        !          1777: 
        !          1778: 
        !          1779: 
        !          1780: 
        !          1781: 
        !          1782: 
        !          1783: 
        !          1784: Data Structure Access                                   2-28
        !          1785: 
        !          1786: 
        !          1787: (rplacx 'x_ind 'h_hunk 'g_val)
        !          1788: (*rplacx 'x_ind 'h_hunk 'g_val)
        !          1789: 
        !          1790:      RETURNS: h_hunk
        !          1791: 
        !          1792:      SIDE EFFECT: Element x_ind (starting at 0) of h_hunk is
        !          1793:                   set to g_val.
        !          1794: 
        !          1795:      NOTE: _r_p_l_a_c_x will not modify one of  the  distinguished
        !          1796:            (EMPTY) elements whereas *_r_p_l_a_c_x will.
        !          1797: 
        !          1798: (hunksize 'h_arg)
        !          1799: 
        !          1800:      RETURNS: the size of the hunk h_arg.
        !          1801: 
        !          1802:      EXAMPLE: (_h_u_n_k_s_i_z_e (_h_u_n_k _1 _2 _3)) = 3
        !          1803: 
        !          1804: 
        !          1805: 
        !          1806:    2.7.  Bcds
        !          1807: 
        !          1808:            A bcd object contains a pointer to compiled  code
        !          1809:       and  to  the type of function object the compiled code
        !          1810:       represents.
        !          1811: 
        !          1812: (getdisc 'y_bcd)
        !          1813: (getentry 'y_bcd)
        !          1814: 
        !          1815:      RETURNS: the field of the bcd object given by the func-
        !          1816:               tion name.
        !          1817: 
        !          1818: (putdisc 'y_func 's_discipline)
        !          1819: 
        !          1820:      RETURNS: s_discipline
        !          1821: 
        !          1822:      SIDE EFFECT: Sets the discipline  field  of  y_func  to
        !          1823:                   s_discipline.
        !          1824: 
        !          1825: 
        !          1826: 
        !          1827:    2.8.  Structures
        !          1828: 
        !          1829:            There are three common structures constructed out
        !          1830:       of  list  cells: the assoc list, the property list and
        !          1831:       the tconc list.  The functions below manipulate  these
        !          1832:       structures.
        !          1833: 
        !          1834: 
        !          1835: 
        !          1836:       2.8.1.  assoc list
        !          1837: 
        !          1838:               An `assoc list' (or alist) is  a  common  lisp
        !          1839:          data structure.  It has the form
        !          1840: 
        !          1841: 
        !          1842:                                    Printed: January 31, 1984
        !          1843: 
        !          1844: 
        !          1845: 
        !          1846: 
        !          1847: 
        !          1848: 
        !          1849: 
        !          1850: Data Structure Access                                   2-29
        !          1851: 
        !          1852: 
        !          1853:          ((key1 . value1) (key2 . value2) (key3 . value3) ... (keyn . valuen))
        !          1854: 
        !          1855: (assoc 'g_arg1 'l_arg2)
        !          1856: (assq 'g_arg1 'l_arg2)
        !          1857: 
        !          1858:      RETURNS: the first top level element  of  l_arg2  whose
        !          1859:               _c_a_r is _e_q_u_a_l (with _a_s_s_o_c) or _e_q (with _a_s_s_q) to
        !          1860:               g_arg1.
        !          1861: 
        !          1862:      NOTE: Usually l_arg2 has an _a-_l_i_s_t structure and g_arg1
        !          1863:            acts as key.
        !          1864: 
        !          1865: (sassoc 'g_arg1 'l_arg2 'sl_func)
        !          1866: 
        !          1867:      RETURNS: the                 result                  of
        !          1868:               (_c_o_n_d ((_a_s_s_o_c '_g__a_r_g '_l__a_r_g_2) (_a_p_p_l_y '_s_l__f_u_n_c _n_i_l)))
        !          1869: 
        !          1870:      NOTE: sassoc is written as a macro.
        !          1871: 
        !          1872: (sassq 'g_arg1 'l_arg2 'sl_func)
        !          1873: 
        !          1874:      RETURNS: the                 result                  of
        !          1875:               (_c_o_n_d ((_a_s_s_q '_g__a_r_g '_l__a_r_g_2) (_a_p_p_l_y '_s_l__f_u_n_c _n_i_l)))
        !          1876: 
        !          1877:      NOTE: sassq is written as a macro.
        !          1878: 
        !          1879: 
        !          1880: 
        !          1881:     ____________________________________________________
        !          1882: 
        !          1883:     ; _a_s_s_o_c or _a_s_s_q is given a key and an assoc list and returns
        !          1884:     ; the key and value item if it exists, they differ only in how they test
        !          1885:     ; for equality of the keys.
        !          1886: 
        !          1887:     -> (_s_e_t_q _a_l_i_s_t '((_a_l_p_h_a . _a) ( (_c_o_m_p_l_e_x _k_e_y) . _b) (_j_u_n_k . _x)))
        !          1888:     ((alpha . a) ((complex key) . b) (junk . x))
        !          1889: 
        !          1890:     ; we should use _a_s_s_q when the key is an atom
        !          1891:     -> (_a_s_s_q '_a_l_p_h_a _a_l_i_s_t)
        !          1892:     (alpha . a)
        !          1893: 
        !          1894:     ; but it may not work when the key is a list
        !          1895:     -> (_a_s_s_q '(_c_o_m_p_l_e_x _k_e_y) _a_l_i_s_t)
        !          1896:     nil
        !          1897: 
        !          1898:     ; however _a_s_s_o_c will always work
        !          1899:     -> (_a_s_s_o_c '(_c_o_m_p_l_e_x _k_e_y) _a_l_i_s_t)
        !          1900:     ((complex key) . b)
        !          1901:     ____________________________________________________
        !          1902: 
        !          1903: 
        !          1904: 
        !          1905: 9
        !          1906: 
        !          1907: 9                                   Printed: January 31, 1984
        !          1908: 
        !          1909: 
        !          1910: 
        !          1911: 
        !          1912: 
        !          1913: 
        !          1914: 
        !          1915: Data Structure Access                                   2-30
        !          1916: 
        !          1917: 
        !          1918: (sublis 'l_alst 'l_exp)
        !          1919: 
        !          1920:      WHERE:   l_alst is an _a-_l_i_s_t.
        !          1921: 
        !          1922:      RETURNS: the list l_exp with every occurrence  of  key_i
        !          1923:               replaced by val_i.
        !          1924: 
        !          1925:      NOTE: new list structure is returned to prevent modifi-
        !          1926:            cation  of l_exp.  When a substitution is made, a
        !          1927:            copy of the value to substitute in is not made.
        !          1928: 
        !          1929: 
        !          1930: 
        !          1931:       2.8.2.  property list
        !          1932: 
        !          1933:               A property list  consists  of  an  alternating
        !          1934:          sequence  of  keys and values.  Normally a property
        !          1935:          list is stored on a symbol. A list is  a  'disembo-
        !          1936:          died' property list if it contains an odd number of
        !          1937:          elements, the first of which is ignored.
        !          1938: 
        !          1939: (plist 's_name)
        !          1940: 
        !          1941:      RETURNS: the property list of s_name.
        !          1942: 
        !          1943: (setplist 's_atm 'l_plist)
        !          1944: 
        !          1945:      RETURNS: l_plist.
        !          1946: 
        !          1947:      SIDE EFFECT: the property  list  of  s_atm  is  set  to
        !          1948:                   l_plist.
        !          1949: 
        !          1950: 
        !          1951: (get 'ls_name 'g_ind)
        !          1952: 
        !          1953:      RETURNS: the value under indicator g_ind  in  ls_name's
        !          1954:               property list if ls_name is a symbol.
        !          1955: 
        !          1956:      NOTE: If there is no indicator g_ind in ls_name's  pro-
        !          1957:            perty list nil is returned.  If ls_name is a list
        !          1958:            of an odd number of elements then it is a  disem-
        !          1959:            bodied  property list. _g_e_t searches a disembodied
        !          1960:            property list by starting at its _c_d_r, and compar-
        !          1961:            ing every other element with g_ind, using _e_q.
        !          1962: 
        !          1963: 
        !          1964: 
        !          1965: 
        !          1966: 
        !          1967: 
        !          1968: 
        !          1969: 
        !          1970: 9
        !          1971: 
        !          1972: 9                                   Printed: January 31, 1984
        !          1973: 
        !          1974: 
        !          1975: 
        !          1976: 
        !          1977: 
        !          1978: 
        !          1979: 
        !          1980: Data Structure Access                                   2-31
        !          1981: 
        !          1982: 
        !          1983: (getl 'ls_name 'l_indicators)
        !          1984: 
        !          1985:      RETURNS: the property list  ls_name  beginning  at  the
        !          1986:               first  indicator which is a member of the list
        !          1987:               l_indicators, or nil if none of the indicators
        !          1988:               in  l_indicators  are  on  ls_name's  property
        !          1989:               list.
        !          1990: 
        !          1991:      NOTE: If ls_name is a list, then it is assumed to be  a
        !          1992:            disembodied property list.
        !          1993: 
        !          1994: 
        !          1995: (putprop 'ls_name 'g_val 'g_ind)
        !          1996: (defprop ls_name g_val g_ind)
        !          1997: 
        !          1998:      RETURNS: g_val.
        !          1999: 
        !          2000:      SIDE EFFECT: Adds to the property list of  ls_name  the
        !          2001:                   value g_val under the indicator g_ind.
        !          2002: 
        !          2003:      NOTE: _p_u_t_p_r_o_p evaluates it arguments, _d_e_f_p_r_o_p does not.
        !          2004:            ls_name  may  be a disembodied property list, see
        !          2005:            _g_e_t.
        !          2006: 
        !          2007: (remprop 'ls_name 'g_ind)
        !          2008: 
        !          2009:      RETURNS: the portion of  ls_name's property list begin-
        !          2010:               ning  with  the  property  under the indicator
        !          2011:               g_ind.  If there  is  no  g_ind  indicator  in
        !          2012:               ls_name's plist, nil is returned.
        !          2013: 
        !          2014:      SIDE EFFECT: the value under indicator g_ind and  g_ind
        !          2015:                   itself  is  removed from the property list
        !          2016:                   of ls_name.
        !          2017: 
        !          2018:      NOTE: ls_name may be a disembodied property  list,  see
        !          2019:            _g_e_t.
        !          2020: 
        !          2021: 
        !          2022: 
        !          2023: 
        !          2024: 
        !          2025: 
        !          2026: 
        !          2027: 
        !          2028: 
        !          2029: 
        !          2030: 
        !          2031: 
        !          2032: 
        !          2033: 
        !          2034: 
        !          2035: 9
        !          2036: 
        !          2037: 9                                   Printed: January 31, 1984
        !          2038: 
        !          2039: 
        !          2040: 
        !          2041: 
        !          2042: 
        !          2043: 
        !          2044: 
        !          2045: Data Structure Access                                   2-32
        !          2046: 
        !          2047: 
        !          2048: 
        !          2049:     ____________________________________________________
        !          2050: 
        !          2051:     -> (_p_u_t_p_r_o_p '_x_l_a_t_e '_a '_a_l_p_h_a)
        !          2052:     a
        !          2053:     -> (_p_u_t_p_r_o_p '_x_l_a_t_e '_b '_b_e_t_a)
        !          2054:     b
        !          2055:     -> (_p_l_i_s_t '_x_l_a_t_e)
        !          2056:     (alpha a beta b)
        !          2057:     -> (_g_e_t '_x_l_a_t_e '_a_l_p_h_a)
        !          2058:     a
        !          2059:     ; use of a disembodied property list:
        !          2060:     -> (_g_e_t '(_n_i_l _f_a_t_e_m_a_n _r_j_f _s_k_l_o_w_e_r _k_l_s _f_o_d_e_r_a_r_o _j_k_f) '_s_k_l_o_w_e_r)
        !          2061:     kls
        !          2062:     ____________________________________________________
        !          2063: 
        !          2064: 
        !          2065: 
        !          2066: 
        !          2067: 
        !          2068: 
        !          2069:       2.8.3.  tconc structure
        !          2070: 
        !          2071:               A tconc structure is a special  type  of  list
        !          2072:          designed to make it easy to add objects to the end.
        !          2073:          It consists of a list cell whose _c_a_r  points  to  a
        !          2074:          list  of the elements added with _t_c_o_n_c or _l_c_o_n_c and
        !          2075:          whose _c_d_r points to the last list cell of the  list
        !          2076:          pointed to by the _c_a_r.
        !          2077: 
        !          2078: (tconc 'l_ptr 'g_x)
        !          2079: 
        !          2080:      WHERE:   l_ptr is a tconc structure.
        !          2081: 
        !          2082:      RETURNS: l_ptr with g_x added to the end.
        !          2083: 
        !          2084: (lconc 'l_ptr 'l_x)
        !          2085: 
        !          2086:      WHERE:   l_ptr is a tconc structure.
        !          2087: 
        !          2088:      RETURNS: l_ptr with the list l_x spliced in at the end.
        !          2089: 
        !          2090: 
        !          2091: 
        !          2092: 
        !          2093: 
        !          2094: 
        !          2095: 
        !          2096: 
        !          2097: 
        !          2098: 
        !          2099: 
        !          2100: 9
        !          2101: 
        !          2102: 9                                   Printed: January 31, 1984
        !          2103: 
        !          2104: 
        !          2105: 
        !          2106: 
        !          2107: 
        !          2108: 
        !          2109: 
        !          2110: Data Structure Access                                   2-33
        !          2111: 
        !          2112: 
        !          2113: 
        !          2114:     ____________________________________________________
        !          2115: 
        !          2116:     ; A _t_c_o_n_c structure can be initialized in two  ways.
        !          2117:     ; nil can be given to _t_c_o_n_c in which case _t_c_o_n_c will generate
        !          2118:     ; a _t_c_o_n_c structure.
        !          2119: 
        !          2120:     ->(_s_e_t_q _f_o_o (_t_c_o_n_c _n_i_l _1))
        !          2121:     ((1) 1)
        !          2122: 
        !          2123:     ; Since _t_c_o_n_c destructively adds to
        !          2124:     ; the list, you can now add to foo without using _s_e_t_q again.
        !          2125: 
        !          2126:     ->(_t_c_o_n_c _f_o_o _2)
        !          2127:     ((1 2) 2)
        !          2128:     ->_f_o_o
        !          2129:     ((1 2) 2)
        !          2130: 
        !          2131:     ; Another way to create a null  _t_c_o_n_c structure
        !          2132:     ; is to use (_n_c_o_n_s _n_i_l).
        !          2133: 
        !          2134:     ->(_s_e_t_q _f_o_o (_n_c_o_n_s _n_i_l))
        !          2135:     (nil)
        !          2136:     ->(_t_c_o_n_c _f_o_o _1)
        !          2137:     ((1) 1)
        !          2138: 
        !          2139:     ; now see what _l_c_o_n_c can do
        !          2140:     -> (_l_c_o_n_c _f_o_o _n_i_l)
        !          2141:     ((1) 1)            ; no change
        !          2142:     -> (_l_c_o_n_c _f_o_o '(_2 _3 _4))
        !          2143:     ((1 2 3 4) 4)
        !          2144:     ____________________________________________________
        !          2145: 
        !          2146: 
        !          2147: 
        !          2148: 
        !          2149: 
        !          2150: 
        !          2151:       2.8.4.  fclosures
        !          2152: 
        !          2153:               An  fclosure  is  a  functional  object  which
        !          2154:          admits some data manipulations.  They are discussed
        !          2155:          in 8.4.  Internally, they are constructed from vec-
        !          2156:          tors.
        !          2157: 
        !          2158: 
        !          2159: 
        !          2160: 
        !          2161: 
        !          2162: 
        !          2163: 
        !          2164: 
        !          2165: 9
        !          2166: 
        !          2167: 9                                   Printed: January 31, 1984
        !          2168: 
        !          2169: 
        !          2170: 
        !          2171: 
        !          2172: 
        !          2173: 
        !          2174: 
        !          2175: Data Structure Access                                   2-34
        !          2176: 
        !          2177: 
        !          2178: (fclosure 'l_vars 'g_funobj)
        !          2179: 
        !          2180:      WHERE:   l_vars is a list of variables, g_funobj is any
        !          2181:               object that can be funcalled (including, fclo-
        !          2182:               sures).
        !          2183: 
        !          2184:      RETURNS: A vector which is the fclosure.
        !          2185: 
        !          2186: (fclosure-alist 'v_fclosure)
        !          2187: 
        !          2188:      RETURNS: An association list representing the variables
        !          2189:               in  the  fclosure.   This is a snapshot of the
        !          2190:               current state of the fclosure.  If  the  bind-
        !          2191:               ings  in  the fclosure are changed, any previ-
        !          2192:               ously  calculated  results  of  _f_c_l_o_s_u_r_e-_a_l_i_s_t
        !          2193:               will not change.
        !          2194: 
        !          2195: (fclosure-function 'v_fclosure)
        !          2196: 
        !          2197:      RETURNS: the functional object part of the fclosure.
        !          2198: 
        !          2199: (fclosurep 'v_fclosure)
        !          2200: 
        !          2201:      RETURNS: t iff the argument is an fclosure.
        !          2202: 
        !          2203: (symeval-in-fclosure 'v_fclosure 's_symbol)
        !          2204: 
        !          2205:      RETURNS: the current binding of a particular symbol  in
        !          2206:               an fclosure.
        !          2207: 
        !          2208: (set-in-fclosure 'v_fclosure 's_symbol 'g_newvalue)
        !          2209: 
        !          2210:      RETURNS: g_newvalue.
        !          2211: 
        !          2212:      SIDE EFFECT: The variable  s_symbol  is  bound  in  the
        !          2213:                   fclosure to g_newvalue.
        !          2214: 
        !          2215: 
        !          2216: 
        !          2217:    2.9.  Random functions
        !          2218: 
        !          2219:            The following functions don't fall  into  any  of
        !          2220:       the classifications above.
        !          2221: 
        !          2222: 
        !          2223: 
        !          2224: 
        !          2225: 
        !          2226: 
        !          2227: 
        !          2228: 
        !          2229: 
        !          2230: 9
        !          2231: 
        !          2232: 9                                   Printed: January 31, 1984
        !          2233: 
        !          2234: 
        !          2235: 
        !          2236: 
        !          2237: 
        !          2238: 
        !          2239: 
        !          2240: Data Structure Access                                   2-35
        !          2241: 
        !          2242: 
        !          2243: (bcdad 's_funcname)
        !          2244: 
        !          2245:      RETURNS: a fixnum which is the address in memory  where
        !          2246:               the function s_funcname begins.  If s_funcname
        !          2247:               is not a machine coded function (binary)  then
        !          2248:               _b_c_d_a_d returns nil.
        !          2249: 
        !          2250: (copy 'g_arg)
        !          2251: 
        !          2252:      RETURNS: A structure _e_q_u_a_l to g_arg but with  new  list
        !          2253:               cells.
        !          2254: 
        !          2255: (copyint* 'x_arg)
        !          2256: 
        !          2257:      RETURNS: a fixnum with the same value as x_arg but in a
        !          2258:               freshly allocated cell.
        !          2259: 
        !          2260: (cpy1 'xvt_arg)
        !          2261: 
        !          2262:      RETURNS: a new cell of the same type  as  xvt_arg  with
        !          2263:               the same value as xvt_arg.
        !          2264: 
        !          2265: (getaddress 's_entry1 's_binder1  'st_discipline1  [...  ...
        !          2266: ...])
        !          2267: 
        !          2268:      RETURNS: the binary object which s_binder1's   function
        !          2269:               field is set to.
        !          2270: 
        !          2271:      NOTE: This looks in the running lisp's symbol table for
        !          2272:            a symbol with the same name as s_entry_i.  It then
        !          2273:            creates a binary object whose entry field  points
        !          2274:            to    s_entry_i    and    whose    discipline   is
        !          2275:            st_discipline_i.  This binary object is stored  in
        !          2276:            the    function    field    of   s_binder_i.    If
        !          2277:            st_discipline_i is nil, then "subroutine" is  used
        !          2278:            by  default.  This is especially useful for _c_f_a_s_l
        !          2279:            users.
        !          2280: 
        !          2281: (macroexpand 'g_form)
        !          2282: 
        !          2283:      RETURNS: g_form after all macros in it are expanded.
        !          2284: 
        !          2285:      NOTE: This function will only  macroexpand  expressions
        !          2286:            which  could  be  evaluated  and it does not know
        !          2287:            about the special nlambdas such as _c_o_n_d  and  _d_o,
        !          2288:            thus it misses many macro expansions.
        !          2289: 
        !          2290: 
        !          2291: 
        !          2292: 
        !          2293: 
        !          2294: 
        !          2295: 9
        !          2296: 
        !          2297: 9                                   Printed: January 31, 1984
        !          2298: 
        !          2299: 
        !          2300: 
        !          2301: 
        !          2302: 
        !          2303: 
        !          2304: 
        !          2305: Data Structure Access                                   2-36
        !          2306: 
        !          2307: 
        !          2308: (ptr 'g_arg)
        !          2309: 
        !          2310:      RETURNS: a value cell initialized to point to g_arg.
        !          2311: 
        !          2312: (quote g_arg)
        !          2313: 
        !          2314:      RETURNS: g_arg.
        !          2315: 
        !          2316:      NOTE: the reader allows you to abbreviate  (quote  foo)
        !          2317:            as 'foo.
        !          2318: 
        !          2319: (kwote 'g_arg)
        !          2320: 
        !          2321:      RETURNS:  (_l_i_s_t (_q_u_o_t_e _q_u_o_t_e) _g__a_r_g).
        !          2322: 
        !          2323: (replace 'g_arg1 'g_arg2)
        !          2324: 
        !          2325:      WHERE:   g_arg1 and g_arg2 must be  the  same  type  of
        !          2326:               lispval and not symbols or hunks.
        !          2327: 
        !          2328:      RETURNS: g_arg2.
        !          2329: 
        !          2330:      SIDE EFFECT: The effect of _r_e_p_l_a_c_e is dependent on  the
        !          2331:                   type  of  the  g_arg_i  although  one  will
        !          2332:                   notice a similarity in  the  effects.   To
        !          2333:                   understand what _r_e_p_l_a_c_e does to fixnum and
        !          2334:                   flonum arguments, you  must  first  under-
        !          2335:                   stand  that  such  numbers  are `boxed' in
        !          2336:                   FRANZ LISP.  What this means  is  that  if
        !          2337:                   the  symbol  x  has a value 32412, then in
        !          2338:                   memory the value  element  of  x's  symbol
        !          2339:                   structure  contains the address of another
        !          2340:                   word of memory (called a box)  with  32412
        !          2341:                   in it.
        !          2342: 
        !          2343:                   Thus, there are two ways of  changing  the
        !          2344:                   value  of  x:  the  first is to change the
        !          2345:                   value element of x's symbol  structure  to
        !          2346:                   point to a word of memory with a different
        !          2347:                   value.  The second way is  to  change  the
        !          2348:                   value  in  the box which x points to.  The
        !          2349:                   former method is used almost  all  of  the
        !          2350:                   time,  the  latter is used very rarely and
        !          2351:                   has the potential to  cause  great  confu-
        !          2352:                   sion.   The function _r_e_p_l_a_c_e allows you to
        !          2353:                   do the latter, i.e.,  to  actually  change
        !          2354:                   the value in the box.
        !          2355: 
        !          2356:                   You should watch out for these situations.
        !          2357:                   If  you  do  (_s_e_t_q _y _x), then both x and y
        !          2358:                   will point to the same box.   If  you  now
        !          2359:                   (_r_e_p_l_a_c_e _x _1_2_3_4_5),  then  y will also have
        !          2360:                   the value 12345.  And, in fact, there  may
        !          2361: 
        !          2362: 
        !          2363:                                    Printed: January 31, 1984
        !          2364: 
        !          2365: 
        !          2366: 
        !          2367: 
        !          2368: 
        !          2369: 
        !          2370: 
        !          2371: Data Structure Access                                   2-37
        !          2372: 
        !          2373: 
        !          2374:                   be many other pointers to that box.
        !          2375: 
        !          2376:                   Another problem with replacing fixnums  is
        !          2377:                   that  some  boxes are read-only.  The fix-
        !          2378:                   nums between -1024 and 1023 are stored  in
        !          2379:                   a  read-only  area and attempts to replace
        !          2380:                   them will result  in  an  "Illegal  memory
        !          2381:                   reference"  error  (see the description of
        !          2382:                   _c_o_p_y_i_n_t* for a way around this problem).
        !          2383: 
        !          2384:                   For the other valid types, the  effect  of
        !          2385:                   _r_e_p_l_a_c_e is easy to understand.  The fields
        !          2386:                   of g_val1's structure are made eq  to  the
        !          2387:                   corresponding  fields  of  g_val2's struc-
        !          2388:                   ture.  For example,  if  x   and   y  have
        !          2389:                   lists   as   values  then  the  effect  of
        !          2390:                   (_r_e_p_l_a_c_e _x _y)    is    the     same     as
        !          2391:                   (_r_p_l_a_c_a _x (_c_a_r _y)) and (_r_p_l_a_c_d _x (_c_d_r _y)).
        !          2392: 
        !          2393: (scons 'x_arg 'bs_rest)
        !          2394: 
        !          2395:      WHERE:   bs_rest is a bignum or nil.
        !          2396: 
        !          2397:      RETURNS: a bignum whose first bigit is x_arg and  whose
        !          2398:               higher order bigits are bs_rest.
        !          2399: 
        !          2400: (setf g_refexpr 'g_value)
        !          2401: 
        !          2402:      NOTE: _s_e_t_f is a generalization  of  setq.   Information
        !          2403:            may  be  stored  by  binding variables, replacing
        !          2404:            entries of arrays, and vectors, or being  put  on
        !          2405:            property  lists,  among  others.  Setf will allow
        !          2406:            the user to store data  into  some  location,  by
        !          2407:            mentioning  the  operation  used  to refer to the
        !          2408:            location.  Thus, the first argument may  be  par-
        !          2409:            tially  evaluated,  but only to the extent needed
        !          2410:            to calculate a reference.  _s_e_t_f returns  g_value.
        !          2411:            (Compare to _d_e_s_e_t_q )
        !          2412: 
        !          2413: 
        !          2414:     ____________________________________________________
        !          2415: 
        !          2416:       (setf x 3)        =  (setq x 3)
        !          2417:       (setf (car x) 3)  = (rplaca x 3)
        !          2418:       (setf (get foo 'bar) 3) = (putprop foo 3 'bar)
        !          2419:       (setf (vref vector index) value) = (vset vector index value)
        !          2420:     ____________________________________________________
        !          2421: 
        !          2422: 
        !          2423: 
        !          2424: 
        !          2425: 
        !          2426: 9
        !          2427: 
        !          2428: 9                                   Printed: January 31, 1984
        !          2429: 
        !          2430: 
        !          2431: 
        !          2432: 
        !          2433: 
        !          2434: 
        !          2435: 
        !          2436: Data Structure Access                                   2-38
        !          2437: 
        !          2438: 
        !          2439: (sort 'l_data 'u_comparefn)
        !          2440: 
        !          2441:      RETURNS: a list of the elements of  l_data  ordered  by
        !          2442:               the comparison function u_comparefn.
        !          2443: 
        !          2444:      SIDE EFFECT: the list l_data is  modified  rather  than
        !          2445:                   allocated in new storage.
        !          2446: 
        !          2447:      NOTE: (_c_o_m_p_a_r_e_f_n '_g__x  '_g__y)  should  return  something
        !          2448:            non-nil  if  g_x can precede g_y in sorted order;
        !          2449:            nil if g_y must precede g_x.  If  u_comparefn  is
        !          2450:            nil, alphabetical order will be used.
        !          2451: 
        !          2452: (sortcar 'l_list 'u_comparefn)
        !          2453: 
        !          2454:      RETURNS: a list of the  elements  of  l_list  with  the
        !          2455:               _c_a_r's    ordered    by   the   sort   function
        !          2456:               u_comparefn.
        !          2457: 
        !          2458:      SIDE EFFECT: the list l_list is  modified  rather  than
        !          2459:                   copied.
        !          2460: 
        !          2461:      NOTE: Like _s_o_r_t, if u_comparefn  is  nil,  alphabetical
        !          2462:            order will be used.
        !          2463: 
        !          2464: 
        !          2465: 
        !          2466: 
        !          2467: 
        !          2468: 
        !          2469: 
        !          2470: 
        !          2471: 
        !          2472: 
        !          2473: 
        !          2474: 
        !          2475: 
        !          2476: 
        !          2477: 
        !          2478: 
        !          2479: 
        !          2480: 
        !          2481: 
        !          2482: 
        !          2483: 
        !          2484: 
        !          2485: 
        !          2486: 
        !          2487: 
        !          2488: 
        !          2489: 
        !          2490: 
        !          2491: 9
        !          2492: 
        !          2493: 9                                   Printed: January 31, 1984
        !          2494: 
        !          2495: 
        !          2496: 

unix.superglobalmegacorp.com

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