Annotation of 43BSDTahoe/ucb/lisp/doc/ch2.n, revision 1.1

1.1     ! root        1: .\" Copyright (c) 1980 Regents of the University of California.
        !             2: .\" All rights reserved.  The Berkeley software License Agreement
        !             3: .\" specifies the terms and conditions for redistribution.
        !             4: .\"
        !             5: .\"    @(#)ch2.n       6.2 (Berkeley) 5/14/86
        !             6: .\"
        !             7: .\" $Header: ch2.n,v 1.7 83/07/30 14:42:38 layer Exp $
        !             8: .Lc Data\ Structure\ Access 2
        !             9: .pp
        !            10: The following functions allow one to create and manipulate the various types
        !            11: of lisp data structures.
        !            12: Refer to \(sc1.2 for details of the data structures known to 
        !            13: .Fr .
        !            14: .sh 2 Lists \n(ch 1
        !            15: .pp
        !            16: The following functions exist for the creation and manipulating of lists.
        !            17: Lists are composed of a linked list of objects called 
        !            18: either 'list cells', 'cons cells' or 'dtpr cells'.
        !            19: Lists are normally terminated with the special symbol 
        !            20: .b nil .
        !            21: .b nil 
        !            22: is both a symbol and a representation for the empty list ().
        !            23: .sh 3 list\ creation
        !            24: .Lf cons "'g_arg1 'g_arg2"
        !            25: .Re
        !            26: a new list cell whose car is g_arg1 and whose cdr is g_arg2.
        !            27: .Lf xcons "'g_arg1 'g_arg2"
        !            28: .Eq
        !            29: \fI(cons 'g_arg2 'g_arg1)\fP
        !            30: .Lf ncons "'g_arg"
        !            31: .Eq 
        !            32: \fI(cons 'g_arg nil)\fP
        !            33: .Lf list "['g_arg1 ... ]"
        !            34: .Re
        !            35: a list whose elements are the g_arg\fIi\fP.
        !            36: .Lf append "'l_arg1 'l_arg2"
        !            37: .Re
        !            38: a list containing the elements of l_arg1 followed by l_arg2.
        !            39: .No
        !            40: To generate the result, the top level list cells of l_arg1 are duplicated
        !            41: and the cdr of the last list cell is set to point to l_arg2.
        !            42: Thus this is an expensive operation if l_arg1 is large.
        !            43: See the descriptions of 
        !            44: .i nconc 
        !            45: and 
        !            46: .i tconc 
        !            47: for cheaper ways of doing the 
        !            48: .i append 
        !            49: if the list l_arg1 can be altered.
        !            50: .Lf append1 "'l_arg1 'g_arg2"
        !            51: .Re
        !            52: a list like l_arg1 with g_arg2 as the last element.
        !            53: .No
        !            54: this is equivalent to (append 'l_arg1 (list 'g_arg2)).
        !            55: .Eb
        !            56: ; A common mistake is using append to add one element to the end of a list
        !            57: \-> \fI(append '(a b c d) 'e)\fP
        !            58: (a b c d . e)
        !            59: ; The user intended to say:
        !            60: \-> \fI(append '(a b c d) '(e))
        !            61: (a b c d e)
        !            62: ; better is append1
        !            63: \-> \fI(append1 '(a b c d) 'e)\fP
        !            64: (a b c d e)
        !            65: .Ee
        !            66: .Lf quote! "[g_qform\fIi\fP] ...[! 'g_eform\fIi\fP] ...  [!! 'l_form\fIi\fP] ..."
        !            67: .Re
        !            68: The list resulting from the  splicing and insertion process 
        !            69: described below.
        !            70: .No
        !            71: .i quote!
        !            72: is the complement of the
        !            73: .i list
        !            74: function.  
        !            75: .i list
        !            76: forms a list by evaluating each for in the argument list; evaluation is
        !            77: suppressed if the form is \fIquote\fPed.  In 
        !            78: .i quote!,
        !            79: each form is implicitly \fIquote\fPed.  To be evaluated, a form
        !            80: must be preceded by one of the evaluate operations ! and !!. ! g_eform
        !            81: evaluates g_form and the value is inserted in the place of the call;
        !            82: !! l_form evaluates l_form and the value is spliced into the place of
        !            83: the call.
        !            84: .br
        !            85: .sp
        !            86: `Splicing in' means that the parentheses surrounding the list are removed
        !            87: as the example below shows.
        !            88: Use of the evaluate operators can occur at any level in a
        !            89: form argument.
        !            90: .br
        !            91: .sp
        !            92: Another way to get the effect of the \fIquote!\fP function is to use
        !            93: the backquote character macro (see \(sc 8.3.3).
        !            94: .Eb
        !            95: \fI(quote! cons ! (cons 1 2) 3) = (cons (1 . 2) 3)\fP
        !            96: \fI(quote! 1 !! (list 2 3 4) 5) = (1 2 3 4 5)\fP
        !            97: \fI(setq quoted 'evaled)(quote! ! ((I am  ! quoted))) = ((I am evaled))\fP
        !            98: \fI(quote! try ! '(this ! one)) = (try (this ! one))\fP
        !            99: .Ee
        !           100: 
        !           101: .Lf bignum-to-list "'b_arg"
        !           102: .Re
        !           103: A list of the fixnums which are used to represent the bignum.
        !           104: .No
        !           105: the inverse of this function is
        !           106: .i list-to-bignum.
        !           107: .Lf list-to-bignum "'l_ints"
        !           108: .Wh
        !           109: l_ints is a list of fixnums.
        !           110: .Re
        !           111: a bignum constructed of the given fixnums.
        !           112: .No
        !           113: the inverse of this function is
        !           114: .i bignum-to-list.
        !           115: 
        !           116: .sh 3 list\ predicates 
        !           117: .Lf dtpr "'g_arg"
        !           118: .Re
        !           119: t iff g_arg is a list cell.
        !           120: .No
        !           121: that (dtpr '()) is nil.  The name \fBdtpr\fP is
        !           122: a contraction for ``dotted pair''.
        !           123: .Lf listp "'g_arg"
        !           124: .Re
        !           125: t iff g_arg is a list object or nil.
        !           126: .Lf tailp "'l_x 'l_y"
        !           127: .Re
        !           128: l_x, if a list cell
        !           129: .i eq
        !           130: to l_x is found by
        !           131: .i cdr ing
        !           132: down l_y zero or more times, nil otherwise.
        !           133: .Eb
        !           134: \-> \fI(setq x '(a b c d) y (cddr x))\fP
        !           135: (c d)
        !           136: \-> \fI(and (dtpr x) (listp x))\fP     ; x and y are dtprs and lists
        !           137: t
        !           138: \-> \fI(dtpr '())\fP           ; () is the same as nil and is not a dtpr
        !           139: nil
        !           140: \-> \fI(listp '())\fP          ; however it is a list
        !           141: t
        !           142: \-> \fI(tailp y x)\fP
        !           143: (c d)
        !           144: .Ee
        !           145: .Lf length "'l_arg"
        !           146: .Re
        !           147: the number of elements in the top level of list l_arg.
        !           148: .sh 3 list\ accessing
        !           149: .Lf car "'l_arg"
        !           150: .Lx cdr "'l_arg"
        !           151: .Re the appropriate part of
        !           152: .i cons
        !           153: cell.
        !           154: (\fIcar\fP (\fIcons\fP x y)) is always x,
        !           155: (\fIcdr\fP (\fIcons\fP x y)) is always y.
        !           156: In
        !           157: .Fr ,
        !           158: the cdr portion is located first in memory.
        !           159: This is hardly noticeable, and we mention it
        !           160: primarily as a curiosity.
        !           161: .Lf c\.\.r "'lh_arg"
        !           162: .Wh 
        !           163: the .. represents any positive number of \fBa\fP's and \fBd\fP's.
        !           164: .Re
        !           165: the result of accessing the list structure in the way determined by
        !           166: the function name.
        !           167: The \fBa\fP's and \fBd\fP's are read from right to left, a 
        !           168: .b d
        !           169: directing the access down the cdr part of the list cell and an
        !           170: .b a
        !           171: down the car part.
        !           172: .No
        !           173: lh_arg may also be nil, and it is guaranteed that the car and cdr of nil
        !           174: is nil.
        !           175: If lh_arg is a hunk, then \fI(car\ 'lh_arg)\fP is the same as 
        !           176: \fI(cxr\ 1\ 'lh_arg)\fP and  \fI(cdr\ 'lh_arg)\fP is the same
        !           177: as \fI(cxr\ 0\ 'lh_arg)\fP.
        !           178: .br
        !           179: It is generally hard to read and understand the context
        !           180: of functions with large strings of 
        !           181: .b a 's
        !           182: and
        !           183: .b d 's,
        !           184: but these functions are supported by rapid accessing and open-compiling
        !           185: (see Chapter 12).
        !           186: .Lf nth "'x_index 'l_list"
        !           187: .Re
        !           188: the nth element of l_list, assuming zero-based index.
        !           189: Thus (nth 0 l_list) is the same as (car l_list).
        !           190: .i nth
        !           191: is both a function, and a compiler macro, so that
        !           192: more efficient code might be generated than for
        !           193: .i nthelem
        !           194: (described below).
        !           195: .No
        !           196: If x_arg1 is non-positive or greater than the length
        !           197: of the list, nil is returned. 
        !           198: .Lf nthcdr "'x_index 'l_list"
        !           199: .Re
        !           200: the result of \fIcdr\fPing down the list l_list x_index times.
        !           201: .No
        !           202: If x_index is less than 0, then \fI(cons\ nil\ 'l_list)\fP is returned.
        !           203: .Lf nthelem "'x_arg1 'l_arg2"
        !           204: .Re
        !           205: The x_arg1'\fIst\fP element of the list l_arg2.
        !           206: .No
        !           207: This function comes from the PDP-11 Lisp system.
        !           208: .Lf last "'l_arg"
        !           209: .Re
        !           210: the last list cell in the list l_arg.
        !           211: .Ex
        !           212: \fIlast\fP does NOT return the last element of a list!
        !           213: .br
        !           214: \fI(last '(a b))\fP = (b)
        !           215: .Lf ldiff "'l_x 'l_y"
        !           216: .Re
        !           217: a  list  of all
        !           218: elements in l_x but not in l_y
        !           219: , i.e., the list difference of
        !           220: l_x and l_y.
        !           221: .No
        !           222: l_y must be a tail of l_x, i.e.,
        !           223: .i eq
        !           224: to the result of applying some number of \fIcdr\fP's
        !           225: to l_x.  
        !           226: Note  that  the  value  of  \fIldiff\fP  is  always  new  list
        !           227: structure unless l_y is nil, in which case \fI(ldiff l_x nil)\fP is l_x
        !           228: itself.
        !           229: If l_y  is  not  a  tail  of  l_x, \fIldiff\fP generates an error.
        !           230: .Ex
        !           231: \fI(ldiff 'l_x (member 'g_foo 'l_x))\fP gives all elements
        !           232: in l_x up to the first g_foo.
        !           233: .sh 3 list\ manipulation
        !           234: .Lf rplaca "'lh_arg1 'g_arg2"
        !           235: .Re
        !           236: the modified lh_arg1.
        !           237: .Se
        !           238: the car of lh_arg1 is set to  g_arg2.
        !           239: If lh_arg1 is a hunk then the second element of the hunk is set to g_arg2.
        !           240: .Lf rplacd "'lh_arg1 'g_arg2"
        !           241: .Re
        !           242: the modified lh_arg1.
        !           243: .Se
        !           244: the cdr of lh_arg2 is set to g_arg2.
        !           245: If lh_arg1 is a hunk then the first element of the hunk is set to g_arg2.
        !           246: 
        !           247: .Lf attach "'g_x 'l_l"
        !           248: .Re
        !           249: l_l whose 
        !           250: .i car
        !           251: is now g_x, whose 
        !           252: .i cadr 
        !           253: is the original \fI(car\ l_l)\fP, 
        !           254: and whose 
        !           255: .i cddr 
        !           256: is the original \fI(cdr\ l_l)\fP.
        !           257: .No
        !           258: what happens is that g_x is added to the 
        !           259: beginning of list l_l  yet maintaining the same list cell  at the 
        !           260: beginning of the list.
        !           261: .Lf delete "'g_val 'l_list ['x_count]"
        !           262: .Re
        !           263: the result of splicing g_val from the top level of
        !           264: l_list no more than x_count times.
        !           265: .No
        !           266: x_count defaults to a very large number, thus if x_count is not given, all
        !           267: occurrences of g_val are removed from the top level of l_list.
        !           268: g_val is compared with successive 
        !           269: .i car 's
        !           270: of l_list using the function
        !           271: .i equal .
        !           272: .Se
        !           273: l_list is modified using rplacd, no new list cells are used.
        !           274: .Lf delq "'g_val 'l_list ['x_count]"
        !           275: .Lx dremove "'g_val 'l_list ['x_count]"
        !           276: .Re
        !           277: the result of splicing g_val from the top level of l_list no more than
        !           278: x_count times.
        !           279: .No
        !           280: .i delq 
        !           281: (and 
        !           282: .i dremove )
        !           283: are the same as 
        !           284: .i delete 
        !           285: except that 
        !           286: .i eq
        !           287: is used for comparison instead of 
        !           288: .i equal .
        !           289: .Eb
        !           290: ; note that you should use the value returned by \fIdelete\fP or \fIdelq\fP
        !           291: ; and not assume that g_val will always show the deletions.
        !           292: ; For example
        !           293: 
        !           294: \-> \fI(setq test '(a b c a d e))\fP
        !           295: (a b c a d e)
        !           296: \-> \fI(delete 'a test)\fP
        !           297: (b c d e)         ; the value returned is what we would expect 
        !           298: \-> \fItest\fP
        !           299: (a b c d e)       ; but test still has the first a in the list!
        !           300: .Ee
        !           301: .Lf remq "'g_x 'l_l ['x_count]"
        !           302: .Lx remove "'g_x 'l_l"
        !           303: .Re
        !           304: a 
        !           305: .i copy
        !           306: of l_l with all top level elements
        !           307: .i equal
        !           308: to g_x removed.
        !           309: .i remq
        !           310: uses 
        !           311: .i eq
        !           312: instead of
        !           313: .i equal
        !           314: for comparisons.
        !           315: .No
        !           316: remove does not modify its arguments like 
        !           317: .i delete ,
        !           318: and
        !           319: .i delq 
        !           320: do.
        !           321: .Lf insert "'g_object 'l_list 'u_comparefn 'g_nodups"
        !           322: .Re
        !           323: a list consisting of l_list with g_object destructively inserted
        !           324: in a place determined by the ordering function u_comparefn.
        !           325: .No
        !           326: \fI(comparefn 'g_x 'g_y)\fP
        !           327: should return something non-nil if g_x can precede g_y in sorted order,
        !           328: nil if g_y must precede g_x.
        !           329: If u_comparefn is nil, alphabetical order
        !           330: will be used.  
        !           331: If g_nodups is non-nil, an element will not be inserted if an
        !           332: equal element is already in the list.
        !           333: .i insert
        !           334: does binary search to determine where to insert the new element.
        !           335: .Lf merge "'l_data1 'l_data2 'u_comparefn"
        !           336: .Re
        !           337: the merged list of the two input sorted lists l_data1 and l_data1
        !           338: using binary comparison function u_comparefn.  
        !           339: .No
        !           340: \fI(comparefn 'g_x 'g_y)\fP
        !           341: should return something non-nil if g_x can precede g_y in sorted order,
        !           342: nil if g_y must precede g_x.  If u_comparefn is nil, 
        !           343: alphabetical order
        !           344: will be used.  u_comparefn should be thought of as "less than or equal".
        !           345: .i merge
        !           346: changes both of its data arguments.
        !           347: .Lf subst "'g_x 'g_y 'l_s"
        !           348: .Lx dsubst "'g_x 'g_y 'l_s"
        !           349: .Re
        !           350: the result of substituting g_x for all 
        !           351: .i equal
        !           352: occurrences of g_y  at all levels in l_s.  
        !           353: .No
        !           354: If g_y is a symbol, 
        !           355: .i eq
        !           356: will be used for comparisons.
        !           357: The function
        !           358: .i subst
        !           359: does not modify l_s 
        !           360: but the function
        !           361: .i dsubst
        !           362: (destructive substitution)
        !           363: does.
        !           364: .Lf lsubst "'l_x 'g_y 'l_s"
        !           365: .Re
        !           366: a copy of l_s  with l_x spliced in for every occurrence of of g_y 
        !           367: at all levels. 
        !           368: Splicing in means that the parentheses surrounding the list l_x are removed
        !           369: as the example below shows.
        !           370: .Eb
        !           371: \-> \fI(subst '(a b c) 'x '(x y z (x y z) (x y z)))\fP
        !           372: ((a b c) y z ((a b c) y z) ((a b c) y z))
        !           373: \-> \fI(lsubst '(a b c) 'x '(x y z (x y z) (x y z)))\fP
        !           374: (a b c y z (a b c y z) (a b c y z))
        !           375: .Ee
        !           376: .Lf subpair "'l_old 'l_new 'l_expr"
        !           377: .Wh
        !           378: there are  the same number of elements in l_old as l_new.
        !           379: .Re
        !           380: the list l_expr with all occurrences of a object in l_old replaced by
        !           381: the corresponding one in l_new.
        !           382: When a substitution is made, a copy of the value to substitute in 
        !           383: is not made.
        !           384: .Ex
        !           385: \fI(subpair '(a c)' (x y) '(a b c d)) = (x b y d)\fP
        !           386: 
        !           387: .Lf nconc "'l_arg1 'l_arg2 ['l_arg3 ...]"
        !           388: .Re
        !           389: A list consisting of the elements of l_arg1 followed by the elements of
        !           390: l_arg2 followed by l_arg3 and so on.
        !           391: .No
        !           392: The 
        !           393: .i cdr 
        !           394: of the last list cell of l_arg\fIi\fP is changed to point to 
        !           395: l_arg\fIi+1\fP.
        !           396: .Eb 
        !           397: ; \fInconc\fP is faster than \fIappend\fP because it doesn't allocate new list cells. 
        !           398: \-> \fI(setq lis1 '(a b c))\fP
        !           399: (a b c)
        !           400: \-> \fI(setq lis2 '(d e f))\fP
        !           401: (d e f)
        !           402: \-> \fI(append lis1 lis2)\fP
        !           403: (a b c d e f)
        !           404: \-> \fIlis1\fP
        !           405: (a b c)       ; note that lis1 has not been changed by \fIappend\fP
        !           406: \-> \fI(nconc lis1 lis2)\fP
        !           407: (a b c d e f) ; \fInconc\fP returns the same value as \fIappend\fP
        !           408: \-> \fIlis1\fP
        !           409: (a b c d e f) ; but in doing so alters lis1
        !           410: .Ee
        !           411: 
        !           412: .Lf reverse "'l_arg"
        !           413: .Lx nreverse "'l_arg"
        !           414: .Re
        !           415: the list l_arg with the elements at the top
        !           416: level in reverse  order.
        !           417: .No
        !           418: The function
        !           419: .i nreverse
        !           420: does the reversal in place,
        !           421: that is the list structure is modified.
        !           422: .Lf nreconc "'l_arg 'g_arg"
        !           423: .Eq
        !           424: \fI(nconc (nreverse 'l_arg) 'g_arg)\fP
        !           425: 
        !           426: .sh 2 Predicates
        !           427: .pp
        !           428: The following functions test for properties of data objects.  
        !           429: When the result of the test is either 'false' or 'true', then
        !           430: \fBnil\fP will be returned for 'false' and something other than
        !           431: \fBnil\fP (often \fBt\fP) will be returned for 'true'.
        !           432: .Lf arrayp "'g_arg"
        !           433: .Re
        !           434: t iff g_arg is of type array.
        !           435: .Lf atom "'g_arg"
        !           436: .Re
        !           437: t iff g_arg is not a list or hunk object.
        !           438: .No
        !           439: \fI(atom '())\fP returns t.
        !           440: .Lf bcdp "'g_arg"
        !           441: .Re
        !           442: t iff g_arg is a data object of type binary.
        !           443: .No
        !           444: This function is a throwback to the PDP-11 Lisp system.
        !           445: The name stands for binary code predicate.
        !           446: .Lf bigp "'g_arg"
        !           447: .Re
        !           448: t iff g_arg is a bignum.
        !           449: .Lf dtpr "'g_arg"
        !           450: .Re
        !           451: t iff g_arg is a list cell.
        !           452: .No
        !           453: that (dtpr '()) is nil.
        !           454: .Lf hunkp "'g_arg"
        !           455: .Re
        !           456: t iff g_arg is a hunk.
        !           457: .Lf listp "'g_arg"
        !           458: .Re
        !           459: t iff g_arg is a list object or nil.
        !           460: .Lf stringp "'g_arg"
        !           461: .Re
        !           462: t iff g_arg is a string.
        !           463: .Lf symbolp "'g_arg"
        !           464: .Re
        !           465: t iff g_arg is a symbol.
        !           466: .Lf valuep "'g_arg"
        !           467: .Re
        !           468: t iff g_arg is a value cell
        !           469: .Lf vectorp 'v_vector
        !           470: .Re
        !           471: \fBt\fP iff the argument is a vector.
        !           472: .Lf vectorip 'v_vector
        !           473: .Re
        !           474: \fBt\fP iff the argument is an immediate-vector.
        !           475: .Lf type "'g_arg"
        !           476: .Lx typep "'g_arg"
        !           477: .Re
        !           478: a symbol whose pname describes the type of g_arg.
        !           479: .Lf signp "s_test 'g_val"
        !           480: .Re
        !           481: t iff g_val is a number  and the given test s_test on g_val returns true.
        !           482: .No
        !           483: The fact that 
        !           484: .i signp
        !           485: simply returns nil if g_val is not a number is probably the most
        !           486: important reason that 
        !           487: .i signp
        !           488: is used.
        !           489: The permitted values for s_test and what they mean are given in this table.
        !           490: .(b
        !           491: .TS
        !           492: center box;
        !           493: l l .
        !           494: s_test tested
        !           495: 
        !           496: =
        !           497: l      g_val < 0
        !           498: le     g_val \(<= 0
        !           499: e      g_val = 0
        !           500: n      g_val \(!= 0
        !           501: ge     g_val \(>= 0
        !           502: g      g_val > 0
        !           503: .TE
        !           504: .)b
        !           505: .Lf eq "'g_arg1 'g_arg2"
        !           506: .Re
        !           507: t if g_arg1 and g_arg2 are the exact same lisp object.
        !           508: .No
        !           509: .i Eq
        !           510: simply tests if g_arg1 and g_arg2 are located in the exact same
        !           511: place in memory.
        !           512: Lisp objects which print the same are not necessarily 
        !           513: .i eq .
        !           514: The only objects guaranteed to be 
        !           515: .i eq
        !           516: are interned symbols with the same print name.
        !           517: [Unless a symbol is created in a special way (such as with
        !           518: .i uconcat 
        !           519: or 
        !           520: .i maknam )
        !           521: it will be interned.]
        !           522: .Lf neq "'g_x 'g_y"
        !           523: .Re
        !           524: t if g_x is not 
        !           525: .i eq
        !           526: to g_y, otherwise nil.
        !           527: .Lf equal "'g_arg1 'g_arg2"
        !           528: .Lx eqstr "'g_arg1 'g_arg2"
        !           529: .Re
        !           530: t iff g_arg1 and g_arg2 have the same structure as described below.
        !           531: .No
        !           532: g_arg and g_arg2 are 
        !           533: .i equal
        !           534: if
        !           535: .np
        !           536: they are \fIeq\fP.
        !           537: .np
        !           538: they are both fixnums with the same value
        !           539: .np
        !           540: they are both flonums with the same value
        !           541: .np
        !           542: they are both bignums with the same value
        !           543: .np
        !           544: they are both strings and are identical.
        !           545: .np
        !           546: they are both lists and their cars and cdrs are
        !           547: .i equal .
        !           548: .Eb
        !           549: ; \fIeq\fP is much faster than \fIequal\fP, especially in compiled code,
        !           550: ; however you cannot use \fIeq\fP to test for equality of numbers outside
        !           551: ; of the range -1024 to 1023.  \fIequal\fP will always work.
        !           552: \-> \fI(eq 1023 1023)\fP
        !           553: t
        !           554: \-> \fI(eq 1024 1024)\fP
        !           555: nil
        !           556: \-> \fI(equal 1024 1024)\fP
        !           557: t
        !           558: .Ee
        !           559: 
        !           560: .Lf not "'g_arg"
        !           561: .Lx null "'g_arg"
        !           562: .Re
        !           563: t iff g_arg is nil.
        !           564: 
        !           565: .Lf member "'g_arg1 'l_arg2"
        !           566: .Lx memq "'g_arg1 'l_arg2"
        !           567: .Re
        !           568: that part of the l_arg2 beginning with the first occurrence
        !           569: of g_arg1.
        !           570: If g_arg1 is not in the top level of l_arg2, nil is returned.
        !           571: .No
        !           572: .i member 
        !           573: tests for equality with 
        !           574: .i equal ,
        !           575: .i memq 
        !           576: tests for equality with 
        !           577: .i eq .
        !           578: 
        !           579: .sh 2 Symbols\ and\ Strings
        !           580: .pp
        !           581: In many of the following functions the distinction between symbols and
        !           582: strings is somewhat blurred.
        !           583: To remind ourselves of the difference,
        !           584: a string is a null terminated sequence of characters, stored as
        !           585: compactly as possible.
        !           586: Strings are used as constants in
        !           587: .Fr .
        !           588: They
        !           589: .i eval
        !           590: to themselves.
        !           591: A symbol has additional structure:
        !           592: a value, property list, function binding,
        !           593: as well as its external representation (or print-name).
        !           594: If a symbol is given to one of the string manipulation functions below, its
        !           595: print name will be used as the string.
        !           596: .pp
        !           597: Another popular way to represent strings in Lisp is as a list of fixnums
        !           598: which represent characters.
        !           599: The suffix 'n' to a string manipulation function indicates that it 
        !           600: returns a string in this form.
        !           601: .sh 3 symbol\ and\ string\ creation
        !           602: .Lf concat "['stn_arg1 ... ]"
        !           603: .Lx uconcat "['stn_arg1 ... ]"
        !           604: .Re
        !           605: a symbol whose print name
        !           606: is the result of concatenating the print names,
        !           607: string characters or numerical representations
        !           608: of the sn_arg\fIi\fP.
        !           609: .No
        !           610: If no arguments are given, a symbol with a null pname is returned.
        !           611: \fIconcat\fP places the symbol created on the oblist, the function 
        !           612: .i uconcat
        !           613: does the same thing but does not place the new symbol on the oblist.
        !           614: .Ex
        !           615: \fI(concat 'abc (add 3 4) "def")\fP = abc7def
        !           616: .Lf concatl "'l_arg"
        !           617: .Eq
        !           618: \fI(apply 'concat 'l_arg)\fP
        !           619: 
        !           620: .Lf implode "'l_arg"
        !           621: .Lx maknam "'l_arg"
        !           622: .Wh
        !           623: l_arg is a list of symbols, strings and small fixnums.
        !           624: .Re
        !           625: The symbol whose print name is the result of concatenating the 
        !           626: first characters of the print names of the symbols and strings
        !           627: in the list.
        !           628: Any fixnums are converted to the equivalent ascii character.
        !           629: In order to concatenate entire strings or print names, use the
        !           630: function
        !           631: .i concat .
        !           632: .No
        !           633: .i implode 
        !           634: interns the symbol it creates,
        !           635: .i maknam 
        !           636: does not.
        !           637: .Lf gensym "['s_leader]"
        !           638: .Re
        !           639: a new uninterned atom beginning with the first character of s_leader's
        !           640: pname, or beginning with g if s_leader is not given.
        !           641: .No
        !           642: The symbol looks like x0nnnnn where x is s_leader's first character and
        !           643: nnnnn is the number of times you have called gensym.
        !           644: .Lf copysymbol "'s_arg 'g_pred"
        !           645: .Re
        !           646: an uninterned symbol with the same print name as s_arg.
        !           647: If g_pred is non nil, then the value, function binding
        !           648: and property list of the new symbol are made 
        !           649: .i eq 
        !           650: to those of s_arg.
        !           651: 
        !           652: .Lf ascii "'x_charnum"
        !           653: .Wh
        !           654: x_charnum is between 0 and 255.
        !           655: .Re
        !           656: a symbol whose print name is the single character whose fixnum 
        !           657: representation is x_charnum.
        !           658: 
        !           659: .Lf intern "'s_arg"
        !           660: .Re
        !           661: s_arg
        !           662: .Se
        !           663: s_arg is put on the oblist if it is not already there.
        !           664: .Lf remob "'s_symbol"
        !           665: .Re
        !           666: s_symbol
        !           667: .Se
        !           668: s_symbol is removed from the oblist.
        !           669: .Lf rematom "'s_arg"
        !           670: .Re
        !           671: t if s_arg is indeed an atom.
        !           672: .Se
        !           673: s_arg is put on the free atoms list, effectively reclaiming an
        !           674: atom cell.
        !           675: .No
        !           676: This function does 
        !           677: .i not
        !           678: check to see if s_arg is on the oblist or is referenced anywhere.
        !           679: Thus calling 
        !           680: .i rematom
        !           681: on an atom in the oblist may result in disaster when that atom cell
        !           682: is reused!
        !           683: .sh 3 string\ and\ symbol\ predicates
        !           684: .Lf boundp "'s_name"
        !           685: .Re
        !           686: nil  if s_name is unbound: that is, it has never been given a value.
        !           687: If x_name has the value g_val, then (nil\ .\ g_val) is returned.
        !           688: See also 
        !           689: .i makunbound .
        !           690: .Lf alphalessp "'st_arg1 'st_arg2"
        !           691: .Re
        !           692: t iff the `name' of st_arg1 is alphabetically less than the 
        !           693: name of st_arg2.  
        !           694: If st_arg is a symbol then its `name' is its print name.
        !           695: If st_arg is a string, then its `name' is the string itself.
        !           696: .sh 3 symbol\ and\ string\ accessing
        !           697: .Lf symeval "'s_arg"
        !           698: .Re
        !           699: the value of symbol s_arg.
        !           700: .No
        !           701: It is illegal to ask for the value of an unbound symbol.
        !           702: This function has the same effect as
        !           703: .i eval ,
        !           704: but compiles into much more efficient code.
        !           705: .Lf get_pname "'s_arg"
        !           706: .Re
        !           707: the string which is the print name of s_arg.
        !           708: .Lf plist "'s_arg"
        !           709: .Re
        !           710: the property list of s_arg.
        !           711: .Lf getd "'s_arg"
        !           712: .Re
        !           713: the function definition of s_arg or nil if there is no function definition.
        !           714: .No
        !           715: the function definition may turn out to be an array header.
        !           716: .Lf getchar "'s_arg 'x_index"
        !           717: .Lx nthchar "'s_arg 'x_index"
        !           718: .Lx getcharn "'s_arg 'x_index"
        !           719: .Re
        !           720: the x_index\fIth\fP character of the print name of s_arg or nil if x_index
        !           721: is less than 1 or greater than the length of s_arg's print name.
        !           722: .No
        !           723: .i getchar 
        !           724: and 
        !           725: .i nthchar 
        !           726: return a symbol with a single character print name,
        !           727: .i getcharn 
        !           728: returns the fixnum representation of the character.
        !           729: .Lf substring "'st_string 'x_index ['x_length]"
        !           730: .Lx substringn "'st_string 'x_index ['x_length]"
        !           731: .Re
        !           732: a string of length at most
        !           733: x_length starting at x_index\fIth\fP character
        !           734: in the string.
        !           735: .No
        !           736: If x_length is not given, all of the characters for x_index
        !           737: to the end of the string are returned.
        !           738: If x_index is negative the string begins at the
        !           739: x_index\fIth\fP character from the end.
        !           740: If x_index is out of bounds, nil is returned.
        !           741: .No
        !           742: .i substring 
        !           743: returns a list of symbols, 
        !           744: .i substringn 
        !           745: returns a list of fixnums.
        !           746: If 
        !           747: .i substringn 
        !           748: is given a 0 x_length argument then a single fixnum 
        !           749: which is the x_index\fIth\fP character is returned.
        !           750: .sh 3 symbol\ and\ string\ manipulation
        !           751: .Lf set "'s_arg1 'g_arg2"
        !           752: .Re
        !           753: g_arg2.
        !           754: .Se
        !           755: the value of s_arg1 is set to g_arg2.
        !           756: .Lf setq "s_atm1 'g_val1 [ s_atm2 'g_val2 ... ... ]"
        !           757: .Wh
        !           758: the arguments are pairs of atom names and expressions.
        !           759: .Re
        !           760: the last g_val\fIi\fP.
        !           761: .Se
        !           762: each s_atm\fIi\fP is set to have the value g_val\fIi\fP.
        !           763: .No
        !           764: .i set
        !           765: evaluates all of its arguments,
        !           766: .i setq
        !           767: does not evaluate the s_atm\fIi\fP.
        !           768: .Lf desetq "sl_pattern1 'g_exp1 [... ...]"
        !           769: .Re
        !           770: g_expn
        !           771: .Se
        !           772: This acts just like \fIsetq\fP if all the sl_pattern\fIi\fP are symbols.
        !           773: If sl_pattern\fIi\fP is a list then it  is a template which should
        !           774: have the same structure as g_exp\fIi\fP
        !           775: The symbols in sl_pattern are assigned to the corresponding 
        !           776: parts of g_exp.
        !           777: (See also
        !           778: .i setf
        !           779: )
        !           780: .Ex
        !           781: \fI(desetq (a b (c . d)) '(1 2 (3 4 5)))\fP
        !           782: .br
        !           783: sets a to 1, b to 2, c to 3, and d to (4 5).
        !           784: 
        !           785: .Lf setplist "'s_atm 'l_plist"
        !           786: .Re
        !           787: l_plist.
        !           788: .Se
        !           789: the property list of s_atm is set to l_plist.
        !           790: .Lf makunbound "'s_arg"
        !           791: .Re
        !           792: s_arg
        !           793: .Se
        !           794: the value of s_arg is made `unbound'.
        !           795: If the interpreter attempts to evaluate s_arg before it is again 
        !           796: given a value, an unbound variable error will occur.
        !           797: .Lf aexplode "'s_arg"
        !           798: .Lx explode  "'g_arg"
        !           799: .Lx aexplodec "'s_arg"
        !           800: .Lx explodec "'g_arg"
        !           801: .Lx aexploden "'s_arg"
        !           802: .Lx exploden "'g_arg"
        !           803: .Re
        !           804: a list of the characters used to print out s_arg or g_arg.
        !           805: .No
        !           806: The functions beginning with 'a' are internal functions which are limited
        !           807: to symbol arguments.  
        !           808: The functions 
        !           809: .i aexplode 
        !           810: and 
        !           811: .i explode
        !           812: return a list of characters which 
        !           813: .i print
        !           814: would use to print the argument.  
        !           815: These characters include all necessary escape characters.
        !           816: Functions 
        !           817: .i aexplodec 
        !           818: and
        !           819: .i explodec
        !           820: return a list of characters which
        !           821: .i patom
        !           822: would use to print the argument (i.e. no escape characters).
        !           823: Functions 
        !           824: .i aexploden 
        !           825: and 
        !           826: .i exploden
        !           827: are similar to 
        !           828: .i aexplodec 
        !           829: and 
        !           830: .i explodec 
        !           831: except that a list of fixnum equivalents of characters are returned.
        !           832: .Eb
        !           833: \-> \fI(setq x '|quote this \e| ok?|)\fP
        !           834: |quote this \e| ok?|
        !           835: \-> \fI(explode x)\fP
        !           836: (q u o t e |\e\e| | | t h i s |\e\e| | | |\e\e| |\e|| |\e\e| | | o k ?)
        !           837: ; note that |\e\e| just means the single character: backslash.
        !           838: ; and |\e|| just means the single character: vertical bar
        !           839: ; and | | means the single character: space
        !           840: 
        !           841: \-> \fI(explodec x)\fP
        !           842: (q u o t e | | t h i s | | |\e|| | | o k ?)
        !           843: \-> \fI(exploden x)\fP
        !           844: (113 117 111 116 101 32 116 104 105 115 32 124 32 111 107 63)
        !           845: .Ee
        !           846: .sh 2 Vectors
        !           847: .pp
        !           848: See Chapter 9 for a discussion of vectors.
        !           849: They are less efficient that hunks but more efficient than arrays.
        !           850: .sh 3 vector\ creation
        !           851: .Lf new-vector "'x_size ['g_fill ['g_prop]]"
        !           852: .Re
        !           853: A \fBvector\fP of length x_size.
        !           854: Each data entry is initialized to g_fill, or to nil, if the argument g_fill
        !           855: is not present.
        !           856: The vector's property is set to g_prop, or to nil, by default.
        !           857: .Lf new-vectori-byte "'x_size ['g_fill ['g_prop]]"
        !           858: .Lx new-vectori-word "'x_size ['g_fill ['g_prop]]"
        !           859: .Lx new-vectori-long "'x_size ['g_fill ['g_prop]]"
        !           860: .Re
        !           861: A \fBvectori\fP with x_size elements in it.
        !           862: The actual memory requirement is two long words + x_size*(n bytes),
        !           863: where n is 1 for new-vector-byte, 2 for new-vector-word, or 4 for
        !           864: new-vectori-long.
        !           865: Each data entry is initialized to g_fill, or to zero, if the argument g_fill
        !           866: is not present.
        !           867: The vector's property is set to g_prop, or nil, by default.
        !           868: .sp 2v
        !           869: .lp
        !           870: Vectors may be created by specifying multiple initial values:
        !           871: .Lf vector "['g_val0 'g_val1 ...]"
        !           872: .Re
        !           873: a \fBvector\fP, with as many data elements as there are arguments.
        !           874: It is quite possible to have a vector with no data elements.
        !           875: The vector's property will be a null list.
        !           876: .Lf vectori-byte "['x_val0 'x_val2 ...]"
        !           877: .Lx vectori-word "['x_val0 'x_val2 ...]"
        !           878: .Lx vectori-long "['x_val0 'x_val2 ...]"
        !           879: .Re
        !           880: a \fBvectori\fP, with as many data elements as there are arguments.
        !           881: The arguments are required to be fixnums.
        !           882: Only the low order byte or word is used in the case of vectori-byte
        !           883: and vectori-word.
        !           884: The vector's property will be null.
        !           885: .sh 3 vector\ reference
        !           886: .Lf vref "'v_vect 'x_index"
        !           887: .Lx vrefi-byte "'V_vect 'x_bindex"
        !           888: .Lx vrefi-word "'V_vect 'x_windex"
        !           889: .Lx vrefi-long "'V_vect 'x_lindex"
        !           890: .Re
        !           891: the desired data element from a vector.
        !           892: The indices must be fixnums.
        !           893: Indexing is zero-based.
        !           894: The vrefi functions sign extend the data.
        !           895: .Lf vprop 'Vv_vect
        !           896: .Re
        !           897: The Lisp property associated with a vector.
        !           898: .Lf vget "'Vv_vect 'g_ind"
        !           899: .Re
        !           900: The value stored under g_ind if the Lisp property associated
        !           901: with 'Vv_vect is a disembodied property list.
        !           902: .Lf vsize 'Vv_vect
        !           903: .Lx vsize-byte 'V_vect
        !           904: .Lx vsize-word 'V_vect
        !           905: .Re
        !           906: the number of data elements in the vector.  For immediate-vectors,
        !           907: the functions vsize-byte and vsize-word return the number of data elements,
        !           908: if one thinks of the binary data as being comprised of bytes or words.
        !           909: .sh 3 vector\ modfication
        !           910: .Lf vset "'v_vect 'x_index 'g_val"
        !           911: .Lx vseti-byte "'V_vect 'x_bindex 'x_val"
        !           912: .Lx vseti-word "'V_vect 'x_windex 'x_val"
        !           913: .Lx vseti-long "'V_vect 'x_lindex 'x_val"
        !           914: .Re
        !           915: the datum.
        !           916: .Se
        !           917: The indexed element of the vector is set to the value.
        !           918: As noted above, for vseti-word and vseti-byte, the index
        !           919: is construed as the number of the data element within
        !           920: the vector.  It is not a byte address.
        !           921: Also, for those two functions,
        !           922: the low order byte or word of x_val is what is stored.
        !           923: .Lf vsetprop "'Vv_vect 'g_value"
        !           924: .Re
        !           925: g_value.  This should be either a symbol
        !           926: or a disembodied property list whose
        !           927: .i car
        !           928: is a symbol identifying the type of
        !           929: the vector.
        !           930: .Se
        !           931: the property list of Vv_vect is set to g_value.
        !           932: .Lf vputprop "'Vv_vect 'g_value 'g_ind"
        !           933: .Re
        !           934: g_value.
        !           935: .Se
        !           936: If the vector property of Vv_vect is a disembodied property list,
        !           937: then vputprop adds the value g_value under the indicator g_ind.
        !           938: Otherwise, the old vector property is made the first
        !           939: element of the list.
        !           940: .sh 2 Arrays
        !           941: .pp
        !           942: See Chapter 9 for a complete description of arrays.
        !           943: Some of these functions are part of a Maclisp array
        !           944: compatibility package representing only one simple way of using the
        !           945: array structure of
        !           946: .Fr .
        !           947: .sh 3 array\ creation
        !           948: .Lf marray  "'g_data 's_access 'g_aux 'x_length 'x_delta"
        !           949: .Re
        !           950: an array type with the fields set up from the above arguments
        !           951: in the obvious way (see \(sc 1.2.10).
        !           952: .Lf *array "'s_name 's_type 'x_dim1 ... 'x_dim\fIn\fP"
        !           953: .Lx array "s_name s_type x_dim1 ... x_dim\fIn\fP"
        !           954: .Wh
        !           955: s_type may be one of t, nil, fixnum, flonum, fixnum-block and 
        !           956: flonum-block.
        !           957: .Re
        !           958: an array of type s_type with n dimensions of extents given by the 
        !           959: x_dim\fIi\fP.
        !           960: .Se
        !           961: If s_name is non nil, the function definition of s_name is
        !           962: set to the array structure returned.
        !           963: .No
        !           964: These 
        !           965: functions create a Maclisp compatible array.
        !           966: In 
        !           967: .Fr
        !           968: arrays of type t, nil, fixnum and flonum are equivalent and the elements
        !           969: of these arrays can be any type of lisp object.
        !           970: Fixnum-block and flonum-block arrays are restricted to fixnums and flonums
        !           971: respectively and are used mainly to communicate with 
        !           972: foreign functions (see \(sc8.5).
        !           973: .No
        !           974: .i *array 
        !           975: evaluates its arguments, 
        !           976: .i array
        !           977: does not.
        !           978: .sh 3 array\ predicate
        !           979: .Lf arrayp "'g_arg"
        !           980: .Re
        !           981: t iff g_arg is of type array.
        !           982: .sh 3 array\ accessors
        !           983: 
        !           984: .Lf getaccess "'a_array"
        !           985: .Lx getaux "'a_array"
        !           986: .Lx getdelta "'a_array"
        !           987: .Lx getdata "'a_array"
        !           988: .Lx getlength "'a_array"
        !           989: .Re
        !           990: the field of the array object a_array given by the function name.
        !           991: .Lf arrayref "'a_name 'x_ind"
        !           992: .Re
        !           993: the x_ind\fIth\fP element of the array object a_name.
        !           994: x_ind of zero accesses the first element.
        !           995: .No
        !           996: .i arrayref
        !           997: uses the data, length and delta fields of a_name to determine which
        !           998: object to return.
        !           999: .Lf arraycall "s_type 'as_array 'x_ind1 ... "
        !          1000: .Re
        !          1001: the element selected by  the indices from the array a_array
        !          1002: of type s_type.
        !          1003: .No
        !          1004: If as_array is a symbol then the function binding of this symbol should
        !          1005: contain an array object.
        !          1006: .br
        !          1007: s_type is ignored by
        !          1008: .i arraycall
        !          1009: but is included for compatibility with Maclisp.
        !          1010: .Lf arraydims "'s_name"
        !          1011: .Re
        !          1012: a list of the type and bounds of the array s_name.
        !          1013: .Lf listarray "'sa_array ['x_elements]"
        !          1014: .Re
        !          1015: a list of all of the elements in array sa_array.
        !          1016: If x_elements
        !          1017: is given, then only the first x_elements are returned.
        !          1018: 
        !          1019: .Eb
        !          1020: ; We will create a 3 by 4 array of general lisp objects
        !          1021: \-> \fI(array ernie t 3 4)\fP
        !          1022: array[12]
        !          1023: 
        !          1024: ; the array header is stored in the function definition slot of the
        !          1025: ; symbol ernie
        !          1026: \-> \fI(arrayp (getd 'ernie))\fP
        !          1027: t
        !          1028: \-> \fI(arraydims (getd 'ernie))\fP
        !          1029: (t 3 4)
        !          1030: 
        !          1031: ; store in ernie[2][2] the list (test list)
        !          1032: \-> \fI(store (ernie 2 2) '(test list))\fP
        !          1033: (test list)
        !          1034: 
        !          1035: ; check to see if it is there
        !          1036: \-> \fI(ernie 2 2)\fP
        !          1037: (test list)
        !          1038: 
        !          1039: ; now use the low level function \fIarrayref\fP to find the same element
        !          1040: ; arrays are 0 based and row-major (the last subscript varies the fastest)
        !          1041: ; thus element [2][2] is the 10th element , (starting at 0).
        !          1042: \-> \fI(arrayref (getd 'ernie) 10)\fP
        !          1043: (ptr to)(test list)    ; the result is a value cell (thus the (ptr to))
        !          1044: .Ee
        !          1045: .sh 3 array\ manipulation
        !          1046: .Lf putaccess "'a_array 'su_func"
        !          1047: .Lx putaux "'a_array 'g_aux"
        !          1048: .Lx putdata "'a_array 'g_arg"
        !          1049: .Lx putdelta "'a_array 'x_delta"
        !          1050: .Lx putlength "'a_array 'x_length"
        !          1051: .Re
        !          1052: the second argument to the function.
        !          1053: .Se
        !          1054: The field of the array object given by the function name is replaced
        !          1055: by the second argument to the function.
        !          1056: .Lf store "'l_arexp 'g_val"
        !          1057: .Wh
        !          1058: l_arexp is an expression
        !          1059: which references an array element.
        !          1060: .Re
        !          1061: g_val
        !          1062: .Se
        !          1063: the array location which contains the element which l_arexp references is 
        !          1064: changed to contain g_val.
        !          1065: .Lf fillarray "'s_array 'l_itms"
        !          1066: .Re
        !          1067: s_array
        !          1068: .Se
        !          1069: the array s_array is filled with elements from l_itms.
        !          1070: If there are not enough elements in l_itms to fill the entire array,
        !          1071: then the last element of l_itms is used to fill the remaining parts
        !          1072: of the array.
        !          1073: .sh 2 Hunks
        !          1074: .pp
        !          1075: Hunks are vector-like objects whose size can range from 1 to 128 elements.
        !          1076: Internally, hunks are allocated in sizes which are powers of 2.
        !          1077: In order to create hunks of a given size, 
        !          1078: a hunk with at least that many elements is allocated
        !          1079: and a distinguished symbol \s-2EMPTY\s0 is placed in those 
        !          1080: elements not requested.
        !          1081: Most hunk functions respect those distinguished symbols, but there are
        !          1082: two 
        !          1083: .i (*makhunk
        !          1084: and
        !          1085: .i *rplacx )
        !          1086: which will overwrite the distinguished symbol.
        !          1087: .sh 3 hunk\ creation
        !          1088: .Lf hunk "'g_val1 ['g_val2 ... 'g_val\fIn\fP]"
        !          1089: .Re
        !          1090: a hunk of length n whose elements are initialized to the g_val\fIi\fP.
        !          1091: .No
        !          1092: the maximum size of a hunk is 128.
        !          1093: .Ex
        !          1094: \fI(hunk 4 'sharp 'keys)\fP = {4 sharp keys}
        !          1095: .Lf makhunk "'xl_arg"
        !          1096: .Re
        !          1097: a hunk of length xl_arg initialized to all nils if xl_arg is a fixnum.
        !          1098: If xl_arg is a list, then we return a hunk of size \fI(length\ 'xl_arg)\fP
        !          1099: initialized to the elements in xl_arg.
        !          1100: .No
        !          1101: \fI(makhunk\ '(a\ b\ c))\fP is equivalent to \fI(hunk\ 'a\ 'b\ 'c)\fP.
        !          1102: .Ex
        !          1103: \fI(makhunk 4)\fP = \fI{nil nil nil nil}\fP
        !          1104: .Lf *makhunk "'x_arg"
        !          1105: .Re
        !          1106: a hunk of size 2\*[x_arg\*] initialized to \s-2EMPTY\s0.
        !          1107: .No
        !          1108: This is only to be used by such functions as \fIhunk\fP and \fImakhunk\fP
        !          1109: which create and initialize hunks for users.
        !          1110: .sh 3 hunk\ accessor
        !          1111: .Lf cxr "'x_ind 'h_hunk"
        !          1112: .Re
        !          1113: element x_ind (starting at 0) of hunk h_hunk.
        !          1114: .Lf hunk-to-list 'h_hunk
        !          1115: .Re
        !          1116: a list consisting of the elements of h_hunk.
        !          1117: .sh 3 hunk\ manipulators
        !          1118: .Lf rplacx "'x_ind 'h_hunk 'g_val"
        !          1119: .Lx *rplacx "'x_ind 'h_hunk 'g_val"
        !          1120: .Re
        !          1121: h_hunk
        !          1122: .Se
        !          1123: Element x_ind (starting at 0) of h_hunk is set to g_val.
        !          1124: .No
        !          1125: .i rplacx 
        !          1126: will not modify one of the distinguished (EMPTY) elements
        !          1127: whereas
        !          1128: .i *rplacx 
        !          1129: will.
        !          1130: .Lf hunksize "'h_arg"
        !          1131: .Re
        !          1132: the size of the hunk h_arg.
        !          1133: .Ex
        !          1134: \fI(hunksize (hunk 1 2 3))\fP = 3
        !          1135: .sh 2 Bcds
        !          1136: .pp
        !          1137: A bcd object contains a pointer to compiled code and to the type of 
        !          1138: function object the compiled code represents.
        !          1139: .Lf getdisc "'y_bcd"
        !          1140: .Lx getentry "'y_bcd"
        !          1141: .Re
        !          1142: the field of the bcd object given by the function name. 
        !          1143: .Lf putdisc "'y_func 's_discipline"
        !          1144: .Re
        !          1145: s_discipline
        !          1146: .Se
        !          1147: Sets the discipline field of y_func to s_discipline.
        !          1148: .sh 2 Structures
        !          1149: .pp
        !          1150: There are three common structures constructed out of list cells: the
        !          1151: assoc list, the property list and the tconc list.
        !          1152: The functions below manipulate these structures.
        !          1153: .sh 3 assoc\ list
        !          1154: .pp
        !          1155: An `assoc list' (or alist) is a common lisp data structure.  It has the
        !          1156: form 
        !          1157: .br
        !          1158: .ce 1
        !          1159: ((key1 . value1) (key2 . value2) (key3 . value3) ... (keyn . valuen))
        !          1160: .Lf assoc "'g_arg1 'l_arg2"
        !          1161: .Lx assq "'g_arg1 'l_arg2"
        !          1162: .Re
        !          1163: the first top level element of l_arg2 whose
        !          1164: .i car
        !          1165: is 
        !          1166: .i equal
        !          1167: (with 
        !          1168: .i assoc )
        !          1169: or
        !          1170: .i eq
        !          1171: (with 
        !          1172: .i assq )
        !          1173: to g_arg1.
        !          1174: .No
        !          1175: Usually l_arg2 has an
        !          1176: .i a-list
        !          1177: structure and g_arg1 acts as key.
        !          1178: .Lf sassoc "'g_arg1 'l_arg2 'sl_func"
        !          1179: .Re 
        !          1180: the result of \fI(cond\ ((assoc\ 'g_arg\ 'l_arg2)\ (apply\ 'sl_func\ nil)))\fP
        !          1181: .No
        !          1182: sassoc is written as a macro.
        !          1183: .Lf sassq "'g_arg1 'l_arg2 'sl_func"
        !          1184: .Re 
        !          1185: the result of \fI(cond\ ((assq\ 'g_arg\ 'l_arg2)\ (apply\ 'sl_func\ nil)))\fP
        !          1186: .No
        !          1187: sassq is written as a macro.
        !          1188: 
        !          1189: .Eb
        !          1190: ; \fIassoc\fP or \fIassq\fP is given a key and an assoc list and returns
        !          1191: ; the key and value item if it exists, they differ only in how they test
        !          1192: ; for equality of the keys.
        !          1193: 
        !          1194: \-> \fI(setq alist '((alpha . a) ( (complex key) . b) (junk . x)))\fP
        !          1195: ((alpha . a) ((complex key) . b) (junk . x))
        !          1196: 
        !          1197: ; we should use \fIassq\fP when the key is an atom
        !          1198: \-> \fI(assq 'alpha alist)\fP
        !          1199: (alpha . a)
        !          1200: 
        !          1201: ; but it may not work when the key is a list
        !          1202: \-> \fI(assq '(complex key) alist)\fP
        !          1203: nil
        !          1204: 
        !          1205: ; however \fIassoc\fP will always work
        !          1206: \-> \fI(assoc '(complex key) alist)\fP
        !          1207: ((complex key) . b)
        !          1208: .Ee
        !          1209: .Lf sublis "'l_alst 'l_exp"
        !          1210: .Wh
        !          1211: l_alst is an 
        !          1212: .i a-list .
        !          1213: .Re
        !          1214: the list l_exp with every occurrence of key\fIi\fP replaced by val\fIi\fP.
        !          1215: .No
        !          1216: new list structure is returned to prevent modification of l_exp.
        !          1217: When a substitution is made, a copy of the value to substitute in 
        !          1218: is not made.
        !          1219: .sh 3 property\ list
        !          1220: .pp
        !          1221: A property list consists of an alternating sequence of keys and
        !          1222: values.  Normally a property list is stored on a symbol. A list
        !          1223: is a 'disembodied' property list if it contains an odd number of
        !          1224: elements, the first of which is ignored.
        !          1225: .Lf plist "'s_name"
        !          1226: .Re
        !          1227: the property list of s_name.
        !          1228: .Lf setplist "'s_atm 'l_plist"
        !          1229: .Re
        !          1230: l_plist.
        !          1231: .Se
        !          1232: the property list of s_atm is set to l_plist.
        !          1233: 
        !          1234: .Lf get "'ls_name 'g_ind"
        !          1235: .Re
        !          1236: the value under indicator g_ind in ls_name's property list if ls_name
        !          1237: is a symbol.
        !          1238: .No
        !          1239: If there is no indicator g_ind in ls_name's property list nil is returned.
        !          1240: If ls_name is a list of an odd number of elements then it is a disembodied
        !          1241: property list. 
        !          1242: \fIget\fP searches a disembodied property list by starting at its 
        !          1243: \fIcdr\fP, and comparing every other element with g_ind, using 
        !          1244: \fIeq\fP.
        !          1245: .Lf getl "'ls_name 'l_indicators"
        !          1246: .Re
        !          1247: the property list ls_name beginning at the first indicator which is
        !          1248: a member of the list l_indicators, or nil if none of the indicators
        !          1249: in l_indicators are on ls_name's property list.
        !          1250: .No
        !          1251: If ls_name is a list, then it is assumed to be a disembodied property
        !          1252: list.
        !          1253: 
        !          1254: .Lf putprop "'ls_name 'g_val 'g_ind"
        !          1255: .Lx defprop "ls_name g_val g_ind"
        !          1256: .Re
        !          1257: g_val.
        !          1258: .Se
        !          1259: Adds to the property list of ls_name the value g_val under the indicator
        !          1260: g_ind.
        !          1261: .No
        !          1262: .i putprop
        !          1263: evaluates it arguments, 
        !          1264: .i defprop
        !          1265: does not.
        !          1266: ls_name may be a disembodied property list, see \fIget\fP.
        !          1267: .Lf remprop "'ls_name 'g_ind"
        !          1268: .Re
        !          1269: the portion of  ls_name's property list beginning with the 
        !          1270: property under the indicator g_ind.
        !          1271: If there is no g_ind indicator in ls_name's plist, nil is returned.
        !          1272: .Se
        !          1273: the value under indicator g_ind and g_ind itself is removed from 
        !          1274: the property list of ls_name.
        !          1275: .No
        !          1276: ls_name may be a disembodied property list, see \fIget\fP.
        !          1277: 
        !          1278: .Eb
        !          1279: \-> \fI(putprop 'xlate 'a 'alpha)\fP
        !          1280: a
        !          1281: \-> \fI(putprop 'xlate 'b 'beta)\fP
        !          1282: b
        !          1283: \-> \fI(plist 'xlate)\fP
        !          1284: (alpha a beta b)
        !          1285: \-> \fI(get 'xlate 'alpha)\fP
        !          1286: a
        !          1287: ; use of a disembodied property list:
        !          1288: \-> \fI(get '(nil fateman rjf sklower kls foderaro jkf) 'sklower)\fP
        !          1289: kls
        !          1290: .Ee
        !          1291: .sh 3 tconc\ structure
        !          1292: .pp
        !          1293: A tconc structure is a special type of list designed to make it
        !          1294: easy to add objects to the end.
        !          1295: It consists of a list cell whose 
        !          1296: .i car
        !          1297: points to a 
        !          1298: list of the elements added with 
        !          1299: .i tconc
        !          1300: or 
        !          1301: .i lconc
        !          1302: and whose
        !          1303: .i cdr
        !          1304: points to the last list cell of the list pointed to by the 
        !          1305: .i car.
        !          1306: .Lf tconc "'l_ptr 'g_x"
        !          1307: .Wh
        !          1308: l_ptr is a tconc structure.
        !          1309: .Re
        !          1310: l_ptr with g_x added to the end.
        !          1311: .Lf lconc "'l_ptr 'l_x"
        !          1312: .Wh
        !          1313: l_ptr is a tconc structure.
        !          1314: .Re
        !          1315: l_ptr with the list l_x spliced in at the end.
        !          1316: .Eb
        !          1317: ; A \fItconc\fP structure can be initialized in two  ways.  
        !          1318: ; nil can be given to \fItconc\fP in which case \fItconc\fP will generate 
        !          1319: ; a \fItconc\fP structure.
        !          1320: 
        !          1321: \->\fI(setq foo (tconc nil 1))\fP
        !          1322: ((1) 1)
        !          1323: 
        !          1324: ; Since \fItconc\fP destructively adds to 
        !          1325: ; the list, you can now add to foo without using \fIsetq\fP again.
        !          1326: 
        !          1327: \->\fI(tconc foo 2)\fP
        !          1328: ((1 2) 2)
        !          1329: \->\fIfoo\fP
        !          1330: ((1 2) 2)
        !          1331: 
        !          1332: ; Another way to create a null  \fItconc\fP structure
        !          1333: ; is to use \fI(ncons\ nil)\fP.
        !          1334: 
        !          1335: \->\fI(setq foo (ncons nil))\fP
        !          1336: (nil)
        !          1337: \->\fI(tconc foo 1)\fP
        !          1338: ((1) 1)
        !          1339: 
        !          1340: ; now see what \fIlconc\fP can do
        !          1341: \-> \fI(lconc foo nil)\fP
        !          1342: ((1) 1)                        ; no change
        !          1343: \-> \fI(lconc foo '(2 3 4))\fP
        !          1344: ((1 2 3 4) 4)
        !          1345: .Ee
        !          1346: .sh 3 fclosures
        !          1347: .pp
        !          1348: An fclosure is a functional object which admits some data
        !          1349: manipulations.  They are discussed in \(sc8.4.
        !          1350: Internally, they are constructed from vectors.
        !          1351: .Lf fclosure "'l_vars 'g_funobj"
        !          1352: .Wh
        !          1353: l_vars is a list of variables, g_funobj is any object
        !          1354: that can be funcalled (including, fclosures).
        !          1355: .Re
        !          1356: A vector which is the fclosure.
        !          1357: .Lf fclosure-alist "'v_fclosure"
        !          1358: .Re
        !          1359: An association list representing the variables in the fclosure.
        !          1360: This is a snapshot of the current state of the fclosure.
        !          1361: If the bindings in the fclosure are changed, any previously
        !          1362: calculated results of
        !          1363: .i fclosure-alist
        !          1364: will not change.
        !          1365: .Lf fclosure-function "'v_fclosure"
        !          1366: .Re
        !          1367: the functional object part of the fclosure.
        !          1368: .Lf fclosurep "'v_fclosure"
        !          1369: .Re
        !          1370: t iff the argument is an fclosure.
        !          1371: .Lf symeval-in-fclosure "'v_fclosure 's_symbol"
        !          1372: .Re
        !          1373: the current binding of a particular symbol in an fclosure.
        !          1374: .Lf set-in-fclosure "'v_fclosure 's_symbol 'g_newvalue"
        !          1375: .Re
        !          1376: g_newvalue.
        !          1377: .Se
        !          1378: The variable s_symbol is bound in the fclosure to g_newvalue.
        !          1379: .sh 2 Random\ functions
        !          1380: .pp
        !          1381: The following functions don't fall into any of the classifications above.
        !          1382: .Lf bcdad "'s_funcname"
        !          1383: .Re
        !          1384: a fixnum which is the address in memory where the function 
        !          1385: s_funcname begins.
        !          1386: If s_funcname is not a machine coded function (binary) then 
        !          1387: .i bcdad 
        !          1388: returns nil.
        !          1389: .Lf copy "'g_arg"
        !          1390: .Re
        !          1391: A structure 
        !          1392: .i equal
        !          1393: to g_arg but with new list cells.
        !          1394: .Lf copyint* "'x_arg"
        !          1395: .Re
        !          1396: a fixnum with the same value as x_arg but in a freshly allocated cell.
        !          1397: .Lf cpy1 "'xvt_arg"
        !          1398: .Re
        !          1399: a new cell of the same type as xvt_arg with the same value as xvt_arg.
        !          1400: .Lf getaddress "'s_entry1 's_binder1 'st_discipline1 [... ... ...]"
        !          1401: .Re
        !          1402: the binary object which s_binder1's  function field is set to.
        !          1403: .No
        !          1404: This looks in the running lisp's symbol table for a symbol with the same
        !          1405: name as s_entry\fIi\fP.
        !          1406: It then creates a binary object
        !          1407: whose entry field points to s_entry\fIi\fP 
        !          1408: and whose discipline is st_discipline\fIi\fP.
        !          1409: This binary object is stored in the function field of s_binder\fIi\fP.
        !          1410: If st_discipline\fIi\fP is nil, then "subroutine" is used by default.
        !          1411: This is especially useful for 
        !          1412: .i cfasl
        !          1413: users.
        !          1414: .Lf macroexpand "'g_form"
        !          1415: .Re
        !          1416: g_form after all macros in it are
        !          1417: expanded.
        !          1418: .No
        !          1419: This function will only macroexpand 
        !          1420: expressions which could be evaluated
        !          1421: and it does not know about the special nlambdas such as 
        !          1422: .i cond
        !          1423: and
        !          1424: .i do ,
        !          1425: thus it misses many macro expansions.
        !          1426: .Lf ptr "'g_arg"
        !          1427: .Re
        !          1428: a value cell initialized to point to g_arg.
        !          1429: .Lf quote "g_arg"
        !          1430: .Re
        !          1431: g_arg.
        !          1432: .No
        !          1433: the reader allows you to abbreviate (quote foo) as 'foo.
        !          1434: .Lf kwote "'g_arg"
        !          1435: .Re
        !          1436:  \fI(list (quote quote) g_arg)\fP.
        !          1437: .Lf replace "'g_arg1 'g_arg2"
        !          1438: .Wh
        !          1439: g_arg1 and g_arg2 must be the same type of lispval and not symbols or hunks.
        !          1440: .Re
        !          1441: g_arg2.
        !          1442: .Se
        !          1443: The effect of
        !          1444: .i replace 
        !          1445: is dependent on the type of the g_arg\fIi\fP although one will notice 
        !          1446: a similarity in the effects.
        !          1447: To understand what 
        !          1448: .i replace
        !          1449: does to fixnum and flonum arguments,
        !          1450: you must first understand that 
        !          1451: such numbers are `boxed' in 
        !          1452: .Fr .
        !          1453: What this means is that if the symbol x has a value 32412, then in
        !          1454: memory the value element of x's symbol structure contains the address of
        !          1455: another word of memory (called a box) with 32412 in it.
        !          1456: .br
        !          1457: .sp
        !          1458: Thus, there are two ways of changing the value of x:
        !          1459: the first is to change
        !          1460: the value element of x's symbol structure to point to a word of memory
        !          1461: with a different value.
        !          1462: The second way is to change the value in the box which x points to.
        !          1463: The former method is used almost all of the time, the latter is
        !          1464: used very rarely and has the potential to cause great confusion.
        !          1465: The function
        !          1466: .i replace
        !          1467: allows you to do the latter, i.e., to actually change the value in
        !          1468: the box.
        !          1469: .br
        !          1470: .sp
        !          1471: You should watch out for these situations.
        !          1472: If you do \fI(setq\ y\ x)\fP,
        !          1473: then both x and y will point to the same box.
        !          1474: If you now \fI(replace\ x\ 12345)\fP,
        !          1475: then y will also have the value 12345.
        !          1476: And, in fact, there may be many other pointers to that box.
        !          1477: .br
        !          1478: .sp
        !          1479: Another problem with replacing fixnums
        !          1480: is that some boxes are read-only.
        !          1481: The fixnums between -1024 and 1023 are stored in a read-only area
        !          1482: and attempts to replace them will result in an "Illegal memory reference"
        !          1483: error (see the description of 
        !          1484: .i copyint*
        !          1485: for a way around this problem).
        !          1486: .br
        !          1487: .sp
        !          1488: For the other valid types, the effect of 
        !          1489: .i replace 
        !          1490: is easy to understand.
        !          1491: The fields of g_val1's structure are made eq to the corresponding fields of
        !          1492: g_val2's structure.
        !          1493: For example, if x  and  y have lists as values then the effect of
        !          1494: \fI(replace\ x\ y)\fP is the same as 
        !          1495: \fI(rplaca\ x\ (car\ y))\fP and \fI(rplacd\ x\ (cdr\ y))\fP.
        !          1496: .Lf scons "'x_arg 'bs_rest"
        !          1497: .Wh
        !          1498: bs_rest is a bignum or nil.
        !          1499: .Re
        !          1500: a bignum whose first bigit is x_arg 
        !          1501: and whose higher order bigits are bs_rest.
        !          1502: .Lf setf "g_refexpr 'g_value"
        !          1503: .No
        !          1504: .i setf
        !          1505: is a generalization of setq.  Information may be stored by
        !          1506: binding variables, replacing entries of arrays, and vectors,
        !          1507: or being put on property lists, among others.
        !          1508: Setf will allow the user to store data into some location,
        !          1509: by mentioning the operation used to refer to the location.
        !          1510: Thus, the first argument may be partially evaluated, but only
        !          1511: to the extent needed to calculate a reference.
        !          1512: .i setf
        !          1513: returns g_value.
        !          1514: (Compare to
        !          1515: .i desetq
        !          1516: )
        !          1517: .Eb
        !          1518:   (setf x 3)        =  (setq x 3)
        !          1519:   (setf (car x) 3)  = (rplaca x 3)
        !          1520:   (setf (get foo 'bar) 3) = (putprop foo 3 'bar)
        !          1521:   (setf (vref vector index) value) = (vset vector index value)
        !          1522: .Ee
        !          1523: .Lf sort "'l_data 'u_comparefn"
        !          1524: .Re
        !          1525: a list of the elements of l_data ordered by the comparison
        !          1526: function u_comparefn.
        !          1527: .Se
        !          1528: the list l_data is modified rather than allocated in new storage.
        !          1529: .No
        !          1530: \fI(comparefn 'g_x 'g_y)\fP should return something
        !          1531: non-nil if g_x can precede g_y in sorted order; nil if g_y must precede
        !          1532: g_x.  
        !          1533: If u_comparefn is nil, 
        !          1534: alphabetical order will be used.
        !          1535: .Lf sortcar "'l_list 'u_comparefn"
        !          1536: .Re
        !          1537: a list of the elements of l_list with the 
        !          1538: .i car 's
        !          1539: ordered by the sort function u_comparefn.
        !          1540: .Se
        !          1541: the list l_list is modified rather than copied.
        !          1542: .No
        !          1543: Like \fIsort\fP, 
        !          1544: if u_comparefn is nil, 
        !          1545: alphabetical order will be used.

unix.superglobalmegacorp.com

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