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

1.1     ! root        1: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; hook.l ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        !             2: ; Functions for filling in, running and processing the results of
        !             3: ;    both slot and base hooks.  Also, hidden and visible.
        !             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: ; Convert an equal sign followed by an atom into (*SLOT* atom) 
        !            10: ;    for use in both predicates and hooks.
        !            11: (drm \=
        !            12:   (lambda ()
        !            13:          (let ((nextchar (tyipeek)))
        !            14:               (cond ((\=&  9. nextchar) '\=)
        !            15:                     ((\=& 10. nextchar) '\=)
        !            16:                     ((\=& 13. nextchar) '\=)
        !            17:                     ((\=& 32. nextchar) '\=)
        !            18:                     ((\=& 41. nextchar) '\=)
        !            19:                     ((eqstr (ascii nextchar) '\=)
        !            20:                      (readc)
        !            21:                      '\=\=)
        !            22:                     ( t  (list '*slot* (read)))))))
        !            23:  
        !            24: ; Convert a slotname into a slot number for a particular type of structure.
        !            25: (defmacro numberofslot (slotname defblock)
        !            26:   `(for slotnum 1 (getstructlength ,defblock)
        !            27:        (and (memq ,slotname (getslotname slotnum ,defblock))
        !            28:             (return slotnum)))
        !            29:   )
        !            30:  
        !            31: ; Fill a predicate or hook (FCN) in with the right things, using
        !            32: ;         VALUE  for   *  or  >*,
        !            33: ;        ITEM   for   ** or  >** and to find variables and slotvalues,
        !            34: ;     and DEFBLOCK to find slotnumbers.
        !            35: (de fillin1 (fcn value item defblock)
        !            36:   (cond ((null fcn) nil)
        !            37:        ((atom fcn) (cond ((eq '** fcn) (list 'quote item))
        !            38:                          ((eq '* fcn) (list 'quote value))
        !            39:                          ((eq '>** fcn) (list 'quote item))
        !            40:                          ((eq '>* fcn) (list 'quote value))
        !            41:                          ( t fcn)))
        !            42:        ((dtpr fcn)
        !            43:         (cond ((eq '*slot* (car fcn))
        !            44:                (list 'quote
        !            45:                      (getvalue (numberofslot (cadr fcn) defblock)
        !            46:                                item)))
        !            47:               ((eq '*var* (car fcn))
        !            48:                (list 'quote
        !            49:                      (valueof (cadr fcn) item)))
        !            50:               ((eq '*global* (car fcn))
        !            51:                (cadr fcn))
        !            52:               ( t (mapcar (funl (x) (fillin1 x value item defblock))
        !            53:                           fcn))))
        !            54:        (  t  fcn)))
        !            55: 
        !            56: ; Fill a two-item predicate or hook (FCN) in with the right things, using
        !            57: ;         VAL1   for   *
        !            58: ;         VAL2   for   >*
        !            59: ;        ITEM1  for   ** and to find variables and slotvalues,
        !            60: ;        ITEM2  for   >**
        !            61: ;         RESULT for   ?
        !            62: ;     and DEFBLOCK to find slotnumbers.
        !            63: ; Must be made into a LEXPR in UCI Lisp because of number of arguments.
        !            64: (de fillin2 (fcn val1 val2 item1 item2 defblock result)
        !            65:   (cond ((null fcn) nil)
        !            66:        ((atom fcn) (cond ((eq '** fcn)  (list 'quote item1))
        !            67:                          ((eq '>** fcn) (list 'quote item2))
        !            68:                          ((eq '* fcn)   (list 'quote val1))
        !            69:                          ((eq '>* fcn)  (list 'quote val2))
        !            70:                          ((eq '\? fcn)  (list 'quote result))
        !            71:                          ( t fcn)))
        !            72:        ((dtpr fcn)
        !            73:         (cond ((eq '*slot* (car fcn))
        !            74:                (list 'quote
        !            75:                      (getvalue (numberofslot (cadr fcn) defblock)
        !            76:                                item1)))
        !            77:               ((eq '*var* (car fcn))
        !            78:                (list 'quote
        !            79:                      (valueof (cadr fcn) item1)))
        !            80:               ((eq '*global* (car fcn))
        !            81:                (cadr fcn))
        !            82:               ( t (mapcar (funl (x) (fillin2 x val1 val2
        !            83:                                              item1 item2
        !            84:                                              defblock result))
        !            85:                           fcn))))
        !            86:        ( t   fcn)))
        !            87:  
        !            88: ; If an atom, apply it, else fill it in and evaluate it.
        !            89: (defmacro executehook1 (fcn value item defblock)
        !            90:   `(cond ((atom ,fcn) (apply* ,fcn (ncons ,value)))
        !            91:         (  t  (eval (fillin1 ,fcn ,value ,item ,defblock)))))
        !            92:  
        !            93: ; If an atom, apply it, else fill it in and evaluate it.
        !            94: (defmacro executehook2 (fcn val1 val2 item1 item2 defblock result)
        !            95:   `(cond ((atom ,fcn) (apply* ,fcn (list ,val1 ,val2)))
        !            96:         (  t  (eval (fillin2 ,fcn ,val1 ,val2
        !            97:                              ,item1 ,item2 ,defblock ,result)))))
        !            98: 
        !            99: ; If slothooks are supposed to be run, run them and check for *done*,
        !           100: ;    *fail* or *use*, doing the appropriate thing.  Can almost be
        !           101: ;    used alone but assumes SLOTNUM, ITEM, RESULT, and VALUE.
        !           102: (defmacro checkrunhandleslothooks1 (fcn runhooksatom)
        !           103:   `(and *runallslothooks*
        !           104:        ,runhooksatom
        !           105:        (setq result
        !           106:              (let ((defblock (getdefinition item))
        !           107:                    (alist (getslothooks slotnum item))
        !           108:                    (retvalue nil)
        !           109:                    pair)
        !           110:                   (while (and (not retvalue)
        !           111:                               (setq pair (pop alist)))
        !           112:                          (and (eq (car pair) ,fcn)
        !           113:                               (setq retvalue
        !           114:                                     (executehook1 (cdr pair) value
        !           115:                                                   item defblock))
        !           116:                               (or (and (dtpr retvalue)
        !           117:                                        (memq (car retvalue)
        !           118:                                              '(*fail* *done* *use*)))
        !           119:                                   (setq retvalue nil))))
        !           120:                    retvalue))
        !           121:        (dtpr result)
        !           122:        (selectq (car result)
        !           123:                 (*done* (and (cdr result)
        !           124:                              (return (cadr result)))
        !           125:                         (return value))
        !           126:                 (*fail* (and (cdr result)
        !           127:                              (return (cadr result)))
        !           128:                         (return '*fail*))
        !           129:                 (*use* (setq value (cadr result))))))
        !           130: 
        !           131: ; *done* and *fail* cause an immediate return.  *use* changes the
        !           132: ;     value that was going to be used.
        !           133: (defmacro handlehookresult (oldval newval)
        !           134:   `(and (dtpr ,newval)
        !           135:        (selectq (car ,newval)
        !           136:                 (*done* (and (cdr ,newval)
        !           137:                              (return (cadr ,newval)))
        !           138:                         (return ,oldval))
        !           139:                 (*fail* (and (cdr ,newval)
        !           140:                              (return (cadr ,newval)))
        !           141:                         (return '*fail*))
        !           142:                 (*use* (setq ,oldval (cadr ,newval))))))
        !           143: 
        !           144: ; If slothooks are supposed to be run, run them and check for *done*,
        !           145: ;    *fail* or *use*, doing the appropriate thing.  Can almost be
        !           146: ;    used alone but assumes RESULT and ITEM.
        !           147: (defmacro checkrunhandlebasehooks1 (fcn runhooksatom)
        !           148:   `(and *runallbasehooks*
        !           149:        ,runhooksatom
        !           150:        (setq result
        !           151:              (let ((retvalue nil)
        !           152:                    alist
        !           153:                    pair
        !           154:                    defblock)
        !           155:                   (and item
        !           156:                        (setq defblock (getdefinition item))
        !           157:                        (setq alist (getbasehooks defblock)))
        !           158:                   (while (and (not retvalue)
        !           159:                               (setq pair (pop alist)))
        !           160:                          (and (eq (car pair) ,fcn)
        !           161:                               (setq retvalue
        !           162:                                     (executehook1 (cdr pair) item
        !           163:                                                   item defblock))
        !           164:                               (or (and (dtpr retvalue)
        !           165:                                        (memq (car retvalue)
        !           166:                                              '(*fail* *done* *use*)))
        !           167:                                   (setq retvalue nil))))
        !           168:                   retvalue))
        !           169:        (dtpr result)
        !           170:        (selectq (car result)
        !           171:                 (*done* (and (cdr result)
        !           172:                              (return (cadr result)))
        !           173:                         (return item))
        !           174:                 (*fail* (and (cdr result)
        !           175:                              (return (cadr result)))
        !           176:                         (return '*fail*))
        !           177:                 (*use* (setq item (cadr result))))))
        !           178: 
        !           179: ; If slothooks are supposed to be run, run them.  Assumes SLOTNUM,
        !           180: ;    ITEM, and VALUE.  This is not a standalone function, since it
        !           181: ;    does not handle RESULT but rather returns it.
        !           182: (defmacro checkandrunslothooks2 (fcn hooks val1 val2 item1 item2)
        !           183:   `(let ((defblock (getdefinition ,item1))
        !           184:         (retvalue nil)
        !           185:         pair)
        !           186:        (while (and (not retvalue)
        !           187:                    (setq pair (pop ,hooks)))
        !           188:               (and (eq (car pair) ,fcn)
        !           189:                    (setq retvalue
        !           190:                          (executehook2 (cdr pair) ,val1 ,val2
        !           191:                                        ,item1 ,item2 defblock result))
        !           192:                    (or (and (dtpr retvalue)
        !           193:                             (memq (car retvalue)
        !           194:                                   '(*fail* *done* *use*)))
        !           195:                        (setq retvalue nil))))
        !           196:         retvalue))
        !           197: 
        !           198: ; Assumes XVAL or YVAL is where you want changes.
        !           199: (defmacro doslothooks2< (fcn runhookatom)
        !           200:   `(cond ((and *runallslothooks*
        !           201:               ,runhookatom)
        !           202:          (setq newxval nil)
        !           203:          (setq newyval nil)
        !           204:          (and (setq xhooks (getslothooks slotnum item1))
        !           205:               (setq newxval
        !           206:                     (checkandrunslothooks2 ,fcn xhooks xval yval
        !           207:                                            item1 item2)))
        !           208:          (and (setq yhooks (getslothooks slotnum item2))
        !           209:               (setq newyval
        !           210:                     (checkandrunslothooks2 ,fcn yhooks yval xval
        !           211:                                            item2 item1)))
        !           212:          (handlehookresult xval newxval)
        !           213:          (handlehookresult yval newyval))))
        !           214: 
        !           215: ; Assumes RESULT is where you want changes.
        !           216: (defmacro doslothooks2> (fcn runhookatom)
        !           217:   `(cond ((and *runallslothooks*
        !           218:               ,runhookatom)
        !           219:          (setq newxval nil)
        !           220:          (setq newyval nil)
        !           221:          (and (setq xhooks (getslothooks slotnum item1))
        !           222:               (setq newxval
        !           223:                     (checkandrunslothooks2 ,fcn xhooks xval yval
        !           224:                                            item1 item2)))
        !           225:          (and (setq yhooks (getslothooks slotnum item2))
        !           226:               (setq newyval
        !           227:                     (checkandrunslothooks2 ,fcn yhooks yval xval
        !           228:                                            item2 item1)))
        !           229:          (handlehookresult result newxval)
        !           230:          (handlehookresult result newyval))))
        !           231: 
        !           232: (defmacro checkandrunbasehooks2 (fcn item1 item2)
        !           233:   `(let* ((retvalue nil)
        !           234:          (defblock (getdefinition ,item1))
        !           235:          (alist (getbasehooks defblock))
        !           236:          pair)
        !           237:         (while (and (not retvalue)
        !           238:                     (setq pair (pop alist)))
        !           239:                (and (eq (car pair) ,fcn)
        !           240:                     (setq retvalue
        !           241:                           (executehook2 (cdr pair) ,item1 ,item2
        !           242:                                         ,item1 ,item2 defblock result))
        !           243:                     (or (and (dtpr retvalue)
        !           244:                              (memq (car retvalue)
        !           245:                                    '(*fail* *done* *use*)))
        !           246:                         (setq retvalue nil))))
        !           247:         retvalue))
        !           248: 
        !           249: ; Assumes ITEM1 and ITEM2 are where you want changes.
        !           250: (defmacro dobasehooks2< (fcn runhookatom)
        !           251:   `(cond ((and *runallbasehooks*
        !           252:               ,runhookatom)
        !           253:          (setq newitem1 (checkandrunbasehooks2 ,fcn item1 item2))
        !           254:          (setq newitem2 (checkandrunbasehooks2 ,fcn item2 item1))
        !           255:          (handlehookresult item1 newitem1)
        !           256:          (handlehookresult item2 newitem2))))
        !           257: 
        !           258: ; Assumes RESULT is where you want changes.
        !           259: (defmacro dobasehooks2> (fcn runhookatom)
        !           260:   `(cond ((and *runallbasehooks*
        !           261:               ,runhookatom)
        !           262:          (setq newitem1 (checkandrunbasehooks2 ,fcn item1 item2))
        !           263:          (setq newitem2 (checkandrunbasehooks2 ,fcn item2 item1))
        !           264:          (handlehookresult result newitem1)
        !           265:          (handlehookresult result newitem2))))
        !           266: 
        !           267: ; Runbasehooks for single items for the user.
        !           268: (de runbasehooks1 (fcn item)
        !           269:   (and (null item)
        !           270:        (progn (msg t "RUNBASEIFS1: Null item given to run hooks on." t)
        !           271:              (pearlbreak)))
        !           272:   (let* ((retvalue nil)
        !           273:         (defblock (getdefinition item))
        !           274:         (alist (getbasehooks defblock))
        !           275:         pair)
        !           276:        (while (and (not retvalue)
        !           277:                    (setq pair (pop alist)))
        !           278:               (and (eq (car pair) fcn)
        !           279:                    (setq retvalue (executehook1 (cdr pair) item item defblock))
        !           280:                    (or (and (dtpr retvalue)
        !           281:                             (memq (car retvalue) '(*fail* *done* *use*)))
        !           282:                        (setq retvalue nil))))
        !           283:        retvalue))
        !           284: 
        !           285: ; Runbasehooks for two items for the user.
        !           286: (de runbasehooks2 (fcn item1 item2 result)
        !           287:   (and (null item1)
        !           288:        (progn (msg t "RUNBASEIFS2: Null first item given to run hooks on." t)
        !           289:              (pearlbreak)))
        !           290:   (and (null item2)
        !           291:        (progn (msg t "RUNBASEIFS2: Null second item given to run hooks on." t)
        !           292:              (pearlbreak)))
        !           293:   (let* ((retvalue nil)
        !           294:         (defblock (getdefinition item1))
        !           295:         (alist (getbasehooks defblock))
        !           296:         pair)
        !           297:        (while (and (not retvalue)
        !           298:                    (setq pair (pop alist)))
        !           299:               (and (eq (car pair) fcn)
        !           300:                    (setq retvalue
        !           301:                          (executehook2 (cdr pair) item1 item2
        !           302:                                        item1 item2 defblock result))
        !           303:                    (or (and (dtpr retvalue)
        !           304:                             (memq (car retvalue) '(*fail* *done* *use*)))
        !           305:                        (setq retvalue nil))))
        !           306:        retvalue))
        !           307: 
        !           308: ; Run slot hooks for the slot named SLOTNAME for one item for the user.
        !           309: (de runslothooks1 (fcn item slotname value)
        !           310:   (and (null item)
        !           311:        (progn (msg t "RUNSLOTIFS1: Null item given to run hooks on." t)
        !           312:              (pearlbreak)))
        !           313:   (let* ((retvalue nil)
        !           314:         (defblock (getdefinition item))
        !           315:         (slotnum (numberofslot slotname defblock))
        !           316:         (alist (getslothooks slotnum item))
        !           317:         pair)
        !           318:        (while (and (not retvalue)
        !           319:                    (setq pair (pop alist)))
        !           320:               (and (eq (car pair) fcn)
        !           321:                    (setq retvalue
        !           322:                          (executehook1 (cdr pair) value item defblock))
        !           323:                    (or (and (dtpr retvalue)
        !           324:                             (memq (car retvalue) '(*fail* *done* *use*)))
        !           325:                        (setq retvalue nil))))
        !           326:        retvalue))
        !           327: 
        !           328: ; Run slot hooks for the slot named SLOTNAME for two items for the user.
        !           329: ; Must be made into a LEXPR in UCI Lisp because of number of arguments.
        !           330: (de runslothooks2 (fcn item1 item2 slotname val1 val2 result)
        !           331:   (and (null item1)
        !           332:        (progn (msg t "RUNSLOTIFS1: Null first item given to run hooks on." t)
        !           333:              (pearlbreak)))
        !           334:   (and (null item2)
        !           335:        (progn (msg t "RUNSLOTIFS1: Null second item given to run hooks on." t)
        !           336:              (pearlbreak)))
        !           337:   (let* ((retvalue1 nil)
        !           338:         (retvalue2 nil)
        !           339:         (defblock (getdefinition item1))
        !           340:         (slotnum (numberofslot slotname defblock))
        !           341:         (alist (getslothooks slotnum item1))
        !           342:         pair)
        !           343:        (while (and (not retvalue1)
        !           344:                    (setq pair (pop alist)))
        !           345:               (and (eq (car pair) fcn)
        !           346:                    (setq retvalue1
        !           347:                          (executehook2 (cdr pair) val1 val2
        !           348:                                        item1 item2 defblock result))
        !           349:                    (or (and (dtpr retvalue1)
        !           350:                             (memq (car retvalue1) '(*fail* *done* *use*)))
        !           351:                        (setq retvalue1 nil))))
        !           352:        (setq defblock (getdefinition item2))
        !           353:        (setq slotnum (numberofslot slotname defblock))
        !           354:        (setq alist (getslothooks slotnum item2))
        !           355:        (while (and (not retvalue2)
        !           356:                    (setq pair (pop alist)))
        !           357:               (and (eq (car pair) fcn)
        !           358:                    (setq retvalue2
        !           359:                          (executehook2 (cdr pair) val2 val1
        !           360:                                        item2 item1 defblock result))
        !           361:                    (or (and (dtpr retvalue2)
        !           362:                             (memq (car retvalue2) '(*fail* *done* *use*)))
        !           363:                        (setq retvalue2 nil))))
        !           364:        (cons retvalue1 retvalue2)))
        !           365: 
        !           366: ; Run command with its associated *run...hooks* atom set to nil
        !           367: ;    temporarily with a let so that its hooks WON'T be run.
        !           368: (defmacro hidden (command)
        !           369:   (let ((name (concat '*run (car command) 'hooks*)))
        !           370:        `(let ((,name nil))
        !           371:             ,command)))
        !           372: 
        !           373: ; Run command with its associated *run...hooks* atom set to t
        !           374: ;    temporarily with a let so that its hooks WILL be run.
        !           375: (defmacro visible (command)
        !           376:   (let ((name (concat '*run (car command) 'hooks*)))
        !           377:        `(let ((,name t))
        !           378:             ,command)))
        !           379: 
        !           380: ; 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.