Annotation of 43BSD/ucb/lisp/liszt/datab.l, revision 1.1

1.1     ! root        1: (include-if (null (get 'chead 'version)) "../chead.l")
        !             2: (Liszt-file datab
        !             3:    "$Header: datab.l,v 1.5 83/08/28 17:14:27 layer Exp $")
        !             4: 
        !             5: ;;; ----       d a t a b                       data base
        !             6: ;;;
        !             7: ;;;                            -[Sat Aug  6 23:59:11 1983 by layer]-
        !             8: 
        !             9: ;--- d-tranloc :: locate a function in the transfer table
        !            10: ;
        !            11: ; return the offset we should use for this function call
        !            12: ;
        !            13: (defun d-tranloc (fname)
        !            14:    (cond ((get fname g-tranloc))
        !            15:         (t (Push g-tran fname)
        !            16:            (let ((newval (* 8 g-trancnt)))
        !            17:                (putprop fname newval g-tranloc)
        !            18:                (incr g-trancnt)
        !            19:                newval))))
        !            20: 
        !            21: 
        !            22: ;--- d-loc :: return the location of the variable or value in IADR form 
        !            23: ;      - form : form whose value we are to locate
        !            24: ;
        !            25: ; if we are given a xxx as form, we check yyy;
        !            26: ;      xxx             yyy
        !            27: ;     --------      ---------
        !            28: ;      nil          Nil is always returned
        !            29: ;      symbol       return the location of the symbols value, first looking
        !            30: ;                   in the registers, then on the stack, then the bind list.
        !            31: ;                   If g-ingorereg is t then we don't check the registers.
        !            32: ;                   We would want to do this if we were interested in storing
        !            33: ;                   something in the symbol's value location.
        !            34: ;      number       always return the location of the number on the bind
        !            35: ;                   list (as a (lbind n))
        !            36: ;      other        always return the location of the other on the bind
        !            37: ;                   list (as a (lbind n))
        !            38: ;
        !            39: (defun d-loc (form)
        !            40:    (if (null form) then 'Nil
        !            41:     elseif (numberp form) then
        !            42:         (if (and (fixp form) (greaterp form -1025) (lessp form 1024))
        !            43:             then `(fixnum ,form)               ; small fixnum
        !            44:             else (d-loclit form nil))
        !            45:     elseif (symbolp form) 
        !            46:        then (if (and (null g-ignorereg) (car (d-bestreg form nil))) thenret
        !            47:                else (if (d-specialp form) then (d-loclit form t)
        !            48:                         else (do ((ll g-locs (cdr ll)) ; check stack
        !            49:                                   (n g-loccnt))
        !            50:                                  ((null ll)
        !            51:                                   (comp-warn (or form)
        !            52:                                              " declared special by compiler")
        !            53:                                   (d-makespec form)
        !            54:                                   (d-loclit form t))
        !            55:                                  (if (atom (car ll))
        !            56:                                      then (if (eq form (car ll))
        !            57:                                               then (return `(stack ,n))
        !            58:                                               else (setq n (1- n)))))))
        !            59:        else (d-loclit form nil)))
        !            60: 
        !            61: 
        !            62: ;--- d-loclit :: locate or add litteral to bind list
        !            63: ;      - form : form to check for and add if not present
        !            64: ;      - flag : if t then if we are given a symbol, return the location of
        !            65: ;               its value, else return the location of the symbol itself
        !            66: ;
        !            67: ; scheme: we share the locations of atom (symbols,numbers,string) but always
        !            68: ;       create a fresh copy of anything else.
        !            69: (defun d-loclit (form flag)
        !            70:    (prog (loc onplist symboltype)
        !            71:        (if (null form) 
        !            72:           then (return 'Nil)
        !            73:        elseif (symbolp form)
        !            74:           then (setq symboltype t)
        !            75:                (cond ((setq loc (get form g-bindloc))
        !            76:                       (setq onplist t)))
        !            77:        elseif (atom form)
        !            78:           then (do ((ll g-lits (cdr ll))       ; search for atom on list
        !            79:                     (n g-litcnt (1- n)))
        !            80:                    ((null ll))
        !            81:                    (if (eq form (car ll))
        !            82:                        then (setq loc n)       ; found it
        !            83:                             (return))))        ; leave do
        !            84:        (if (null loc)
        !            85:           then (Push g-lits form)
        !            86:                (setq g-litcnt (1+ g-litcnt)
        !            87:                      loc g-litcnt)
        !            88:                (cond ((and symboltype (null onplist))
        !            89:                       (putprop form loc g-bindloc))))
        !            90: 
        !            91:        (return (if (and flag symboltype) then `(bind ,loc)
        !            92:                   else `(lbind ,loc)))))
        !            93:                             
        !            94: 
        !            95: 
        !            96: ;--- d-locv :: find the location of a value cell, and dont return a register
        !            97: ;
        !            98: (defun d-locv (sm)
        !            99:   (let ((g-ignorereg t))
        !           100:        (d-loc sm)))
        !           101: 
        !           102: 
        !           103: ;--- d-simple :: see of arg can be addresses in one instruction
        !           104: ; we define simple and really simple as follows
        !           105: ;  <rsimple> ::= number
        !           106: ;               quoted anything
        !           107: ;               local symbol
        !           108: ;               t
        !           109: ;               nil
        !           110: ;  <simple>  ::= <rsimple>
        !           111: ;               (cdr <rsimple>)
        !           112: ;               global symbol
        !           113: ;
        !           114: (defun d-simple (arg)
        !           115:    (let (tmp)
        !           116:        (if (d-rsimple arg) thenret
        !           117:        elseif (atom arg) then (d-loc arg)
        !           118:        elseif (and (memq (car arg) '(cdr car cddr cdar))
        !           119:                    (setq tmp (d-rsimple (cadr arg))))
        !           120:           then (if (eq 'Nil tmp) then tmp
        !           121:                 elseif (atom tmp)
        !           122:                    then #+for-vax
        !           123:                         (if (eq 'car (car arg))
        !           124:                             then `(racc 4 ,tmp)
        !           125:                          elseif (eq 'cdr (car arg))
        !           126:                             then `(racc 0 ,tmp)
        !           127:                          elseif (eq 'cddr (car arg))
        !           128:                             then `(racc * 0 ,tmp)
        !           129:                          elseif (eq 'cdar (car arg))
        !           130:                             then `(racc * 4 ,tmp))
        !           131:                         #+for-68k
        !           132:                         (if (eq 'car (car arg))
        !           133:                             then `(racc 4 ,tmp)
        !           134:                          elseif (eq 'cdr (car arg))
        !           135:                             then `(racc 0 ,tmp))
        !           136:                 elseif (not (eq 'cdr (car arg)))
        !           137:                    then nil
        !           138:                 elseif (eq 'lbind (car tmp))
        !           139:                    then `(bind ,(cadr tmp))
        !           140:                 elseif (eq 'stack (car tmp))
        !           141:                    then `(vstack ,(cadr tmp))
        !           142:                 elseif (eq 'fixnum (car tmp))
        !           143:                    then `(immed ,(cadr tmp))
        !           144:                 elseif (atom (car tmp))
        !           145:                    then `(0 ,(cadr tmp))
        !           146:                    else (comp-err "bad arg to d-simple: " (or arg))))))
        !           147: 
        !           148: (defun d-rsimple (arg)
        !           149:    (if (atom arg) then
        !           150:        (if (null arg) then 'Nil
        !           151:        elseif (eq t arg) then 'T
        !           152:        elseif (or (numberp arg)
        !           153:                   (memq arg g-locs)) 
        !           154:           then (d-loc arg)
        !           155:           else (car (d-bestreg arg nil)))
        !           156:     elseif (eq 'quote (car arg)) then (d-loclit (cadr arg) nil)))
        !           157: 
        !           158: ;--- d-specialp :: check if a variable is special
        !           159: ; a varible is special if it has been declared as such, or if
        !           160: ; the variable special is t
        !           161: (defun d-specialp (vrb)
        !           162:   (or special
        !           163:       (eq 'special (d-findfirstprop vrb 'bindtype))   ; local special decl
        !           164:       (eq 'special (get vrb g-bindtype))))
        !           165: 
        !           166: (defun d-fixnump (vrb)
        !           167:    (and (symbolp vrb)
        !           168:        (or (eq 'fixnum (d-findfirstprop vrb 'vartype))
        !           169:            (eq 'fixnum (get vrb g-vartype)))))
        !           170: 
        !           171: ;--- d-functyp :: return the type of function
        !           172: ;      - name : function name
        !           173: ;
        !           174: ; If name had a macro function definition, we return `macro'.  Otherwise
        !           175: ; we see if name as a declared type, if so we return that.  Otherwise
        !           176: ; we see if name is defined and we return that if so, and finally if
        !           177: ; we have no idea what this function is, we return lambda.
        !           178: ;   This is not really satisfactory, but will handle most cases.
        !           179: ;
        !           180: ; If macrochk is nil then we don't check for the macro case.  This
        !           181: ; is important to prevent recursive macroexpansion.
        !           182: ;
        !           183: (defun d-functyp (name macrochk)
        !           184:    (let (func ftyp)
        !           185:       (if (atom name) 
        !           186:         then
        !           187:              (setq func (getd name))
        !           188:              (setq ftyp (if (and macrochk (get name 'cmacro)) ;compiler macro
        !           189:                            then 'cmacro
        !           190:                          elseif (bcdp func)
        !           191:                            then (let ((type (getdisc func)))
        !           192:                                    (if (memq type '(lambda nlambda macro))
        !           193:                                       then type
        !           194:                                     elseif (stringp type)
        !           195:                                       then 'lambda     ; foreign function
        !           196:                                       else (comp-warn
        !           197:                                               "function "
        !           198:                                               name
        !           199:                                               " has a strange discipline "
        !           200:                                               type)
        !           201:                                            'lambda     ; assume lambda
        !           202:                                    ))
        !           203:                          elseif (dtpr func)
        !           204:                            then (car func)
        !           205:                          elseif (and macrochk (get name 'macro-autoload))
        !           206:                            then 'macro))
        !           207:              (if (memq ftyp '(macro cmacro)) then ftyp
        !           208:               elseif (d-findfirstprop name 'functype) thenret
        !           209:               elseif (get name g-functype) thenret  ; check if declared first
        !           210:               elseif ftyp thenret
        !           211:                 else 'lambda)
        !           212:         else 'lambda)))                ; default is lambda
        !           213: 
        !           214: ;--- d-allfixnumargs :: check if all forms are fixnums
        !           215: ; make sure all forms are fixnums or symbols whose declared type are fixnums
        !           216: ;
        !           217: (defun d-allfixnumargs (forms)
        !           218:    (do ((xx forms (cdr xx))
        !           219:        (arg))
        !           220:        ((null xx) t)
        !           221:        (cond ((and (fixp (setq arg (car xx))) (not (bigp arg))))
        !           222:             ((d-fixnump arg))
        !           223:             (t (return nil)))))
        !           224: 
        !           225:              
        !           226: (defun d-findfirstprop (name type)
        !           227:    (do ((xx g-decls (cdr xx))
        !           228:        (rcd))
        !           229:        ((null xx))
        !           230:        (if (and (eq name (caar xx))
        !           231:                (get (setq rcd (cdar xx)) type))
        !           232:          then (return rcd))))
        !           233: 
        !           234:              
        !           235: 
        !           236: 

unix.superglobalmegacorp.com

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