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

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

unix.superglobalmegacorp.com

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