Annotation of 42BSD/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: August 5, 1983
        !           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: August 5, 1983
        !           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.
        !           209: 
        !           210: (listp 'g_arg)
        !           211: 
        !           212:      RETURNS: t iff g_arg is a list object or nil.
        !           213: 
        !           214: (tailp 'l_x 'l_y)
        !           215: 
        !           216:      RETURNS: l_x, if a list cell _e_q  to  l_x  is  found  by
        !           217:               _c_d_ring down l_y zero or more times, nil other-
        !           218:               wise.
        !           219: 
        !           220: 
        !           221:     ____________________________________________________
        !           222: 
        !           223:     -> (_s_e_t_q _x '(_a _b _c _d) _y (_c_d_d_r _x))
        !           224:     (c d)
        !           225:     -> (_a_n_d (_d_t_p_r _x) (_l_i_s_t_p _x))     ; x and y are dtprs and lists
        !           226:     t
        !           227:     -> (_d_t_p_r '())           ; () is the same as nil and is not a dtpr
        !           228:     nil
        !           229:     -> (_l_i_s_t_p '())          ; however it is a list
        !           230:     t
        !           231:     -> (_t_a_i_l_p _y _x)
        !           232:     (c d)
        !           233:     ____________________________________________________
        !           234: 
        !           235: 
        !           236: 
        !           237: 
        !           238: (length 'l_arg)
        !           239: 
        !           240:      RETURNS: the number of elements in  the  top  level  of
        !           241:               list l_arg.
        !           242: 
        !           243: 
        !           244: 
        !           245:       2.1.3.  list accessing
        !           246: 
        !           247: 
        !           248: 
        !           249: 
        !           250: 
        !           251: 
        !           252: 
        !           253: 
        !           254: 
        !           255: 
        !           256: 9
        !           257: 
        !           258: 9                                     Printed: August 5, 1983
        !           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 seems to bother few.
        !           276: 
        !           277: (c..r 'lh_arg)
        !           278: 
        !           279:      WHERE:   the .. represents any positive number  of  a's
        !           280:               and d's.
        !           281: 
        !           282:      RETURNS: the result of accessing the list structure  in
        !           283:               the  way determined by the function name.  The
        !           284:               a's and d's are read from right to left,  a  d
        !           285:               directing  the access down the cdr part of the
        !           286:               list cell and an a down the car part.
        !           287: 
        !           288:      NOTE: lh_arg may also be nil, and it is guaranteed that
        !           289:            the  car  and  cdr of nil is nil.  If lh_arg is a
        !           290:            hunk,  then  (_c_a_r '_l_h__a_r_g)   is   the   same   as
        !           291:            (_c_x_r _1 '_l_h__a_r_g) and  (_c_d_r '_l_h__a_r_g) is the same as
        !           292:            (_c_x_r _0 '_l_h__a_r_g).
        !           293:            It is generally hard to read and  understand  the
        !           294:            context  of  functions  with large strings of a's
        !           295:            and d's, but these  functions  are  supported  by
        !           296:            rapid  accessing  and open-compiling (see Chapter
        !           297:            12).
        !           298: 
        !           299: (nth 'x_index 'l_list)
        !           300: 
        !           301:      RETURNS: the nth element of l_list, assuming zero-based
        !           302:               index.   Thus  (nth  0  l_list) is the same as
        !           303:               (car l_list).  _n_t_h is both a function,  and  a
        !           304:               compiler  macro,  so  that more efficient code
        !           305:               might be generated than for _n_t_h_e_l_e_m (described
        !           306:               below).
        !           307: 
        !           308:      NOTE: If x_arg1 is non-positive  or  greater  than  the
        !           309:            length of the list, nil is returned.
        !           310: 
        !           311: 
        !           312: 
        !           313: 
        !           314: 
        !           315: 
        !           316: 
        !           317: 
        !           318: 
        !           319: 
        !           320: 
        !           321: 9
        !           322: 
        !           323: 9                                     Printed: August 5, 1983
        !           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: August 5, 1983
        !           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: August 5, 1983
        !           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: August 5, 1983
        !           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: August 5, 1983
        !           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: August 5, 1983
        !           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: the name of this function is a throwback  to  the
        !           698:            PDP-11 Lisp system.
        !           699: 
        !           700: (bigp 'g_arg)
        !           701: 
        !           702:      RETURNS: t iff g_arg is a bignum.
        !           703: 
        !           704: 
        !           705: 
        !           706: 
        !           707: 
        !           708: 
        !           709: 
        !           710: 
        !           711: 9
        !           712: 
        !           713: 9                                     Printed: August 5, 1983
        !           714: 
        !           715: 
        !           716: 
        !           717: 
        !           718: 
        !           719: 
        !           720: 
        !           721: Data Structure Access                                   2-12
        !           722: 
        !           723: 
        !           724: (dtpr 'g_arg)
        !           725: 
        !           726:      RETURNS: t iff g_arg is a list cell.
        !           727: 
        !           728:      NOTE: that (dtpr '()) is nil.
        !           729: 
        !           730: (hunkp 'g_arg)
        !           731: 
        !           732:      RETURNS: t iff g_arg is a hunk.
        !           733: 
        !           734: (listp 'g_arg)
        !           735: 
        !           736:      RETURNS: t iff g_arg is a list object or nil.
        !           737: 
        !           738: (stringp 'g_arg)
        !           739: 
        !           740:      RETURNS: t iff g_arg is a string.
        !           741: 
        !           742: (symbolp 'g_arg)
        !           743: 
        !           744:      RETURNS: t iff g_arg is a symbol.
        !           745: 
        !           746: (valuep 'g_arg)
        !           747: 
        !           748:      RETURNS: t iff g_arg is a value cell
        !           749: 
        !           750: (vectorp 'v_vector)
        !           751: 
        !           752:      RETURNS: t iff the argument is a vector.
        !           753: 
        !           754: (vectorip 'v_vector)
        !           755: 
        !           756:      RETURNS: t iff the argument is an immediate-vector.
        !           757: 
        !           758: (type 'g_arg)
        !           759: (typep 'g_arg)
        !           760: 
        !           761:      RETURNS: a symbol whose pname  describes  the  type  of
        !           762:               g_arg.
        !           763: 
        !           764: (signp s_test 'g_val)
        !           765: 
        !           766:      RETURNS: t iff g_val is a number  and  the  given  test
        !           767:               s_test on g_val returns true.
        !           768: 
        !           769:      NOTE: The fact that _s_i_g_n_p simply returns nil  if  g_val
        !           770:            is  not  a  number is probably the most important
        !           771:            reason that _s_i_g_n_p is used.  The permitted  values
        !           772:            for  s_test  and what they mean are given in this
        !           773:            table.
        !           774: 
        !           775: 9
        !           776: 
        !           777: 
        !           778: 9                                     Printed: August 5, 1983
        !           779: 
        !           780: 
        !           781: 
        !           782: 
        !           783: 
        !           784: 
        !           785: 
        !           786: Data Structure Access                                   2-13
        !           787: 
        !           788: 
        !           789: 8                         ____________________
        !           790:                           s_test   tested
        !           791: 
        !           792: 8                         ________________________________________
        !           793:                           l        g_val < 0
        !           794:                           le       g_val <_ 0
        !           795:                           e        g_val = 0
        !           796:                           n        g_val =/ 0
        !           797:                           ge       g_val >_ 0
        !           798:                           g        g_val > 0
        !           799: 8                         ____________________
        !           800: 7                        |7|7|7|7|7|7|7|7|
        !           801: 
        !           802: 
        !           803: 
        !           804: 
        !           805: 
        !           806: 
        !           807: 
        !           808:                                             |7|7|7|7|7|7|7|7|
        !           809: 
        !           810: 
        !           811: 
        !           812: 
        !           813: 
        !           814: 
        !           815: 
        !           816: 
        !           817: 
        !           818: 
        !           819: (eq 'g_arg1 'g_arg2)
        !           820: 
        !           821:      RETURNS: t if g_arg1 and g_arg2 are the exact same lisp
        !           822:               object.
        !           823: 
        !           824:      NOTE: _E_q simply tests if g_arg1 and g_arg2 are  located
        !           825:            in  the exact same place in memory.  Lisp objects
        !           826:            which print the same are not necessarily _e_q.  The
        !           827:            only  objects  guaranteed  to  be _e_q are interned
        !           828:            symbols with the same print name.  [Unless a sym-
        !           829:            bol  is  created  in  a special way (such as with
        !           830:            _u_c_o_n_c_a_t or _m_a_k_n_a_m) it will be interned.]
        !           831: 
        !           832: (neq 'g_x 'g_y)
        !           833: 
        !           834:      RETURNS: t if g_x is not _e_q to g_y, otherwise nil.
        !           835: 
        !           836: (equal 'g_arg1 'g_arg2)
        !           837: (eqstr 'g_arg1 'g_arg2)
        !           838: 
        !           839:      RETURNS: t iff g_arg1 and g_arg2 have the  same  struc-
        !           840:               ture as described below.
        !           841: 
        !           842:      NOTE: g_arg and g_arg2 are _e_q_u_a_l if
        !           843: 
        !           844:      (1)  they are _e_q.
        !           845: 
        !           846:      (2)  they are both fixnums with the same value
        !           847: 
        !           848:      (3)  they are both flonums with the same value
        !           849: 
        !           850:      (4)  they are both bignums with the same value
        !           851: 
        !           852:      (5)  they are both strings and are identical.
        !           853: 
        !           854:      (6)  they are both lists and their cars  and  cdrs  are
        !           855:           _e_q_u_a_l.
        !           856: 
        !           857: 
        !           858: 
        !           859: 
        !           860: 
        !           861: 
        !           862: 9                                     Printed: August 5, 1983
        !           863: 
        !           864: 
        !           865: 
        !           866: 
        !           867: 
        !           868: 
        !           869: 
        !           870: Data Structure Access                                   2-14
        !           871: 
        !           872: 
        !           873: 
        !           874:     ____________________________________________________
        !           875: 
        !           876:     ; _e_q is much faster than _e_q_u_a_l, especially in compiled code,
        !           877:     ; however you cannot use _e_q to test for equality of numbers outside
        !           878:     ; of the range -1024 to 1023.  _e_q_u_a_l will always work.
        !           879:     -> (_e_q _1_0_2_3 _1_0_2_3)
        !           880:     t
        !           881:     -> (_e_q _1_0_2_4 _1_0_2_4)
        !           882:     nil
        !           883:     -> (_e_q_u_a_l _1_0_2_4 _1_0_2_4)
        !           884:     t
        !           885:     ____________________________________________________
        !           886: 
        !           887: 
        !           888: 
        !           889: 
        !           890: 
        !           891: (not 'g_arg)
        !           892: (null 'g_arg)
        !           893: 
        !           894:      RETURNS: t iff g_arg is nil.
        !           895: 
        !           896: 
        !           897: (member 'g_arg1 'l_arg2)
        !           898: (memq 'g_arg1 'l_arg2)
        !           899: 
        !           900:      RETURNS: that part of the  l_arg2  beginning  with  the
        !           901:               first  occurrence of g_arg1.  If g_arg1 is not
        !           902:               in the top level of l_arg2, nil is returned.
        !           903: 
        !           904:      NOTE: _m_e_m_b_e_r tests for equality with _e_q_u_a_l, _m_e_m_q  tests
        !           905:            for equality with _e_q.
        !           906: 
        !           907: 
        !           908: 
        !           909: 
        !           910:    2.3.  Symbols and Strings
        !           911: 
        !           912:            In many of the following functions  the  distinc-
        !           913:       tion  between symbols and strings is somewhat blurred.
        !           914:       To remind ourselves of the difference, a string  is  a
        !           915:       null terminated sequence of characters, stored as com-
        !           916:       pactly as possible.  Strings are used as constants  in
        !           917:       FRANZ  LISP.   They  _e_v_a_l to themselves.  A symbol has
        !           918:       additional structure: a value, property list, function
        !           919:       binding,  as  well  as its external representation (or
        !           920:       print-name).  If a symbol  is  given  to  one  of  the
        !           921:       string  manipulation  functions  below, its print name
        !           922:       will be used.
        !           923: 
        !           924:            Another popular way to represent strings in  Lisp
        !           925:       is  as  a  list of fixnums which represent characters.
        !           926: 
        !           927: 
        !           928:                                      Printed: August 5, 1983
        !           929: 
        !           930: 
        !           931: 
        !           932: 
        !           933: 
        !           934: 
        !           935: 
        !           936: Data Structure Access                                   2-15
        !           937: 
        !           938: 
        !           939:       The suffix 'n' to a string manipulation function indi-
        !           940:       cates that it returns a string in this form.
        !           941: 
        !           942: 
        !           943: 
        !           944:       2.3.1.  symbol and string creation
        !           945: 
        !           946: (concat ['stn_arg1 ... ])
        !           947: (uconcat ['stn_arg1 ... ])
        !           948: 
        !           949:      RETURNS: a symbol whose print name  is  the  result  of
        !           950:               concatenating  the print names, string charac-
        !           951:               ters  or  numerical  representations  of   the
        !           952:               sn_arg_i.
        !           953: 
        !           954:      NOTE: If no arguments are given, a symbol with  a  null
        !           955:            pname  is  returned.   _c_o_n_c_a_t  places  the symbol
        !           956:            created on the oblist, the function _u_c_o_n_c_a_t  does
        !           957:            the  same thing but does not place the new symbol
        !           958:            on the oblist.
        !           959: 
        !           960:      EXAMPLE: (_c_o_n_c_a_t '_a_b_c (_a_d_d _3 _4) "_d_e_f") = abc7def
        !           961: 
        !           962: (concatl 'l_arg)
        !           963: 
        !           964:      EQUIVALENT TO: (_a_p_p_l_y '_c_o_n_c_a_t '_l__a_r_g)
        !           965: 
        !           966: 
        !           967: (implode 'l_arg)
        !           968: (maknam 'l_arg)
        !           969: 
        !           970:      WHERE:   l_arg is a list of symbols, strings and  small
        !           971:               fixnums.
        !           972: 
        !           973:      RETURNS: The symbol whose print name is the  result  of
        !           974:               concatenating  the  first  characters  of  the
        !           975:               print names of the symbols and strings in  the
        !           976:               list.    Any  fixnums  are  converted  to  the
        !           977:               equivalent ascii character.  In order to  con-
        !           978:               catenate  entire  strings  or print names, use
        !           979:               the function _c_o_n_c_a_t.
        !           980: 
        !           981:      NOTE: _i_m_p_l_o_d_e interns the  symbol  it  creates,  _m_a_k_n_a_m
        !           982:            does not.
        !           983: 
        !           984: 
        !           985: 
        !           986: 
        !           987: 
        !           988: 
        !           989: 
        !           990: 
        !           991: 9
        !           992: 
        !           993: 9                                     Printed: August 5, 1983
        !           994: 
        !           995: 
        !           996: 
        !           997: 
        !           998: 
        !           999: 
        !          1000: 
        !          1001: Data Structure Access                                   2-16
        !          1002: 
        !          1003: 
        !          1004: (gensym ['s_leader])
        !          1005: 
        !          1006:      RETURNS: a new uninterned atom beginning with the first
        !          1007:               character  of  s_leader's  pname, or beginning
        !          1008:               with g if s_leader is not given.
        !          1009: 
        !          1010:      NOTE: The  symbol  looks  like  x0nnnnn  where   x   is
        !          1011:            s_leader's  first  character  and  nnnnn  is  the
        !          1012:            number of times you have called gensym.
        !          1013: 
        !          1014: (copysymbol 's_arg 'g_pred)
        !          1015: 
        !          1016:      RETURNS: an uninterned symbol with the same print  name
        !          1017:               as  s_arg.   If  g_pred  is  non nil, then the
        !          1018:               value, function binding and property  list  of
        !          1019:               the new symbol are made _e_q to those of s_arg.
        !          1020: 
        !          1021: 
        !          1022: (ascii 'x_charnum)
        !          1023: 
        !          1024:      WHERE:   x_charnum is between 0 and 255.
        !          1025: 
        !          1026:      RETURNS: a symbol whose print name is the single  char-
        !          1027:               acter    whose    fixnum   representation   is
        !          1028:               x_charnum.
        !          1029: 
        !          1030: 
        !          1031: (intern 's_arg)
        !          1032: 
        !          1033:      RETURNS: s_arg
        !          1034: 
        !          1035:      SIDE EFFECT: s_arg is put on the oblist if  it  is  not
        !          1036:                   already there.
        !          1037: 
        !          1038: (remob 's_symbol)
        !          1039: 
        !          1040:      RETURNS: s_symbol
        !          1041: 
        !          1042:      SIDE EFFECT: s_symbol is removed from the oblist.
        !          1043: 
        !          1044: (rematom 's_arg)
        !          1045: 
        !          1046:      RETURNS: t if s_arg is indeed an atom.
        !          1047: 
        !          1048:      SIDE EFFECT: s_arg is  put  on  the  free  atoms  list,
        !          1049:                   effectively reclaiming an atom cell.
        !          1050: 
        !          1051:      NOTE: This function does _n_o_t check to see if  s_arg  is
        !          1052:            on  the  oblist  or is referenced anywhere.  Thus
        !          1053:            calling _r_e_m_a_t_o_m on an  atom  in  the  oblist  may
        !          1054:            result in disaster when that atom cell is reused!
        !          1055: 
        !          1056: 9
        !          1057: 
        !          1058: 9                                     Printed: August 5, 1983
        !          1059: 
        !          1060: 
        !          1061: 
        !          1062: 
        !          1063: 
        !          1064: 
        !          1065: 
        !          1066: Data Structure Access                                   2-17
        !          1067: 
        !          1068: 
        !          1069:       2.3.2.  string and symbol predicates
        !          1070: 
        !          1071: (boundp 's_name)
        !          1072: 
        !          1073:      RETURNS: nil  if s_name is  unbound,  that  is  it  has
        !          1074:               never  be  given  a  value.  If x_name has the
        !          1075:               value g_val, then (nil . g_val) is returned.
        !          1076: 
        !          1077: (alphalessp 'st_arg1 'st_arg2)
        !          1078: 
        !          1079:      RETURNS: t iff the `name' of st_arg1 is  alphabetically
        !          1080:               less  than the name of st_arg2. If st_arg is a
        !          1081:               symbol then its `name' is its print name.   If
        !          1082:               st_arg  is  a  string,  then its `name' is the
        !          1083:               string itself.
        !          1084: 
        !          1085: 
        !          1086: 
        !          1087:       2.3.3.  symbol and string accessing
        !          1088: 
        !          1089: (symeval 's_arg)
        !          1090: 
        !          1091:      RETURNS: the value of symbol s_arg.
        !          1092: 
        !          1093:      NOTE: It is illegal to ask for the value of an  unbound
        !          1094:            symbol.   This  function  has  the same effect as
        !          1095:            _e_v_a_l, but compiles into much more efficient code.
        !          1096: 
        !          1097: (get_pname 's_arg)
        !          1098: 
        !          1099:      RETURNS: the string which is the print name of s_arg.
        !          1100: 
        !          1101: (plist 's_arg)
        !          1102: 
        !          1103:      RETURNS: the property list of s_arg.
        !          1104: 
        !          1105: (getd 's_arg)
        !          1106: 
        !          1107:      RETURNS: the function definition of  s_arg  or  nil  if
        !          1108:               there is no function definition.
        !          1109: 
        !          1110:      NOTE: the function definition may turn  out  to  be  an
        !          1111:            array header.
        !          1112: 
        !          1113: 
        !          1114: 
        !          1115: 
        !          1116: 
        !          1117: 
        !          1118: 
        !          1119: 
        !          1120: 
        !          1121: 9
        !          1122: 
        !          1123: 9                                     Printed: August 5, 1983
        !          1124: 
        !          1125: 
        !          1126: 
        !          1127: 
        !          1128: 
        !          1129: 
        !          1130: 
        !          1131: Data Structure Access                                   2-18
        !          1132: 
        !          1133: 
        !          1134: (getchar 's_arg 'x_index)
        !          1135: (nthchar 's_arg 'x_index)
        !          1136: (getcharn 's_arg 'x_index)
        !          1137: 
        !          1138:      RETURNS: the x_index_t_h character of the print  name  of
        !          1139:               s_arg  or  nil  if  x_index  is less than 1 or
        !          1140:               greater than the length of s_arg's print name.
        !          1141: 
        !          1142:      NOTE: _g_e_t_c_h_a_r and _n_t_h_c_h_a_r return a symbol with a single
        !          1143:            character print name, _g_e_t_c_h_a_r_n returns the fixnum
        !          1144:            representation of the character.
        !          1145: 
        !          1146: (substring 'st_string 'x_index ['x_length])
        !          1147: (substringn 'st_string 'x_index ['x_length])
        !          1148: 
        !          1149:      RETURNS: a string of length at most  x_length  starting
        !          1150:               at x_index_t_h character in the string.
        !          1151: 
        !          1152:      NOTE: If x_length is not given, all of  the  characters
        !          1153:            for   x_index  to  the  end  of  the  string  are
        !          1154:            returned.  If  x_index  is  negative  the  string
        !          1155:            begins  at  the x_index_t_h character from the end.
        !          1156:            If x_index is out of bounds, nil is returned.
        !          1157: 
        !          1158:      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
        !          1159:            returns  a  list  of  fixnums.   If _s_u_b_s_t_r_i_n_g_n is
        !          1160:            given a 0 x_length argument then a single  fixnum
        !          1161:            which is the x_index_t_h character is returned.
        !          1162: 
        !          1163: 
        !          1164: 
        !          1165:       2.3.4.  symbol and string manipulation
        !          1166: 
        !          1167: (set 's_arg1 'g_arg2)
        !          1168: 
        !          1169:      RETURNS: g_arg2.
        !          1170: 
        !          1171:      SIDE EFFECT: the value of s_arg1 is set to g_arg2.
        !          1172: 
        !          1173: (setq s_atm1 'g_val1 [ s_atm2 'g_val2 ... ... ])
        !          1174: 
        !          1175:      WHERE:   the arguments are  pairs  of  atom  names  and
        !          1176:               expressions.
        !          1177: 
        !          1178:      RETURNS: the last g_val_i.
        !          1179: 
        !          1180:      SIDE EFFECT: each s_atm_i  is  set  to  have  the  value
        !          1181:                   g_val_i.
        !          1182: 
        !          1183:      NOTE: _s_e_t evaluates all of its arguments, _s_e_t_q does not
        !          1184:            evaluate the s_atm_i.
        !          1185: 
        !          1186: 9
        !          1187: 
        !          1188: 9                                     Printed: August 5, 1983
        !          1189: 
        !          1190: 
        !          1191: 
        !          1192: 
        !          1193: 
        !          1194: 
        !          1195: 
        !          1196: Data Structure Access                                   2-19
        !          1197: 
        !          1198: 
        !          1199: (desetq sl_pattern1 'g_exp1 [... ...])
        !          1200: 
        !          1201:      RETURNS: g_expn
        !          1202: 
        !          1203:      SIDE EFFECT: This  acts  just  like  _s_e_t_q  if  all  the
        !          1204:                   sl_pattern_i  are  symbols.  If sl_pattern_i
        !          1205:                   is a list then it   is  a  template  which
        !          1206:                   should  have  the same structure as g_exp_i
        !          1207:                   The symbols in sl_pattern are assigned  to
        !          1208:                   the corresponding parts of g_exp.
        !          1209: 
        !          1210:      EXAMPLE: (_d_e_s_e_t_q (_a _b (_c . _d)) '(_1 _2 (_3 _4 _5)))
        !          1211:               sets a to 1, b to 2, c to 3, and d to (4 5).
        !          1212: 
        !          1213: 
        !          1214: (setplist 's_atm 'l_plist)
        !          1215: 
        !          1216:      RETURNS: l_plist.
        !          1217: 
        !          1218:      SIDE EFFECT: the property  list  of  s_atm  is  set  to
        !          1219:                   l_plist.
        !          1220: 
        !          1221: (makunbound 's_arg)
        !          1222: 
        !          1223:      RETURNS: s_arg
        !          1224: 
        !          1225:      SIDE EFFECT: the value of s_arg is made `unbound'.   If
        !          1226:                   the interpreter attempts to evaluate s_arg
        !          1227:                   before it  is  again  given  a  value,  an
        !          1228:                   unbound variable error will occur.
        !          1229: 
        !          1230: (aexplode 's_arg)
        !          1231: (explode 'g_arg)
        !          1232: (aexplodec 's_arg)
        !          1233: (explodec 'g_arg)
        !          1234: (aexploden 's_arg)
        !          1235: (exploden 'g_arg)
        !          1236: 
        !          1237:      RETURNS: a list of the characters  used  to  print  out
        !          1238:               s_arg or g_arg.
        !          1239: 
        !          1240:      NOTE: The functions beginning  with  'a'  are  internal
        !          1241:            functions  which are limited to symbol arguments.
        !          1242:            The functions _a_e_x_p_l_o_d_e and _e_x_p_l_o_d_e return a  list
        !          1243:            of  characters which _p_r_i_n_t would use to print the
        !          1244:            argument. These characters include all  necessary
        !          1245:            escape   characters.    Functions  _a_e_x_p_l_o_d_e_c  and
        !          1246:            _e_x_p_l_o_d_e_c return a list of characters which  _p_a_t_o_m
        !          1247:            would  use  to print the argument (i.e. no escape
        !          1248:            characters).  Functions  _a_e_x_p_l_o_d_e_n  and  _e_x_p_l_o_d_e_n
        !          1249:            are similar to _a_e_x_p_l_o_d_e_c and _e_x_p_l_o_d_e_c except that
        !          1250:            a list of fixnum equivalents  of  characters  are
        !          1251:            returned.
        !          1252: 
        !          1253: 
        !          1254:                                      Printed: August 5, 1983
        !          1255: 
        !          1256: 
        !          1257: 
        !          1258: 
        !          1259: 
        !          1260: 
        !          1261: 
        !          1262: Data Structure Access                                   2-20
        !          1263: 
        !          1264: 
        !          1265: 
        !          1266:     ____________________________________________________
        !          1267: 
        !          1268:     -> (_s_e_t_q _x '|_q_u_o_t_e _t_h_i_s _\| _o_k?|)
        !          1269:     |quote this \| ok?|
        !          1270:     -> (_e_x_p_l_o_d_e _x)
        !          1271:     (q u o t e |\\| | | t h i s |\\| | | |\\| |\|| |\\| | | o k ?)
        !          1272:     ; note that |\\| just means the single character: backslash.
        !          1273:     ; and |\|| just means the single character: vertical bar
        !          1274:     ; and | | means the single character: space
        !          1275: 
        !          1276:     -> (_e_x_p_l_o_d_e_c _x)
        !          1277:     (q u o t e | | t h i s | | |\|| | | o k ?)
        !          1278:     -> (_e_x_p_l_o_d_e_n _x)
        !          1279:     (113 117 111 116 101 32 116 104 105 115 32 124 32 111 107 63)
        !          1280:     ____________________________________________________
        !          1281: 
        !          1282: 
        !          1283: 
        !          1284: 
        !          1285: 
        !          1286: 
        !          1287:    2.4.  Vectors
        !          1288: 
        !          1289:            See Chapter 9 for a discussion of vectors.   They
        !          1290:       are  intermediate  in  efficiency  between  arrays and
        !          1291:       hunks.
        !          1292: 
        !          1293: 
        !          1294: 
        !          1295:       2.4.1.  vector creation
        !          1296: 
        !          1297: (new-vector 'x_size ['g_fill ['g_prop]])
        !          1298: 
        !          1299:      RETURNS: A vector of length x_size.  Each data entry is
        !          1300:               initialized to g_fill, or to nil, if the argu-
        !          1301:               ment g_fill is not present.  The vector's pro-
        !          1302:               perty is set to g_prop, or to nil, by default.
        !          1303: 
        !          1304: (new-vectori-byte 'x_size ['g_fill ['g_prop]])
        !          1305: (new-vectori-word 'x_size ['g_fill ['g_prop]])
        !          1306: (new-vectori-long 'x_size ['g_fill ['g_prop]])
        !          1307: 
        !          1308:      RETURNS: A vectori with x_size  elements  in  it.   The
        !          1309:               actual  memory requirement is two long words +
        !          1310:               x_size*(n  bytes),  where  n  is  1  for  new-
        !          1311:               vector-byte,  2  for new-vector-word, or 4 for
        !          1312:               new-vectori-long.  Each data entry is initial-
        !          1313:               ized  to  g_fill,  or to zero, if the argument
        !          1314:               g_fill is not present.  The vector's  property
        !          1315:               is set to g_prop, or nil, by default.
        !          1316: 
        !          1317: 9
        !          1318: 
        !          1319: 9                                     Printed: August 5, 1983
        !          1320: 
        !          1321: 
        !          1322: 
        !          1323: 
        !          1324: 
        !          1325: 
        !          1326: 
        !          1327: Data Structure Access                                   2-21
        !          1328: 
        !          1329: 
        !          1330:      Vectors may be created by specifying  multiple  initial
        !          1331:      values:
        !          1332: 
        !          1333: (vector ['g_val0 'g_val1 ...])
        !          1334: 
        !          1335:      RETURNS: a vector, with as many data elements as  there
        !          1336:               are arguments.  It is quite possible to have a
        !          1337:               vector with no data  elements.   The  vector's
        !          1338:               property will be null.
        !          1339: 
        !          1340: (vectori-byte ['x_val0 'x_val2 ...])
        !          1341: (vectori-word ['x_val0 'x_val2 ...])
        !          1342: (vectori-long ['x_val0 'x_val2 ...])
        !          1343: 
        !          1344:      RETURNS: a vectori, with as many data elements as there
        !          1345:               are  arguments.  The arguments are required to
        !          1346:               be fixnums.  Only the low order byte  or  word
        !          1347:               is  used  in  the  case  of  vectori-byte  and
        !          1348:               vectori-word.  The vector's property  will  be
        !          1349:               null.
        !          1350: 
        !          1351: 
        !          1352: 
        !          1353:       2.4.2.  vector reference
        !          1354: 
        !          1355: (vref 'v_vect 'x_index)
        !          1356: (vrefi-byte 'V_vect 'x_bindex)
        !          1357: (vrefi-word 'V_vect 'x_windex)
        !          1358: (vrefi-long 'V_vect 'x_lindex)
        !          1359: 
        !          1360:      RETURNS: the desired data element from a  vector.   The
        !          1361:               indices  must  be  fixnums.  Indexing is zero-
        !          1362:               based.  The vrefi functions  sign  extend  the
        !          1363:               data.
        !          1364: 
        !          1365: (vprop 'Vv_vect)
        !          1366: 
        !          1367:      RETURNS: The Lisp property associated with a vector.
        !          1368: 
        !          1369: (vget 'Vv_vect 'g_ind)
        !          1370: 
        !          1371:      RETURNS: The value stored under g_ind if the Lisp  pro-
        !          1372:               perty  associated  with 'Vv_vect is a disembo-
        !          1373:               died property list.
        !          1374: 
        !          1375: 
        !          1376: 
        !          1377: 
        !          1378: 
        !          1379: 
        !          1380: 
        !          1381: 
        !          1382: 9
        !          1383: 
        !          1384: 9                                     Printed: August 5, 1983
        !          1385: 
        !          1386: 
        !          1387: 
        !          1388: 
        !          1389: 
        !          1390: 
        !          1391: 
        !          1392: Data Structure Access                                   2-22
        !          1393: 
        !          1394: 
        !          1395: (vsize 'Vv_vect)
        !          1396: (vsize-byte 'V_vect)
        !          1397: (vsize-word 'V_vect)
        !          1398: 
        !          1399:      RETURNS: the number of data  elements  in  the  vector.
        !          1400:               For  immediate-vectors,  the  functions vsize-
        !          1401:               byte and vsize-word return the number of  data
        !          1402:               elements,  if one thinks of the binary data as
        !          1403:               being comprised of bytes or words.
        !          1404: 
        !          1405: 
        !          1406: 
        !          1407:       2.4.3.  vector modfication
        !          1408: 
        !          1409: (vset 'v_vect 'x_index 'g_val)
        !          1410: (vseti-byte 'V_vect 'x_bindex 'x_val)
        !          1411: (vseti-word 'V_vect 'x_windex 'x_val)
        !          1412: (vseti-long 'V_vect 'x_lindex 'x_val)
        !          1413: 
        !          1414:      RETURNS: the datum.
        !          1415: 
        !          1416:      SIDE EFFECT: The indexed element of the vector  is  set
        !          1417:                   to  the value.  As noted above, for vseti-
        !          1418:                   word and vseti-byte,  the  index  is  con-
        !          1419:                   strued  as  the number of the data element
        !          1420:                   within the  vector.   It  is  not  a  byte
        !          1421:                   address.   Also,  for those two functions,
        !          1422:                   the low order byte or  word  of  x_val  is
        !          1423:                   what is stored.
        !          1424: 
        !          1425: (vsetprop 'Vv_vect 'g_value)
        !          1426: 
        !          1427:      RETURNS: g_value.  This should be either a symbol or  a
        !          1428:               disembodied  property list whose _c_a_r is a sym-
        !          1429:               bol identifying the type of the vector.
        !          1430: 
        !          1431:      SIDE EFFECT: the property list of  Vv_vect  is  set  to
        !          1432:                   g_value.
        !          1433: 
        !          1434: (vputprop 'Vv_vect 'g_value 'g_ind)
        !          1435: 
        !          1436:      RETURNS: g_value.
        !          1437: 
        !          1438:      SIDE EFFECT: If the vector property  of  Vv_vect  is  a
        !          1439:                   disembodied  property  list, then vputprop
        !          1440:                   adds the value g_value under the indicator
        !          1441:                   g_ind.  Otherwise, the old vector property
        !          1442:                   is made the first element of the list.
        !          1443: 
        !          1444: 
        !          1445: 
        !          1446: 
        !          1447: 9
        !          1448: 
        !          1449: 9                                     Printed: August 5, 1983
        !          1450: 
        !          1451: 
        !          1452: 
        !          1453: 
        !          1454: 
        !          1455: 
        !          1456: 
        !          1457: Data Structure Access                                   2-23
        !          1458: 
        !          1459: 
        !          1460:    2.5.  Arrays
        !          1461: 
        !          1462:            See Chapter  9  for  a  complete  description  of
        !          1463:       arrays.  Some of these functions are part of a Maclisp
        !          1464:       array compatibility package, which represents only one
        !          1465:       simple way of using the array structure of FRANZ LISP.
        !          1466: 
        !          1467: 
        !          1468: 
        !          1469:       2.5.1.  array creation
        !          1470: 
        !          1471: (marray 'g_data 's_access 'g_aux 'x_length 'x_delta)
        !          1472: 
        !          1473:      RETURNS: an array type with the fields set up from  the
        !          1474:               above  arguments  in  the  obvious  way  (see
        !          1475:               1.2.10).
        !          1476: 
        !          1477: (*array 's_name 's_type 'x_dim1 ... 'x_dim_n)
        !          1478: (array s_name s_type x_dim1 ... x_dim_n)
        !          1479: 
        !          1480:      WHERE:   s_type may be one of t, nil,  fixnum,  flonum,
        !          1481:               fixnum-block and flonum-block.
        !          1482: 
        !          1483:      RETURNS: an array of type s_type with n  dimensions  of
        !          1484:               extents given by the x_dim_i.
        !          1485: 
        !          1486:      SIDE EFFECT: If s_name is non nil, the function defini-
        !          1487:                   tion  of s_name is set to the array struc-
        !          1488:                   ture returned.
        !          1489: 
        !          1490:      NOTE: These  functions  create  a  Maclisp   compatible
        !          1491:            array.  In FRANZ LISP arrays of type t, nil, fix-
        !          1492:            num and flonum are equivalent and the elements of
        !          1493:            these  arrays  can  be  any  type of lisp object.
        !          1494:            Fixnum-block and  flonum-block  arrays  are  res-
        !          1495:            tricted  to  fixnums and flonums respectively and
        !          1496:            are used mainly to communicate with foreign func-
        !          1497:            tions (see 8.5).
        !          1498: 
        !          1499:      NOTE: *_a_r_r_a_y evaluates its arguments, _a_r_r_a_y does not.
        !          1500: 
        !          1501: 
        !          1502: 
        !          1503:       2.5.2.  array predicate
        !          1504: 
        !          1505: 
        !          1506: 
        !          1507: 
        !          1508: 
        !          1509: 
        !          1510: 
        !          1511: 
        !          1512: 9
        !          1513: 
        !          1514: 9                                     Printed: August 5, 1983
        !          1515: 
        !          1516: 
        !          1517: 
        !          1518: 
        !          1519: 
        !          1520: 
        !          1521: 
        !          1522: Data Structure Access                                   2-24
        !          1523: 
        !          1524: 
        !          1525: (arrayp 'g_arg)
        !          1526: 
        !          1527:      RETURNS: t iff g_arg is of type array.
        !          1528: 
        !          1529: 
        !          1530: 
        !          1531:       2.5.3.  array accessors
        !          1532: 
        !          1533: 
        !          1534: (getaccess 'a_array)
        !          1535: (getaux 'a_array)
        !          1536: (getdelta 'a_array)
        !          1537: (getdata 'a_array)
        !          1538: (getlength 'a_array)
        !          1539: 
        !          1540:      RETURNS: the field of the array object a_array given by
        !          1541:               the function name.
        !          1542: 
        !          1543: (arrayref 'a_name 'x_ind)
        !          1544: 
        !          1545:      RETURNS: the  x_ind_t_h  element  of  the  array   object
        !          1546:               a_name.  x_ind of zero accesses the first ele-
        !          1547:               ment.
        !          1548: 
        !          1549:      NOTE: _a_r_r_a_y_r_e_f uses the data, length and  delta  fields
        !          1550:            of a_name to determine which object to return.
        !          1551: 
        !          1552: (arraycall s_type 'as_array 'x_ind1 ... )
        !          1553: 
        !          1554:      RETURNS: the element selected by  the indicies from the
        !          1555:               array a_array of type s_type.
        !          1556: 
        !          1557:      NOTE: If as_array is a symbol then the function binding
        !          1558:            of this symbol should contain an array object.
        !          1559:            s_type is ignored by _a_r_r_a_y_c_a_l_l  but  is  included
        !          1560:            for compatibility with Maclisp.
        !          1561: 
        !          1562: (arraydims 's_name)
        !          1563: 
        !          1564:      RETURNS: a list of the type and  bounds  of  the  array
        !          1565:               s_name.
        !          1566: 
        !          1567: 
        !          1568: 
        !          1569: 
        !          1570: 
        !          1571: 
        !          1572: 
        !          1573: 
        !          1574: 
        !          1575: 
        !          1576: 
        !          1577: 9
        !          1578: 
        !          1579: 9                                     Printed: August 5, 1983
        !          1580: 
        !          1581: 
        !          1582: 
        !          1583: 
        !          1584: 
        !          1585: 
        !          1586: 
        !          1587: Data Structure Access                                   2-25
        !          1588: 
        !          1589: 
        !          1590: (listarray 'sa_array ['x_elements])
        !          1591: 
        !          1592:      RETURNS: a  list  of  all  of  the  elements  in  array
        !          1593:               sa_array.   If  x_elements is given, then only
        !          1594:               the first x_elements are returned.
        !          1595: 
        !          1596: 
        !          1597: 
        !          1598:     ____________________________________________________
        !          1599: 
        !          1600:     ; We will create a 3 by 4 array of general lisp objects
        !          1601:     -> (_a_r_r_a_y _e_r_n_i_e _t _3 _4)
        !          1602:     array[12]
        !          1603: 
        !          1604:     ; the array header is stored in the function definition slot of the
        !          1605:     ; symbol ernie
        !          1606:     -> (_a_r_r_a_y_p (_g_e_t_d '_e_r_n_i_e))
        !          1607:     t
        !          1608:     -> (_a_r_r_a_y_d_i_m_s (_g_e_t_d '_e_r_n_i_e))
        !          1609:     (t 3 4)
        !          1610: 
        !          1611:     ; store in ernie[2][2] the list (test list)
        !          1612:     -> (_s_t_o_r_e (_e_r_n_i_e _2 _2) '(_t_e_s_t _l_i_s_t))
        !          1613:     (test list)
        !          1614: 
        !          1615:     ; check to see if it is there
        !          1616:     -> (_e_r_n_i_e _2 _2)
        !          1617:     (test list)
        !          1618: 
        !          1619:     ; now use the low level function _a_r_r_a_y_r_e_f to find the same element
        !          1620:     ; arrays are 0 based and row-major (the last subscript varies the fastest)
        !          1621:     ; thus element [2][2] is the 10th element , (starting at 0).
        !          1622:     -> (_a_r_r_a_y_r_e_f (_g_e_t_d '_e_r_n_i_e) _1_0)
        !          1623:     (ptr to)(test list)    ; the result is a value cell (thus the (ptr to))
        !          1624:     ____________________________________________________
        !          1625: 
        !          1626: 
        !          1627: 
        !          1628: 
        !          1629: 
        !          1630: 
        !          1631:       2.5.4.  array manipulation
        !          1632: 
        !          1633: 
        !          1634: 
        !          1635: 
        !          1636: 
        !          1637: 
        !          1638: 
        !          1639: 
        !          1640: 
        !          1641: 
        !          1642: 9
        !          1643: 
        !          1644: 9                                     Printed: August 5, 1983
        !          1645: 
        !          1646: 
        !          1647: 
        !          1648: 
        !          1649: 
        !          1650: 
        !          1651: 
        !          1652: Data Structure Access                                   2-26
        !          1653: 
        !          1654: 
        !          1655: (putaccess 'a_array 'su_func)
        !          1656: (putaux 'a_array 'g_aux)
        !          1657: (putdata 'a_array 'g_arg)
        !          1658: (putdelta 'a_array 'x_delta)
        !          1659: (putlength 'a_array 'x_length)
        !          1660: 
        !          1661:      RETURNS: the second argument to the function.
        !          1662: 
        !          1663:      SIDE EFFECT: The field of the array object given by the
        !          1664:                   function  name  is  replaced by the second
        !          1665:                   argument to the function.
        !          1666: 
        !          1667: (store 'l_arexp 'g_val)
        !          1668: 
        !          1669:      WHERE:   l_arexp is an expression which  references  an
        !          1670:               array element.
        !          1671: 
        !          1672:      RETURNS: g_val
        !          1673: 
        !          1674:      SIDE EFFECT: the array location which contains the ele-
        !          1675:                   ment  which  l_arexp references is changed
        !          1676:                   to contain g_val.
        !          1677: 
        !          1678: (fillarray 's_array 'l_itms)
        !          1679: 
        !          1680:      RETURNS: s_array
        !          1681: 
        !          1682:      SIDE EFFECT: the array s_array is filled with  elements
        !          1683:                   from l_itms.  If there are not enough ele-
        !          1684:                   ments in l_itms to fill the entire  array,
        !          1685:                   then the last element of l_itms is used to
        !          1686:                   fill the remaining parts of the array.
        !          1687: 
        !          1688: 
        !          1689: 
        !          1690:    2.6.  Hunks
        !          1691: 
        !          1692:            Hunks are  vector-like  objects  whose  size  can
        !          1693:       range  from  1  to 128 elements.  Internally hunks are
        !          1694:       allocated in sizes which are powers of 2.  In order to
        !          1695:       create  hunks  of  a  given size, a hunk with at least
        !          1696:       that many elements is allocated  and  a  distinguished
        !          1697:       symbol   EMPTY   is   placed  in  those  elements  not
        !          1698:       requested.  Most hunk  functions  respect  those  dis-
        !          1699:       tinguished  symbols,  but  there are two (*_m_a_k_h_u_n_k and
        !          1700:       *_r_p_l_a_c_x) which will overwrite the  distinguished  sym-
        !          1701:       bol.
        !          1702: 
        !          1703: 
        !          1704: 
        !          1705: 
        !          1706: 
        !          1707: 9
        !          1708: 
        !          1709: 9                                     Printed: August 5, 1983
        !          1710: 
        !          1711: 
        !          1712: 
        !          1713: 
        !          1714: 
        !          1715: 
        !          1716: 
        !          1717: Data Structure Access                                   2-27
        !          1718: 
        !          1719: 
        !          1720:       2.6.1.  hunk creation
        !          1721: 
        !          1722: (hunk 'g_val1 ['g_val2 ... 'g_val_n])
        !          1723: 
        !          1724:      RETURNS: a hunk of length n whose elements are initial-
        !          1725:               ized to the g_val_i.
        !          1726: 
        !          1727:      NOTE: the maximum size of a hunk is 128.
        !          1728: 
        !          1729:      EXAMPLE: (_h_u_n_k _4 '_s_h_a_r_p '_k_e_y_s) = {4 sharp keys}
        !          1730: 
        !          1731: (makhunk 'xl_arg)
        !          1732: 
        !          1733:      RETURNS: a hunk of length  xl_arg  initialized  to  all
        !          1734:               nils  if  xl_arg  is a fixnum.  If xl_arg is a
        !          1735:               list,  then  we  return   a   hunk   of   size
        !          1736:               (_l_e_n_g_t_h '_x_l__a_r_g)  initialized  to the elements
        !          1737:               in xl_arg.
        !          1738: 
        !          1739:      NOTE: (_m_a_k_h_u_n_k '(_a _b _c))     is      equivalent      to
        !          1740:            (_h_u_n_k '_a '_b '_c).
        !          1741: 
        !          1742:      EXAMPLE: (_m_a_k_h_u_n_k _4) = {_n_i_l _n_i_l _n_i_l _n_i_l}
        !          1743: 
        !          1744: (*makhunk 'x_arg)
        !          1745: 
        !          1746:      RETURNS: a hunk of size 2[x_arg] initialized to EMPTY.
        !          1747: 
        !          1748:      NOTE: This is only to be used by such functions as _h_u_n_k
        !          1749:            and _m_a_k_h_u_n_k which create and initialize hunks for
        !          1750:            users.
        !          1751: 
        !          1752: 
        !          1753: 
        !          1754:       2.6.2.  hunk accessor
        !          1755: 
        !          1756: (cxr 'x_ind 'h_hunk)
        !          1757: 
        !          1758:      RETURNS: element x_ind (starting at 0) of hunk h_hunk.
        !          1759: 
        !          1760: (hunk-to-list 'h_hunk)
        !          1761: 
        !          1762:      RETURNS: a list consisting of the elements of h_hunk.
        !          1763: 
        !          1764: 
        !          1765: 
        !          1766:       2.6.3.  hunk manipulators
        !          1767: 
        !          1768: 
        !          1769: 
        !          1770: 
        !          1771: 
        !          1772: 9
        !          1773: 
        !          1774: 9                                     Printed: August 5, 1983
        !          1775: 
        !          1776: 
        !          1777: 
        !          1778: 
        !          1779: 
        !          1780: 
        !          1781: 
        !          1782: Data Structure Access                                   2-28
        !          1783: 
        !          1784: 
        !          1785: (rplacx 'x_ind 'h_hunk 'g_val)
        !          1786: (*rplacx 'x_ind 'h_hunk 'g_val)
        !          1787: 
        !          1788:      RETURNS: h_hunk
        !          1789: 
        !          1790:      SIDE EFFECT: Element x_ind (starting at 0) of h_hunk is
        !          1791:                   set to g_val.
        !          1792: 
        !          1793:      NOTE: _r_p_l_a_c_x will not modify one of  the  distinguished
        !          1794:            (EMPTY) elements whereas *_r_p_l_a_c_x will.
        !          1795: 
        !          1796: (hunksize 'h_arg)
        !          1797: 
        !          1798:      RETURNS: the size of the hunk h_arg.
        !          1799: 
        !          1800:      EXAMPLE: (_h_u_n_k_s_i_z_e (_h_u_n_k _1 _2 _3)) = 3
        !          1801: 
        !          1802: 
        !          1803: 
        !          1804:    2.7.  Bcds
        !          1805: 
        !          1806:            A bcd object contains a pointer to compiled  code
        !          1807:       and  to  the type of function object the compiled code
        !          1808:       represents.
        !          1809: 
        !          1810: (getdisc 'y_bcd)
        !          1811: (getentry 'y_bcd)
        !          1812: 
        !          1813:      RETURNS: the field of the bcd object given by the func-
        !          1814:               tion name.
        !          1815: 
        !          1816: (putdisc 'y_func 's_discipline)
        !          1817: 
        !          1818:      RETURNS: s_discipline
        !          1819: 
        !          1820:      SIDE EFFECT: Sets the discipline  field  of  y_func  to
        !          1821:                   s_discipline.
        !          1822: 
        !          1823: 
        !          1824: 
        !          1825:    2.8.  Structures
        !          1826: 
        !          1827:            There are three common structures constructed out
        !          1828:       of  list  cells: the assoc list, the property list and
        !          1829:       the tconc list.  The functions below manipulate  these
        !          1830:       structures.
        !          1831: 
        !          1832: 
        !          1833: 
        !          1834:       2.8.1.  assoc list
        !          1835: 
        !          1836:               An `assoc list' (or alist) is  a  common  lisp
        !          1837:          data structure.  It has the form
        !          1838: 
        !          1839: 
        !          1840:                                      Printed: August 5, 1983
        !          1841: 
        !          1842: 
        !          1843: 
        !          1844: 
        !          1845: 
        !          1846: 
        !          1847: 
        !          1848: Data Structure Access                                   2-29
        !          1849: 
        !          1850: 
        !          1851:          ((key1 . value1) (key2 . value2) (key3 . value3) ... (keyn . valuen))
        !          1852: 
        !          1853: (assoc 'g_arg1 'l_arg2)
        !          1854: (assq 'g_arg1 'l_arg2)
        !          1855: 
        !          1856:      RETURNS: the first top level element  of  l_arg2  whose
        !          1857:               _c_a_r is _e_q_u_a_l (with _a_s_s_o_c) or _e_q (with _a_s_s_q) to
        !          1858:               g_arg1.
        !          1859: 
        !          1860:      NOTE: Usually l_arg2 has an _a-_l_i_s_t structure and g_arg1
        !          1861:            acts as key.
        !          1862: 
        !          1863: (sassoc 'g_arg1 'l_arg2 'sl_func)
        !          1864: 
        !          1865:      RETURNS: the                 result                  of
        !          1866:               (_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)))
        !          1867: 
        !          1868:      NOTE: sassoc is written as a macro.
        !          1869: 
        !          1870: (sassq 'g_arg1 'l_arg2 'sl_func)
        !          1871: 
        !          1872:      RETURNS: the                 result                  of
        !          1873:               (_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)))
        !          1874: 
        !          1875:      NOTE: sassq is written as a macro.
        !          1876: 
        !          1877: 
        !          1878: 
        !          1879:     ____________________________________________________
        !          1880: 
        !          1881:     ; _a_s_s_o_c or _a_s_s_q is given a key and an assoc list and returns
        !          1882:     ; the key and value item if it exists, they differ only in how they test
        !          1883:     ; for equality of the keys.
        !          1884: 
        !          1885:     -> (_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)))
        !          1886:     ((alpha . a) ((complex key) . b) (junk . x))
        !          1887: 
        !          1888:     ; we should use _a_s_s_q when the key is an atom
        !          1889:     -> (_a_s_s_q '_a_l_p_h_a _a_l_i_s_t)
        !          1890:     (alpha . a)
        !          1891: 
        !          1892:     ; but it may not work when the key is a list
        !          1893:     -> (_a_s_s_q '(_c_o_m_p_l_e_x _k_e_y) _a_l_i_s_t)
        !          1894:     nil
        !          1895: 
        !          1896:     ; however _a_s_s_o_c will always work
        !          1897:     -> (_a_s_s_o_c '(_c_o_m_p_l_e_x _k_e_y) _a_l_i_s_t)
        !          1898:     ((complex key) . b)
        !          1899:     ____________________________________________________
        !          1900: 
        !          1901: 
        !          1902: 
        !          1903: 9
        !          1904: 
        !          1905: 9                                     Printed: August 5, 1983
        !          1906: 
        !          1907: 
        !          1908: 
        !          1909: 
        !          1910: 
        !          1911: 
        !          1912: 
        !          1913: Data Structure Access                                   2-30
        !          1914: 
        !          1915: 
        !          1916: (sublis 'l_alst 'l_exp)
        !          1917: 
        !          1918:      WHERE:   l_alst is an _a-_l_i_s_t.
        !          1919: 
        !          1920:      RETURNS: the list l_exp with every occurrence  of  key_i
        !          1921:               replaced by val_i.
        !          1922: 
        !          1923:      NOTE: new list structure is returned to prevent modifi-
        !          1924:            cation  of l_exp.  When a substitution is made, a
        !          1925:            copy of the value to substitute in is not made.
        !          1926: 
        !          1927: 
        !          1928: 
        !          1929:       2.8.2.  property list
        !          1930: 
        !          1931:               A property list  consists  of  an  alternating
        !          1932:          sequence  of  keys and values.  Normally a property
        !          1933:          list is stored on a symbol. A list is  a  'disembo-
        !          1934:          died' property list if it contains an odd number of
        !          1935:          elements, the first of which is ignored.
        !          1936: 
        !          1937: (plist 's_name)
        !          1938: 
        !          1939:      RETURNS: the property list of s_name.
        !          1940: 
        !          1941: (setplist 's_atm 'l_plist)
        !          1942: 
        !          1943:      RETURNS: l_plist.
        !          1944: 
        !          1945:      SIDE EFFECT: the property  list  of  s_atm  is  set  to
        !          1946:                   l_plist.
        !          1947: 
        !          1948: 
        !          1949: (get 'ls_name 'g_ind)
        !          1950: 
        !          1951:      RETURNS: the value under indicator g_ind  in  ls_name's
        !          1952:               property list if ls_name is a symbol.
        !          1953: 
        !          1954:      NOTE: If there is no indicator g_ind in ls_name's  pro-
        !          1955:            perty list nil is returned.  If ls_name is a list
        !          1956:            of an odd number of elements then it is a  disem-
        !          1957:            bodied  property list. _g_e_t searches a disembodied
        !          1958:            property list by starting at its _c_d_r, and compar-
        !          1959:            ing every other element with g_ind, using _e_q.
        !          1960: 
        !          1961: 
        !          1962: 
        !          1963: 
        !          1964: 
        !          1965: 
        !          1966: 
        !          1967: 
        !          1968: 9
        !          1969: 
        !          1970: 9                                     Printed: August 5, 1983
        !          1971: 
        !          1972: 
        !          1973: 
        !          1974: 
        !          1975: 
        !          1976: 
        !          1977: 
        !          1978: Data Structure Access                                   2-31
        !          1979: 
        !          1980: 
        !          1981: (getl 'ls_name 'l_indicators)
        !          1982: 
        !          1983:      RETURNS: the property list  ls_name  beginning  at  the
        !          1984:               first  indicator which is a member of the list
        !          1985:               l_indicators, or nil if none of the indicators
        !          1986:               in  l_indicators  are  on  ls_name's  property
        !          1987:               list.
        !          1988: 
        !          1989:      NOTE: If ls_name is a list, then it is assumed to be  a
        !          1990:            disembodied property list.
        !          1991: 
        !          1992: 
        !          1993: (putprop 'ls_name 'g_val 'g_ind)
        !          1994: (defprop ls_name g_val g_ind)
        !          1995: 
        !          1996:      RETURNS: g_val.
        !          1997: 
        !          1998:      SIDE EFFECT: Adds to the property list of  ls_name  the
        !          1999:                   value g_val under the indicator g_ind.
        !          2000: 
        !          2001:      NOTE: _p_u_t_p_r_o_p evaluates it arguments, _d_e_f_p_r_o_p does not.
        !          2002:            ls_name  may  be a disembodied property list, see
        !          2003:            _g_e_t.
        !          2004: 
        !          2005: (remprop 'ls_name 'g_ind)
        !          2006: 
        !          2007:      RETURNS: the portion of  ls_name's property list begin-
        !          2008:               ning  with  the  property  under the indicator
        !          2009:               g_ind.  If there  is  no  g_ind  indicator  in
        !          2010:               ls_name's plist, nil is returned.
        !          2011: 
        !          2012:      SIDE EFFECT: the value under indicator g_ind and  g_ind
        !          2013:                   itself  is  removed from the property list
        !          2014:                   of ls_name.
        !          2015: 
        !          2016:      NOTE: ls_name may be a disembodied property  list,  see
        !          2017:            _g_e_t.
        !          2018: 
        !          2019: 
        !          2020: 
        !          2021: 
        !          2022: 
        !          2023: 
        !          2024: 
        !          2025: 
        !          2026: 
        !          2027: 
        !          2028: 
        !          2029: 
        !          2030: 
        !          2031: 
        !          2032: 
        !          2033: 9
        !          2034: 
        !          2035: 9                                     Printed: August 5, 1983
        !          2036: 
        !          2037: 
        !          2038: 
        !          2039: 
        !          2040: 
        !          2041: 
        !          2042: 
        !          2043: Data Structure Access                                   2-32
        !          2044: 
        !          2045: 
        !          2046: 
        !          2047:     ____________________________________________________
        !          2048: 
        !          2049:     -> (_p_u_t_p_r_o_p '_x_l_a_t_e '_a '_a_l_p_h_a)
        !          2050:     a
        !          2051:     -> (_p_u_t_p_r_o_p '_x_l_a_t_e '_b '_b_e_t_a)
        !          2052:     b
        !          2053:     -> (_p_l_i_s_t '_x_l_a_t_e)
        !          2054:     (alpha a beta b)
        !          2055:     -> (_g_e_t '_x_l_a_t_e '_a_l_p_h_a)
        !          2056:     a
        !          2057:     ; use of a disembodied property list:
        !          2058:     -> (_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)
        !          2059:     kls
        !          2060:     ____________________________________________________
        !          2061: 
        !          2062: 
        !          2063: 
        !          2064: 
        !          2065: 
        !          2066: 
        !          2067:       2.8.3.  tconc structure
        !          2068: 
        !          2069:               A tconc structure is a special  type  of  list
        !          2070:          designed to make it easy to add objects to the end.
        !          2071:          It consists of a list cell whose _c_a_r  points  to  a
        !          2072:          list  of the elements added with _t_c_o_n_c or _l_c_o_n_c and
        !          2073:          whose _c_d_r points to the last list cell of the  list
        !          2074:          pointed to by the _c_a_r.
        !          2075: 
        !          2076: (tconc 'l_ptr 'g_x)
        !          2077: 
        !          2078:      WHERE:   l_ptr is a tconc structure.
        !          2079: 
        !          2080:      RETURNS: l_ptr with g_x added to the end.
        !          2081: 
        !          2082: (lconc 'l_ptr 'l_x)
        !          2083: 
        !          2084:      WHERE:   l_ptr is a tconc structure.
        !          2085: 
        !          2086:      RETURNS: l_ptr with the list l_x spliced in at the end.
        !          2087: 
        !          2088: 
        !          2089: 
        !          2090: 
        !          2091: 
        !          2092: 
        !          2093: 
        !          2094: 
        !          2095: 
        !          2096: 
        !          2097: 
        !          2098: 9
        !          2099: 
        !          2100: 9                                     Printed: August 5, 1983
        !          2101: 
        !          2102: 
        !          2103: 
        !          2104: 
        !          2105: 
        !          2106: 
        !          2107: 
        !          2108: Data Structure Access                                   2-33
        !          2109: 
        !          2110: 
        !          2111: 
        !          2112:     ____________________________________________________
        !          2113: 
        !          2114:     ; A _t_c_o_n_c structure can be initialized in two  ways.
        !          2115:     ; nil can be given to _t_c_o_n_c in which case _t_c_o_n_c will generate
        !          2116:     ; a _t_c_o_n_c structure.
        !          2117: 
        !          2118:     ->(_s_e_t_q _f_o_o (_t_c_o_n_c _n_i_l _1))
        !          2119:     ((1) 1)
        !          2120: 
        !          2121:     ; Since _t_c_o_n_c destructively adds to
        !          2122:     ; the list, you can now add to foo without using _s_e_t_q again.
        !          2123: 
        !          2124:     ->(_t_c_o_n_c _f_o_o _2)
        !          2125:     ((1 2) 2)
        !          2126:     ->_f_o_o
        !          2127:     ((1 2) 2)
        !          2128: 
        !          2129:     ; Another way to create a null  _t_c_o_n_c structure
        !          2130:     ; is to use (_n_c_o_n_s _n_i_l).
        !          2131: 
        !          2132:     ->(_s_e_t_q _f_o_o (_n_c_o_n_s _n_i_l))
        !          2133:     (nil)
        !          2134:     ->(_t_c_o_n_c _f_o_o _1)
        !          2135:     ((1) 1)
        !          2136: 
        !          2137:     ; now see what _l_c_o_n_c can do
        !          2138:     -> (_l_c_o_n_c _f_o_o _n_i_l)
        !          2139:     ((1) 1)            ; no change
        !          2140:     -> (_l_c_o_n_c _f_o_o '(_2 _3 _4))
        !          2141:     ((1 2 3 4) 4)
        !          2142:     ____________________________________________________
        !          2143: 
        !          2144: 
        !          2145: 
        !          2146: 
        !          2147: 
        !          2148: 
        !          2149:       2.8.4.  fclosures
        !          2150: 
        !          2151:               An  fclosure  is  a  functional  object  which
        !          2152:          admits some data manipulations.  They are discussed
        !          2153:          in 8.4.  Internally, they are constructed from vec-
        !          2154:          tors.
        !          2155: 
        !          2156: 
        !          2157: 
        !          2158: 
        !          2159: 
        !          2160: 
        !          2161: 
        !          2162: 
        !          2163: 9
        !          2164: 
        !          2165: 9                                     Printed: August 5, 1983
        !          2166: 
        !          2167: 
        !          2168: 
        !          2169: 
        !          2170: 
        !          2171: 
        !          2172: 
        !          2173: Data Structure Access                                   2-34
        !          2174: 
        !          2175: 
        !          2176: (fclosure 'l_vars 'g_funobj)
        !          2177: 
        !          2178:      WHERE:   l_vars is a list of variables, g_funobj is any
        !          2179:               object that can be funcalled (including, fclo-
        !          2180:               sures).
        !          2181: 
        !          2182:      RETURNS: A vector which is the fclosure.
        !          2183: 
        !          2184: (fclosure-alist 'v_fclosure)
        !          2185: 
        !          2186:      RETURNS: An association list representing the variables
        !          2187:               in  the  fclosure.   This is a snapshot of the
        !          2188:               current state of the fclosure.  If  the  bind-
        !          2189:               ings  in  the fclosure are changed, any previ-
        !          2190:               ously  calculated  results  of  _f_c_l_o_s_u_r_e-_a_l_i_s_t
        !          2191:               will not change.
        !          2192: 
        !          2193: (fclosure-function 'v_fclosure)
        !          2194: 
        !          2195:      RETURNS: the functional object part of the fclosure.
        !          2196: 
        !          2197: (fclosurep 'v_fclosure)
        !          2198: 
        !          2199:      RETURNS: t iff the argument is an fclosure.
        !          2200: 
        !          2201: (symeval-in-fclosure 'v_fclosure 's_symbol)
        !          2202: 
        !          2203:      RETURNS: the current binding of a particular symbol  in
        !          2204:               an fclosure.
        !          2205: 
        !          2206: (set-in-fclosure 'v_fclosure 's_symbol 'g_newvalue)
        !          2207: 
        !          2208:      RETURNS: g_newvalue.
        !          2209: 
        !          2210:      SIDE EFFECT: The variable  s_symbol  is  bound  in  the
        !          2211:                   fclosure to g_newvalue.
        !          2212: 
        !          2213: 
        !          2214: 
        !          2215:    2.9.  Random functions
        !          2216: 
        !          2217:            The following functions don't fall  into  any  of
        !          2218:       the classifications above.
        !          2219: 
        !          2220: 
        !          2221: 
        !          2222: 
        !          2223: 
        !          2224: 
        !          2225: 
        !          2226: 
        !          2227: 
        !          2228: 9
        !          2229: 
        !          2230: 9                                     Printed: August 5, 1983
        !          2231: 
        !          2232: 
        !          2233: 
        !          2234: 
        !          2235: 
        !          2236: 
        !          2237: 
        !          2238: Data Structure Access                                   2-35
        !          2239: 
        !          2240: 
        !          2241: (bcdad 's_funcname)
        !          2242: 
        !          2243:      RETURNS: a fixnum which is the address in memory  where
        !          2244:               the function s_funcname begins.  If s_funcname
        !          2245:               is not a machine coded function (binary)  then
        !          2246:               _b_c_d_a_d returns nil.
        !          2247: 
        !          2248: (copy 'g_arg)
        !          2249: 
        !          2250:      RETURNS: A structure _e_q_u_a_l to g_arg but with  new  list
        !          2251:               cells.
        !          2252: 
        !          2253: (copyint* 'x_arg)
        !          2254: 
        !          2255:      RETURNS: a fixnum with the same value as x_arg but in a
        !          2256:               freshly allocated cell.
        !          2257: 
        !          2258: (cpy1 'xvt_arg)
        !          2259: 
        !          2260:      RETURNS: a new cell of the same type  as  xvt_arg  with
        !          2261:               the same value as xvt_arg.
        !          2262: 
        !          2263: (getaddress 's_entry1 's_binder1  'st_discipline1  [...  ...
        !          2264: ...])
        !          2265: 
        !          2266:      RETURNS: the binary object which s_binder1's   function
        !          2267:               field is set to.
        !          2268: 
        !          2269:      NOTE: This looks in the running lisp's symbol table for
        !          2270:            a symbol with the same name as s_entry_i.  It then
        !          2271:            creates a binary object whose entry field  points
        !          2272:            to    s_entry_i    and    whose    discipline   is
        !          2273:            st_discipline_i.  This binary object is stored  in
        !          2274:            the    function    field    of   s_binder_i.    If
        !          2275:            st_discipline_i is nil, then "subroutine" is  used
        !          2276:            by  default.  This is especially useful for _c_f_a_s_l
        !          2277:            users.
        !          2278: 
        !          2279: (macroexpand 'g_form)
        !          2280: 
        !          2281:      RETURNS: g_form after all macros in it are expanded.
        !          2282: 
        !          2283:      NOTE: This function will only  macroexpand  expressions
        !          2284:            which  could  be  evaluated  and it does not know
        !          2285:            about the special nlambdas such as _c_o_n_d  and  _d_o,
        !          2286:            thus it misses many macro expansions.
        !          2287: 
        !          2288: 
        !          2289: 
        !          2290: 
        !          2291: 
        !          2292: 
        !          2293: 9
        !          2294: 
        !          2295: 9                                     Printed: August 5, 1983
        !          2296: 
        !          2297: 
        !          2298: 
        !          2299: 
        !          2300: 
        !          2301: 
        !          2302: 
        !          2303: Data Structure Access                                   2-36
        !          2304: 
        !          2305: 
        !          2306: (ptr 'g_arg)
        !          2307: 
        !          2308:      RETURNS: a value cell initialized to point to g_arg.
        !          2309: 
        !          2310: (quote g_arg)
        !          2311: 
        !          2312:      RETURNS: g_arg.
        !          2313: 
        !          2314:      NOTE: the reader allows you to abbreviate  (quote  foo)
        !          2315:            as 'foo.
        !          2316: 
        !          2317: (kwote 'g_arg)
        !          2318: 
        !          2319:      RETURNS:  (_l_i_s_t (_q_u_o_t_e _q_u_o_t_e) _g__a_r_g).
        !          2320: 
        !          2321: (replace 'g_arg1 'g_arg2)
        !          2322: 
        !          2323:      WHERE:   g_arg1 and g_arg2 must be  the  same  type  of
        !          2324:               lispval and not symbols or hunks.
        !          2325: 
        !          2326:      RETURNS: g_arg2.
        !          2327: 
        !          2328:      SIDE EFFECT: The effect of _r_e_p_l_a_c_e is dependent on  the
        !          2329:                   type  of  the  g_arg_i  although  one  will
        !          2330:                   notice a similarity in  the  effects.   To
        !          2331:                   understand what _r_e_p_l_a_c_e does to fixnum and
        !          2332:                   flonum arguments, you  must  first  under-
        !          2333:                   stand  that  such  numbers  are `boxed' in
        !          2334:                   FRANZ LISP.  What this means  is  that  if
        !          2335:                   the  symbol  x  has a value 32412, then in
        !          2336:                   memory the value  element  of  x's  symbol
        !          2337:                   structure  contains the address of another
        !          2338:                   word of memory (called a box)  with  32412
        !          2339:                   in it.
        !          2340: 
        !          2341:                   Thus, there are two ways of  changing  the
        !          2342:                   value  of  x:  the  first is to change the
        !          2343:                   value element of x's symbol  structure  to
        !          2344:                   point to a word of memory with a different
        !          2345:                   value.  The second way is  to  change  the
        !          2346:                   value  in  the box which x points to.  The
        !          2347:                   former method is used almost  all  of  the
        !          2348:                   time,  the  latter is used very rarely and
        !          2349:                   has the potential to  cause  great  confu-
        !          2350:                   sion.   The function _r_e_p_l_a_c_e allows you to
        !          2351:                   do the latter, i.e.,  to  actually  change
        !          2352:                   the value in the box.
        !          2353: 
        !          2354:                   You should watch out for these situations.
        !          2355:                   If  you  do  (_s_e_t_q _y _x), then both x and y
        !          2356:                   will point to the same box.   If  you  now
        !          2357:                   (_r_e_p_l_a_c_e _x _1_2_3_4_5),  then  y will also have
        !          2358:                   the value 12345.  And, in fact, there  may
        !          2359: 
        !          2360: 
        !          2361:                                      Printed: August 5, 1983
        !          2362: 
        !          2363: 
        !          2364: 
        !          2365: 
        !          2366: 
        !          2367: 
        !          2368: 
        !          2369: Data Structure Access                                   2-37
        !          2370: 
        !          2371: 
        !          2372:                   be many other pointers to that box.
        !          2373: 
        !          2374:                   Another problem with replacing fixnums  is
        !          2375:                   that  some  boxes are read-only.  The fix-
        !          2376:                   nums between -1024 and 1023 are stored  in
        !          2377:                   a  read-only  area and attempts to replace
        !          2378:                   them will result  in  an  "Illegal  memory
        !          2379:                   reference"  error  (see the description of
        !          2380:                   _c_o_p_y_i_n_t* for a way around this problem).
        !          2381: 
        !          2382:                   For the other valid types, the  effect  of
        !          2383:                   _r_e_p_l_a_c_e is easy to understand.  The fields
        !          2384:                   of g_val1's structure are made eq  to  the
        !          2385:                   corresponding  fields  of  g_val2's struc-
        !          2386:                   ture.  For example,  if  x   and   y  have
        !          2387:                   lists   as   values  then  the  effect  of
        !          2388:                   (_r_e_p_l_a_c_e _x _y)    is    the     same     as
        !          2389:                   (_r_p_l_a_c_a _x (_c_a_r _y)) and (_r_p_l_a_c_d _x (_c_d_r _y)).
        !          2390: 
        !          2391: (scons 'x_arg 'bs_rest)
        !          2392: 
        !          2393:      WHERE:   bs_rest is a bignum or nil.
        !          2394: 
        !          2395:      RETURNS: a bignum whose first bigit is x_arg and  whose
        !          2396:               higher order bigits are bs_rest.
        !          2397: 
        !          2398: (setf g_refexpr 'g_value)
        !          2399: 
        !          2400:      NOTE: _s_e_t_f is a generalization  of  setq.   Information
        !          2401:            may  be  stored  by  binding variables, replacing
        !          2402:            entries of arrays, and vectors, or being  put  on
        !          2403:            property  lists,  among  others.  Setf will allow
        !          2404:            the user to store data  into  some  location,  by
        !          2405:            mentioning  the  operation  used  to refer to the
        !          2406:            location.  Thus, the first argument may  be  par-
        !          2407:            tially  evaluated,  but only to the extent needed
        !          2408:            to calculate a reference.  _s_e_t_f returns g_value.
        !          2409: 
        !          2410: 
        !          2411:     ____________________________________________________
        !          2412: 
        !          2413:       (setf x 3)        =  (setq x 3)
        !          2414:       (setf (car x) 3)  = (rplaca x 3)
        !          2415:       (setf (get foo 'bar) 3) = (putprop foo 3 'bar)
        !          2416:       (setf (vref vector index) value) = (vset vector index value)
        !          2417:     ____________________________________________________
        !          2418: 
        !          2419: 
        !          2420: 
        !          2421: 
        !          2422: 
        !          2423: 
        !          2424: 9
        !          2425: 
        !          2426: 9                                     Printed: August 5, 1983
        !          2427: 
        !          2428: 
        !          2429: 
        !          2430: 
        !          2431: 
        !          2432: 
        !          2433: 
        !          2434: Data Structure Access                                   2-38
        !          2435: 
        !          2436: 
        !          2437: (sort 'l_data 'u_comparefn)
        !          2438: 
        !          2439:      RETURNS: a list of the elements of  l_data  ordered  by
        !          2440:               the comparison function u_comparefn
        !          2441: 
        !          2442:      SIDE EFFECT: the list l_data is  modified  rather  than
        !          2443:                   allocate new storage.
        !          2444: 
        !          2445:      NOTE: (_c_o_m_p_a_r_e_f_n '_g__x  '_g__y)  should  return  something
        !          2446:            non-nil  if  g-x can precede g_y in sorted order;
        !          2447:            nil if g_y must precede g_x.  If  u_comparefn  is
        !          2448:            nil, alphabetical order will be used.
        !          2449: 
        !          2450: (sortcar 'l_list 'u_comparefn)
        !          2451: 
        !          2452:      RETURNS: a list of the  elements  of  l_list  with  the
        !          2453:               _c_a_r's    ordered    by   the   sort   function
        !          2454:               u_comparefn.
        !          2455: 
        !          2456:      SIDE EFFECT: the list l_list is  modified  rather  than
        !          2457:                   allocating new storage.
        !          2458: 
        !          2459:      NOTE: Like _s_o_r_t, if u_comparefn  is  nil,  alphabetical
        !          2460:            order will be used.
        !          2461: 
        !          2462: 
        !          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: 9
        !          2490: 
        !          2491: 9                                     Printed: August 5, 1983
        !          2492: 
        !          2493: 
        !          2494: 

unix.superglobalmegacorp.com

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