Annotation of 43BSD/ucb/lisp/lisplib/vector.l, revision 1.1.1.1

1.1       root        1: (setq rcs-vector-
                      2:    "$Header: vector.l 1.5 83/07/30 15:35:51 layer Exp $")
                      3: 
                      4: ;; vector handling functions   -[Sun Jun 19 15:09:14 1983 by jkf]-
                      5: ;; [also contains closure functions]
                      6: ;;
                      7: ;; preliminary.  this is subject to change at any moment.
                      8: ;; Don't use the functions in this file!!      --jkf
                      9: ;;
                     10: ;; contains functions:
                     11: ;;  vector{,i-byte,i-word,i-long}   : create and initialize
                     12: ;;  vref{,i-byte,i-word,i-long}         : reference
                     13: ;;  vset{,i-byte,i-word,i-long}         : set
                     14: ;;  vsize      -- must write
                     15: ;;  vsize-word
                     16: ;;  vsize-byte 
                     17: ;;
                     18: ;; references external functions
                     19: ;;  new-vector{,i-byte,i-word,i-long
                     20: ;;
                     21: ;; references internal functions:
                     22: ;;  int:vref 'vect 'index 'class
                     23: ;;  int:vset 'vect 'index 'value 'class
                     24: ;;  int:vsize 'vect
                     25: 
                     26: ;--- vector
                     27: ;  call is (vector elmt0 elmt1 ... elmtn)
                     28: ; creates an n-1 size vector and initializes
                     29: ;
                     30: (defmacro vector-macro (create class)
                     31:    `(let ((vec (,create n)))
                     32:       (do ((from n to)
                     33:           (to (1- n) (1- to)))
                     34:          ((< to 0))
                     35:          (int:vset vec to (arg from) ,class))
                     36:       vec))
                     37: 
                     38: (defun vector n (vector-macro new-vector 3))
                     39: (defun vectori-byte n (vector-macro new-vectori-byte 0))
                     40: (defun vectori-word n (vector-macro new-vectori-word 1))
                     41: (defun vectori-long n (vector-macro new-vectori-long 2))
                     42: 
                     43: ;--- vref
                     44: ; refernces an element of a vector
                     45: ;   (vref 'vect 'index)
                     46: ;
                     47: (defmacro vref-macro (vector index predicate limit class)
                     48:    `(cond ((not (,predicate ,vector))
                     49:          ,(cond ((eq predicate 'vector)
                     50:                  `(error "vref: non vector argument " ,vector))
                     51:                 (t `(error "vref: non vectori argument " ,vector))))
                     52:         ((not (fixp ,index))
                     53:          (error "vref: non fixnum index " ,index))
                     54:         ((or (< ,index 0) (not (< ,index ,limit)))
                     55:          (error "vref: index out of range " ,index ,vector))
                     56:         (t (int:vref ,vector ,index ,class))))
                     57: 
                     58: (defun vref (vect ind)
                     59:    (vref-macro vect ind vectorp (vsize vect) 3))
                     60: 
                     61: (defun vrefi-byte (vect ind)
                     62:    (vref-macro vect ind vectorip (vsize-byte vect) 0))
                     63: (defun vrefi-word (vect ind)
                     64:    (vref-macro vect ind vectorip (vsize-word vect) 1))
                     65: (defun vrefi-long (vect ind)
                     66:    (vref-macro vect ind vectorip (vsize vect) 2))
                     67: 
                     68: 
                     69: ;--- vset
                     70: ; use:
                     71: ;      (vset 'vector 'index 'value)
                     72: ;
                     73: (defmacro vset-macro (vector index value predicate limit class)
                     74:    `(cond ((not (,predicate ,vector))
                     75:          ,(cond ((eq predicate 'vector)
                     76:                  `(error "vset: non vector argument " ,vector))
                     77:                 (t `(error "vset: non vectori argument " ,vector))))
                     78:         ((not (fixp ,index))
                     79:          (error "vset: non fixnum index " ,index))
                     80:         ((or (<& ,index 0) (not (<& ,index ,limit)))
                     81:          (error "vset: index out of range " ,index ,vector))
                     82:         (t (int:vset ,vector ,index ,value ,class))))
                     83: 
                     84: (defun vset (vect ind val)
                     85:    (vset-macro vect ind val vectorp (vsize vect) 3))
                     86: 
                     87: (defun vseti-byte (vect ind val)
                     88:    (vset-macro vect ind val vectorip (vsize-byte vect) 0))
                     89: 
                     90: (defun vseti-word (vect ind val)
                     91:    (vset-macro vect ind val vectorip (vsize-word vect) 1))
                     92: 
                     93: (defun vseti-long (vect ind val)
                     94:    (vset-macro vect ind val vectorip  (vsize vect) 2))
                     95: 
                     96: 
                     97: ;;; vector sizes
                     98: 
                     99: ;--- vsize :: size of vector viewed as vector of longwords
                    100: ;
                    101: (defun vsize (vector)
                    102:    (if (or (vectorp vector) (vectorip vector))
                    103:       then (int:vsize vector 2)
                    104:       else (error "vsize: non vector argument " vector)))
                    105: 
                    106: (defun vsize-word (vectori)
                    107:    (if (vectorip vectori)
                    108:       then (int:vsize vectori 1)
                    109:       else (error "vsize-word: non vectori argument " vectori)))
                    110: 
                    111: (defun vsize-byte (vectori)
                    112:    (if (vectorip vectori)
                    113:       then (int:vsize vectori 0)
                    114:       else (error "vsize-byte: non vectori argument " vectori)))
                    115: 
                    116: ;; vector property list functions
                    117: ;;
                    118: (defun vget (vector ind)
                    119:    (let ((x (vprop vector)))
                    120:       (if (dtpr x)
                    121:         then (get x ind))))
                    122: 
                    123: ;--- vputprop :: store value, indicator pair on property list
                    124: ; if a non-dtpr is already there,  make it the car of the list
                    125: ;
                    126: (defun vputprop (vector value ind)
                    127:    (let ((x (vprop vector)))
                    128:       (if (not (dtpr x))       
                    129:         then (setq x (ncons x))
                    130:              (vsetprop vector x))
                    131:       (putprop x value ind)))
                    132: 
                    133:             
                    134: ;; closures
                    135: ;
                    136: ;- closures are implemented in terms of vectors so we'll store the
                    137: ; code here for now
                    138: ;  a closure is a vector with leader field eq to 'closure'
                    139: ; the 0th element of a closure vector is the functional form
                    140: ; to funcall
                    141: ; then the elements go in triplets
                    142: ;                      1 is the symbol name
                    143: ;                          either
                    144: ;      2 is nil                        2 is a pointer to a vector
                    145: ;      3 is the saved value            3 is a fixnum index into the vector
                    146: ;       ^                                 ^
                    147: ;       |---- the simple case             |-- when we are sharing a value
                    148: ;                                             slot, this points to the
                    149: ;                                             value slot
                    150: ;
                    151: ; the size of the vector tells the number of variables.
                    152: ;
                    153: 
                    154: ;--- closure :: make a closure
                    155: ; form (closure 'l_vars 'g_fcn)
                    156: ; l_vars is a list of symbols
                    157: ; g_fcn is a functional form, either a symbol or a lambda expression
                    158: ; alist is a list of what has been already stored so far.
                    159: ;   it will always be non nil, so we can nconc to it to return values.
                    160: ;
                    161: (defun make-fclosure-with-alist (vars fcn alist)
                    162:    (cond ((not (or (null vars) (dtpr vars)))
                    163:          (error "fclosure: vars list has a bad form " vars)))
                    164:    
                    165:    (let ((vect (new-vector (1+ (length vars)) nil 'fclosure)))
                    166:       (do ((xx vars (cdr xx))
                    167:           (val)
                    168:           (sym)
                    169:           (i 1 (1+ i)))
                    170:          ((null xx)
                    171:           (setf (vref vect 0) fcn)     ; store the function to call
                    172:           vect)
                    173:          (setq sym (car xx))
                    174:          (cond ((not (symbolp sym))
                    175:                 (error "fclosure: non symbol in var list " sym)))
                    176: 
                    177:          ; don't allow the variable nil to be closed over
                    178:          (cond ((null sym)
                    179:                 (error "fclosure: you can't close over nil " vars)))
                    180: 
                    181:          ; if the fclosure variable has already been given slot, use
                    182:          ; it, else make a new one
                    183:          (cond ((null (setq val (assq sym alist)))
                    184:                   ; if the variable is bound use it's current value,
                    185:                   ; else use nil
                    186:                   (cond ((setq val (boundp sym))
                    187:                          (setq val (cdr val))))
                    188:                   ; generate a new closure variable object
                    189:                   (setq val (cons sym (cons val (copyint* 0))))
                    190:                   ; remember this value for later fclosures
                    191:                   (nconc alist (list val))))
                    192:          (setf (vref vect i) val))))
                    193:    
                    194: 
                    195: 
                    196: ;--- fclosure :: generate a simple fclosure
                    197: ; 
                    198: (defun fclosure (vars func)
                    199:    (make-fclosure-with-alist vars func (list nil)))
                    200: 
                    201: (defun fclosure-list n
                    202:    (cond ((not (evenp n))
                    203:          (error "fclosure-alist: not given an even number of arguments: "
                    204:                 (listify n))))
                    205:    (do ((i 1 (+ i 2))
                    206:        (alist (list nil))
                    207:        (res))
                    208:        ((> i n) (nreverse res))
                    209:        (push (make-fclosure-with-alist (arg i) (arg (1+ i)) alist) res)))
                    210: 
                    211: (defun fclosurep (fclosure)
                    212:    (and (vectorp fclosure)
                    213:        (eq 'fclosure (vprop fclosure))))
                    214: (defun fclosure-alist (fclosure)
                    215:    (cond ((fclosurep fclosure)
                    216:          (do ((xx 1 (1+ xx))
                    217:               (lim  (vsize fclosure))
                    218:               (val)
                    219:               (res))
                    220:              ((not (< xx lim))
                    221:               res)
                    222:              (setq val (vref fclosure xx))
                    223:              (push (cons (car val) (cadr val)) res)))
                    224:         (t (error "fclosure-alist: non fclosure argument: " fclosure))))
                    225: 
                    226: 
                    227: 
                    228: (defun fclosure-function (fclosure)
                    229:    (and (fclosurep fclosure)
                    230:        (vref fclosure 0)))
                    231: 
                    232: (defun vector-dump (vect)
                    233:    (let (size)
                    234:       (msg "size = " (setq size (vsize vect)) ", prop= " (vprop vect) N)
                    235:       (do ((ii 0 (1+ ii)))
                    236:          ((not (< ii size)))
                    237:          (msg ii ": " (vref vect ii) N ))))
                    238:    
                    239:        
                    240: ;--- symeval-in-fclosure :: determine the value of a symbol
                    241: ;   with respect to an fclosure.
                    242: ;
                    243: (defun symeval-in-fclosure (fclosure symbol)
                    244:   (cond ((not (fclosurep fclosure))
                    245:         (error "set-in-fclosure: non fclosure first argument: " fclosure))
                    246:        (t (do ((xx 1 (1+ xx))
                    247:                (val)
                    248:                (lim (vsize fclosure)))
                    249:               ((not (< xx lim))
                    250:                (error "symeval-in-fclosure: variable not found" symbol))
                    251:               (setq val (vref fclosure xx))
                    252:               (cond ((eq symbol (car val))
                    253:                      (return (int:fclosure-stack-stuff val))))))))
                    254: 
                    255: ;--- set-in-fclosure :: set the value of a symbol in an fclosure
                    256: ;
                    257: (defun set-in-fclosure (fclosure symbol value)
                    258:   (cond ((not (fclosurep fclosure))
                    259:         (error "set-in-fclosure: non fclosure first argument: " fclosure))
                    260:        (t (do ((xx 1 (1+ xx))
                    261:                (val)
                    262:                (lim (vsize fclosure)))
                    263:               ((not (< xx lim))
                    264:                (error "set-in-fclosure: variable not found" symbol))
                    265:               (setq val (vref fclosure xx))
                    266:               (cond ((eq symbol (car val))
                    267:                      (return (int:fclosure-stack-stuff val value))))))))
                    268: 
                    269: (defmacro let-fclosed (vars function)
                    270:   `(let ,vars (fclosure ',(mapcar #'(lambda (x) (if (atom x) x (car x))) vars)
                    271:                        ,function)))
                    272:                
                    273: 

unix.superglobalmegacorp.com

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