Annotation of 43BSD/ucb/lisp/lisplib/vector.l, revision 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.