Annotation of 43BSD/ucb/lisp/pearl/path.l, revision 1.1

1.1     ! root        1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; path.l ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !             2: ; Functions for accessing and changing information associated with
        !             3: ;    slots of structures via a path.
        !             4: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !             5: ; Copyright (c) 1983 ,  The Regents of the University of California.
        !             6: ; All rights reserved.  
        !             7: ; Authors: Joseph Faletti and Michael Deering.
        !             8: 
        !             9: ; The PATH functions provide methods for adding and accessing information
        !            10: ;     in a structure.  The PATH macro takes as a first argument the function
        !            11: ;     to be performed and simply expands to the function.  The functions
        !            12: ;     available are:
        !            13: ;     1. PUTPATH -- replaces the value in the slot with one provided.
        !            14: ;     2. CLEARPATH -- replaces the value of the slot with the default.
        !            15: ;     3. ADDSETPATH -- adds the value provided to a SETOF slot (only one
        !            16: ;                          level of adding is currently available).
        !            17: ;     4. DELSETPATH -- deletes the value provided from a SETOF slot (note
        !            18: ;                          that this requires one to know the actual
        !            19: ;                          value to delete).
        !            20: ;     5. ADDPREDPATH -- adds a predicate (function, STRUCT, or hook) to
        !            21: ;                          the PREDLIST.
        !            22: ;     6. DELPREDPATH -- deletes a predicate from the PREDLIST.
        !            23: ;     7. GETPATH -- returns a pointer to the value in the slot.
        !            24: ;     8. GETPREDPATH -- returns the list of function and STRUCT
        !            25: ;                                  predicates for the slot.
        !            26: ;     9. GETHOOKPATH -- returns the list of (dotted pair) hook
        !            27: ;                                  functions for the slot.
        !            28: ;    10. APPLYPATH -- returns the result of APPLYing the function
        !            29: ;                            provided to the value for the slot.
        !            30: ;
        !            31: ; During a PATH operation, the global variable *PATHTOP* contains the
        !            32: ;    top level item which is being accessed and *PATHLOCAL* is the most
        !            33: ;    local item being accessed.  These are most handy for use by hooks
        !            34: ;    and predicates.
        !            35: 
        !            36: (defmacro path (fcn item pathlist &optional val)
        !            37:   (selectq fcn
        !            38:           (put          `(putpath      ,item ,pathlist ,val))
        !            39:           (clear        `(clearpath    ,item ,pathlist))
        !            40:           (addset       `(addsetpath   ,item ,pathlist ,val))
        !            41:           (delset       `(delsetpath   ,item ,pathlist ,val))
        !            42:           (addpred      `(addpredpath  ,item ,pathlist ,val))
        !            43:           (delpred      `(delpredpath  ,item ,pathlist ,val))
        !            44:           (get          `(getpath      ,item ,pathlist))
        !            45:           (getpred      `(getpredpath  ,item ,pathlist))
        !            46:           (gethook      `(gethookpath  ,item ,pathlist))
        !            47:           (apply        `(applypath    ,item ,pathlist ,val))
        !            48:           (otherwise (msg t "PATH: Illegal function selector: " fcn
        !            49:                           ". Rest of call was: "  item " " pathlist " " val t)
        !            50:                      (pearlbreak))))
        !            51: 
        !            52: (de putpath (item path value)
        !            53:   (prog (numitempair slotnum result)
        !            54:        (setq *pathtop* item)
        !            55:        (setq *currentpearlstructure* item)
        !            56:        (and (null (setq numitempair (followpath item path)))
        !            57:             (return nil))
        !            58:        (setq slotnum (car numitempair))
        !            59:        (setq *pathlocal* (setq item (cdr numitempair)))
        !            60:        (checkrunhandleslothooks1 '<put *runputpathhooks*)
        !            61:        (selectq (getslotvaluetype slotnum item)
        !            62:                 (CONSTANT (putslotvalue slotnum value item))
        !            63:                 (ADJUNCT
        !            64:                  (putslotvalue slotnum
        !            65:                                (cons value (cdr (getslotvalue slotnum item)))
        !            66:                                item))
        !            67:                 ((LOCAL GLOBAL)
        !            68:                  (putslotvaluetype slotnum 'CONSTANT item)
        !            69:                  (putslotvalue slotnum value item)))
        !            70:        (checkrunhandleslothooks1 '>put *runputpathhooks*)
        !            71:        (return value)))
        !            72:  
        !            73: (de clearpath (item path)
        !            74:   (prog (numitempair slotnum value result)
        !            75:        (setq *pathtop* item)
        !            76:        (setq *currentpearlstructure* item)
        !            77:        (and (null (setq numitempair (followpath item path)))
        !            78:             (return nil))
        !            79:        (setq slotnum (car numitempair))
        !            80:        (setq *pathlocal* (setq item (cdr numitempair)))
        !            81:        (setq value (defaultfortype (getslottype slotnum (getdefinition item))))
        !            82:        (checkrunhandleslothooks1 '<clear *runclearpathhooks*)
        !            83:        (putslotvaluetype slotnum 'CONSTANT item)
        !            84:        (putslotvalue slotnum value item)
        !            85:        (checkrunhandleslothooks1 '>clear *runclearpathhooks*)
        !            86:        (return value)))
        !            87:  
        !            88: (de addsetpath (item path value)
        !            89:   (prog (numitempair slotnum result)
        !            90:        (setq *pathtop* item)
        !            91:        (setq *currentpearlstructure* item)
        !            92:        (and (null (setq numitempair (followpath item path)))
        !            93:             (return nil))
        !            94:        (setq slotnum (car numitempair))
        !            95:        (setq *pathlocal* (setq item (cdr numitempair)))
        !            96:        (checkrunhandleslothooks1 '<addset *runaddsetpathhooks*)
        !            97:        (putslotvaluetype slotnum 'CONSTANT item)
        !            98:        (putslotvalue slotnum (cons value (getvalue slotnum item)) item)
        !            99:        (checkrunhandleslothooks1 '>addset *runaddsetpathhooks*)
        !           100:        (return value)))
        !           101:  
        !           102: (de delsetpath (item path value)
        !           103:   (prog (numitempair slotnum result)
        !           104:        (setq *pathtop* item)
        !           105:        (setq *currentpearlstructure* item)
        !           106:        (and (null (setq numitempair (followpath item path)))
        !           107:             (return nil))
        !           108:        (setq slotnum (car numitempair))
        !           109:        (setq *pathlocal* (setq item (cdr numitempair)))
        !           110:        (checkrunhandleslothooks1 '<delset *rundelsetpathhooks*)
        !           111:        (putslotvaluetype slotnum 'CONSTANT item)
        !           112:        (putslotvalue slotnum (delq value (getvalue slotnum item)) item)
        !           113:        (checkrunhandleslothooks1 '>delset *rundelsetpathhooks*)
        !           114:        (return value)))
        !           115:  
        !           116: (de addpredpath (item path value)
        !           117:   (prog (numitempair slotnum result)
        !           118:        (setq *pathtop* item)
        !           119:        (setq *currentpearlstructure* item)
        !           120:        (and (null (setq numitempair (followpath item path)))
        !           121:             (return nil))
        !           122:        (setq slotnum (car numitempair))
        !           123:        (setq *pathlocal* (setq item (cdr numitempair)))
        !           124:        (checkrunhandleslothooks1 '<addpred *runaddpredpathhooks*)
        !           125:        (putpred slotnum (cons value (getpred slotnum item)) item)
        !           126:        (checkrunhandleslothooks1 '>addpred *runaddpredpathhooks*)
        !           127:        (return value)))
        !           128:  
        !           129: (de delpredpath  (item path value)
        !           130:   (prog (numitempair slotnum result)
        !           131:        (setq *pathtop* item)
        !           132:        (setq *currentpearlstructure* item)
        !           133:        (and (null (setq numitempair (followpath item path)))
        !           134:             (return nil))
        !           135:        (setq slotnum (car numitempair))
        !           136:        (setq *pathlocal* (setq item (cdr numitempair)))
        !           137:        (checkrunhandleslothooks1 '<delpred *rundelpredpathhooks*)
        !           138:        (putpred slotnum (delete value (getpred slotnum item)) item)
        !           139:        (checkrunhandleslothooks1 '>delpred *rundelpredpathhooks*)
        !           140:        (return value)))
        !           141:  
        !           142: (de getpath (item path)
        !           143:   (prog (numitempair slotnum value result)
        !           144:        (setq *pathtop* item)
        !           145:        (setq *currentpearlstructure* item)
        !           146:        (and (null (setq numitempair (followpath item path)))
        !           147:             (return nil))
        !           148:        (setq slotnum (car numitempair))
        !           149:        (setq *pathlocal* (setq item (cdr numitempair)))
        !           150:        (setq value (punbound))
        !           151:        (checkrunhandleslothooks1 '<get *rungetpathhooks*)
        !           152:        (or (neq value (punbound))
        !           153:            (setq value (getvalue slotnum item)))
        !           154:        (checkrunhandleslothooks1 '>get *rungetpathhooks*)
        !           155:        (return value)))
        !           156:  
        !           157: (de getpredpath (item path)
        !           158:   (prog (numitempair slotnum value result)
        !           159:        (setq *pathtop* item)
        !           160:        (setq *currentpearlstructure* item)
        !           161:        (and (null (setq numitempair (followpath item path)))
        !           162:             (return nil))
        !           163:        (setq slotnum (car numitempair))
        !           164:        (setq *pathlocal* (setq item (cadr numitempair)))
        !           165:        (setq value (punbound))
        !           166:        (checkrunhandleslothooks1 '<getpred *rungetpredpathhooks*)
        !           167:        (or (neq value (punbound))
        !           168:            (setq value (getpred slotnum item)))
        !           169:        (checkrunhandleslothooks1 '>getpred *rungetpredpathhooks*)
        !           170:        (return value)))
        !           171:  
        !           172: (de gethookpath (item path value)
        !           173:   (prog (numitempair slotnum result)
        !           174:        (setq *pathtop* item)
        !           175:        (setq *currentpearlstructure* item)
        !           176:        (and (null (setq numitempair (followpath item path)))
        !           177:             (return nil))
        !           178:        (setq slotnum (car numitempair))
        !           179:        (setq *pathlocal* (setq item (cadr numitempair)))
        !           180:        (setq value (punbound))
        !           181:        (checkrunhandleslothooks1 '<gethook *rungethookpathhooks*)
        !           182:        (or (neq value (punbound))
        !           183:            (setq value (getslothooks slotnum item)))
        !           184:        (checkrunhandleslothooks1 '>gethook *rungethookpathhooks*)
        !           185:        (return value)))
        !           186:  
        !           187: (de applypath (fcn item path)
        !           188:   (prog (numitempair slotnum value result)
        !           189:        (setq *pathtop* item)
        !           190:        (setq *currentpearlstructure* item)
        !           191:        (and (null (setq numitempair (followpath item path)))
        !           192:             (return nil))
        !           193:        (setq slotnum (car numitempair))
        !           194:        (setq *pathlocal* (setq item (cdr numitempair)))
        !           195:        (setq value (getvalue slotnum item))
        !           196:        (checkrunhandleslothooks1 '<apply *runapplypathhooks*)
        !           197:        (executehook1 fcn value item (getdefinition item))
        !           198:        (checkrunhandleslothooks1 '>apply *runapplypathhooks*)
        !           199:        (return value)))
        !           200:  
        !           201: ; This does indirection.  If the path is longer and we come to a
        !           202: ;    symbol, we try to find something of the type with the name
        !           203: ;    that is next on the path and with the symbol in its first slot.
        !           204: ;    Unfortunately, this always uses the data base in *db*.
        !           205: (defmacro findstructsymbolpair (defblock symbol)
        !           206:   `(progn (and (setq bucket (gethash2 (getuniquenum ,defblock)
        !           207:                                      (getuniquenum ,symbol)
        !           208:                                      ; **** FIX to use different dbs (how?)
        !           209:                                      (getdb2 *db*)
        !           210:                                      ))
        !           211:               (while (and (setq potential (pop bucket))
        !           212:                           (not (and (eq (getdefinition potential) ,defblock)
        !           213:                                     (eq (getvalue 1 potential)
        !           214:                                         ,symbol))))
        !           215:                      potential))
        !           216:          potential))
        !           217:  
        !           218: ; Follow the path down through the structures starting at item.
        !           219: (de followpath (item path)
        !           220:   (or (structurep item)
        !           221:       (progn (msg t "PATH: only works on structures, not on " item
        !           222:                  ". Requested path was: " path t)
        !           223:             (pearlbreak)))
        !           224:   (let (slotnum type slotname bucket potential slotlocation)
        !           225:        (and (atom path)
        !           226:            (setq path (ncons path)))
        !           227:        (while (setq slotname (pop path))
        !           228:              (and (\=& 0
        !           229:                        (setq slotnum
        !           230:                              (slotnametonumber slotname
        !           231:                                                (getdefinition item))))
        !           232:                   (progn (msg t "PATH: illegal slotname " slotname "requested "
        !           233:                               "from " item ". Remaining path is: " path t)
        !           234:                          (pearlbreak)))
        !           235:              (and (null path)
        !           236:                   (return (cons slotnum item)))
        !           237:              ; If a symbol slot (and more path), do indirection.
        !           238:              (cond ((\=& 1
        !           239:                          (setq type (getslottype slotnum
        !           240:                                                  (getdefinition item))))
        !           241:                     (and (null (setq item
        !           242:                                      (findstructsymbolpair
        !           243:                                       (eval (defatom (pop path)))
        !           244:                                       (getvalue slotnum item))))
        !           245:                          (return nil)))
        !           246:                    ((\=& 0 type) (setq item (getvalue slotnum item)))
        !           247:                    (  t  (msg t "PATH: Unable to follow path.  "
        !           248:                               "Bad slotname is " slotname t)
        !           249:                          (pearlbreak))))))
        !           250: 
        !           251: 
        !           252: ; vi: set lisp:

unix.superglobalmegacorp.com

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