Annotation of 43BSD/ucb/fp/fpMeasures.l, revision 1.1

1.1     ! root        1: ;  FP interpreter/compiler
        !             2: ;  Copyright (c) 1982  Scott B. Baden
        !             3: ;  Berkeley, California
        !             4: ;  Dynamics Statistics by Dorab Patel (UCLA)
        !             5: ;
        !             6: ;  Copyright (c) 1982 Regents of the University of California.
        !             7: ;  All rights reserved.  The Berkeley software License Agreement
        !             8: ;  specifies the terms and conditions for redistribution.
        !             9: ;
        !            10: (setq SCCS-fpMeasures.l "@(#)fpMeasures.l      5.1 (Berkeley) 5/31/85")
        !            11: 
        !            12: ; Initialize and update the 'Measures' plist  with
        !            13: ; the run-time measurement data
        !            14: ;
        !            15: ; Special symbol 'TracedFns' also manipulated
        !            16: ; It contains the list of currently traced user defined functions.
        !            17: ; The attributes for each functional form and function are:
        !            18: 
        !            19: ; times: the total number of times it has been called
        !            20: ; size: the sum of the top-level sizes of the arguments given to it
        !            21: ; funargno: the number of functional arguments to this form
        !            22: ;              (in general this is only for construct)
        !            23: ; funargtype: the type and total number of functions of that type
        !            24: ;              supplied to this functional form.
        !            25: ;              This is an alist ((fntype.times) ...)
        !            26: 
        !            27: 
        !            28: 
        !            29: (include specials.l)
        !            30: (declare (special statport dummy))
        !            31: (declare (localf InitSize InitFunArgTyp 
        !            32:                 InitFunArgNo trace1
        !            33:                 extractName goodStats
        !            34:                 untrace1 SendMeasures))
        !            35: 
        !            36: 
        !            37: ; The following functions are global. i.e. used externally
        !            38: ; startDynStats        clrDynStats     IncrTimes       IncrSize
        !            39: ; IncrFunArgNo IncrFunArgTyp   size            Trace
        !            40: ; PrintMeasures        IncrUDF         Untrace         stopDynStats
        !            41: 
        !            42: ; This is called by the main routine to initialize all the
        !            43: ; measurement stuff
        !            44: 
        !            45: 
        !            46: (defun clrDynStats nil
        !            47:   (dontLoseStats)
        !            48:   (initStats))
        !            49: 
        !            50: 
        !            51: (defun dontLoseStats nil
        !            52:   (cond ((goodStats) ; check to see if there are stats to report
        !            53:         (patom "output dynamic statistics? ")
        !            54:         (let ((response (car (explodec (ratom)))))
        !            55:              (If ptport then (msg (P ptport) response))
        !            56:              
        !            57:              (Tyi)
        !            58:              (cond ((eq response 'y)
        !            59:                     (patom "File: ")
        !            60:                     (let ((statFile 
        !            61:                            (cond ((eq (tyipeek) #.CR) nil)
        !            62:                                  (t 
        !            63:                                   (let ((fl (ratom)))
        !            64:                                        (If ptport then (msg (P ptport) fl))
        !            65:                                        fl)))))
        !            66:                          (Tyi)
        !            67:                          (PrintMeasures statFile))))))))
        !            68: 
        !            69: (defun initStats nil
        !            70:   
        !            71:   (InitMeasures 
        !            72:    `(,@#.dyadFns
        !            73:      ,@#.miscFns
        !            74:      ,@#.multiAdicFns
        !            75:      ,@#.libFns
        !            76:      ,@#.funcForms))
        !            77:   
        !            78:   (InitSize #.multiAdicFns)
        !            79:   (InitSize #.funcForms)
        !            80:   (InitFunArgNo '(constr$fp))
        !            81:   
        !            82:   ; included here even though it's not  a functional form
        !            83:   (InitFunArgTyp '(select$fp))
        !            84:   
        !            85:   (InitFunArgTyp #.funcForms))
        !            86: 
        !            87: 
        !            88: ; Makes the symbol 'Measures'  have the property indicators
        !            89: ; corresponding to  the function names in 'ListOfFns' and the values
        !            90: ; to be ((times.0)).
        !            91: 
        !            92: (defun InitMeasures (ListOfFns)
        !            93:   (setplist 'Measures
        !            94:             (apply 'append 
        !            95:                   (mapcar '(lambda (x) (list  x (list (cons 'times 0)))) 
        !            96:                           ListOfFns))))
        !            97: 
        !            98: (defun goodStats nil
        !            99:   (do ((M (plist 'Measures) (cddr M)))
        !           100:       ((null M) nil)
        !           101:       (cond ((not (zerop (cdr (assoc 'times (cadr M)))))
        !           102:             (return t)))))
        !           103: 
        !           104: 
        !           105: ; This is used to stop the collection of dynamic statistics
        !           106: ; needs to untrace functions if they still are. i.e. do the traced-expr stuff
        !           107: ; note that rds which calls this, also calls PrintMeasures, though
        !           108: ; this may change.
        !           109: 
        !           110: (defun stopDynStats nil
        !           111:   (cond (TracedFns             ; if any fns still being traced
        !           112:         (Untrace TracedFns)))  ; untrace them
        !           113:   (setq DynTraceFlg nil))
        !           114: 
        !           115: (defun extractName (fnName)
        !           116:   (patom 
        !           117:    (implode (reverse (cons "'" (cdddr (reverse (explodec (concat "'" fnName)))))))))
        !           118: 
        !           119: ; this is the function called by the system function trace to
        !           120: ; enable the tracing of the User Defined Functions specified
        !           121: ; NOTE: successive calls will add to the UDFs to be traced.
        !           122: 
        !           123: (defun Trace (arglist)
        !           124:   (setq traceport poport)
        !           125:   (mapc '(lambda (x)
        !           126:                 (cond ((memq x TracedFns) ; if already traced
        !           127:                        (setq arglist 
        !           128:                              (delq x arglist 1)) ; delete from arglist
        !           129:                        (extractName x)           ; and tell the user
        !           130:                        (patom " is already being traced")
        !           131:                        (terpr))))
        !           132:        arglist)
        !           133:   (mapc 'trace1 arglist)) ; set up traced-expr stuff
        !           134: 
        !           135: ; This is called by the system function untrace to disable the tracing
        !           136: ; of user defined functions.
        !           137: ; This removes the named user defined function from the list
        !           138: ; of traced functions
        !           139: 
        !           140: (defun Untrace (arglist)
        !           141:   (mapc '(lambda (x)
        !           142:                 (cond ((memq x TracedFns) ; if being traced
        !           143:                        (setq TracedFns (delq x TracedFns)) ; remove
        !           144:                        (untrace1 x)) ; restore stuff
        !           145:                       (t (extractName x) ; else complain
        !           146:                          (patom " is not being traced")
        !           147:                          (terpr))))
        !           148:        arglist))
        !           149: 
        !           150: ; This is called by Trace on each individual function that is to
        !           151: ; be traced. It does the manipulation of the traced-expr property
        !           152: 
        !           153: (defun trace1 (name)
        !           154:   ; actually you should check for getd name returning something decent
        !           155:   (let ((zExpr (getd name)))
        !           156:        (cond ((null zExpr)
        !           157:              (patom "Can't trace the undefined fn ")
        !           158:              (extractName name)
        !           159:              (patom ".")
        !           160:              (terpr))
        !           161:             
        !           162:             (t
        !           163:              (putprop name zExpr 'traced-expr) ; put fn def on traced-expr
        !           164:              (setq TracedFns (append1 TracedFns name)) ; update TracedFns
        !           165:              (InitUDF name)                    ; set up the measurement stuff
        !           166:              (putd name  ; make a new function def
        !           167:                    `(lambda (x)
        !           168:                             (prog (tmp)
        !           169:                                   (setq level (1+ level)) ; increment level counter
        !           170:                                   (printLevel)
        !           171:                                   (patom " >Enter> " traceport)
        !           172:                                   (patom (extName ',name) traceport)
        !           173:                                   (patom " [" traceport)
        !           174:                                   (d_isplay x traceport)
        !           175:                                   (patom "]" traceport)
        !           176:                                   (terpri traceport)
        !           177:                                   ; now call the actual function
        !           178:                                   (setq tmp (funcall (get ',name 'traced-expr) x))
        !           179:                                   (printLevel)
        !           180:                                   (patom " <EXIT<  " traceport) ; now print epilog
        !           181:                                   (patom (extName ',name) traceport)
        !           182:                                   (patom "  " traceport)
        !           183:                                   (d_isplay tmp traceport)
        !           184:                                   (terpri traceport)
        !           185:                                   (return tmp)))))))) ; return the return value
        !           186: 
        !           187: 
        !           188: 
        !           189: (defun extName (fnName)
        !           190:   (let ((zzName (reverse (explodec fnName))))
        !           191:        (cond ((memq '$ zzName) (implode (reverse (cdr (memq '$ zzName)))))
        !           192:             (t (implode (reverse (cdr (memq '_ zzName))))))))
        !           193: 
        !           194: 
        !           195: (defun printLevel nil
        !           196:   (do ((counter 1 (1+ counter)))
        !           197:       ((eq counter level) (patom level traceport))
        !           198:       (cond ((oddp counter) (patom "|" traceport))
        !           199:            (t (patom " " traceport)))))
        !           200: 
        !           201: ; This is called by Untrace for each individaul function to be untraced.
        !           202: ; It handles the traced-expr property hassles.
        !           203: 
        !           204: (defun untrace1 (name)
        !           205:   (let ((tmp (get name 'traced-expr)))
        !           206:        (cond ((null tmp) ; if the traced-expr property is unreasonable
        !           207:              ; a better check for unreasonableness is needed
        !           208:              (extractName name) ; complain
        !           209:              (patom " was not traced properly - cant restore")
        !           210:              (terpr))
        !           211:             (t (putd name tmp) ; else restore and remove the traced-expr
        !           212:                (remprop name 'traced-expr)))))
        !           213: 
        !           214: ; sz is a function that returns the total number of atoms in its argument
        !           215: 
        !           216: (defun sz (x)
        !           217:   (cond ((null x) 0)
        !           218:        ((atom x) 1)
        !           219:        (t (add (size (car x))
        !           220:                (size (cdr x))))))
        !           221: 
        !           222: ; inc is a macro used by the increment functions
        !           223: 
        !           224: (defmacro inc (x)
        !           225:   `(rplacd ,x (1+ (cdr ,x))))
        !           226: 
        !           227: ; inctimes is a macro used by IncrFunArgNo
        !           228: 
        !           229: (defmacro inctimes (x times)
        !           230:   `(rplacd ,x (add times (cdr ,x))))
        !           231: 
        !           232: ; increment the 'funargno' attribute of the functional form 
        !           233: 
        !           234: (defun IncrFunArgNo (fform times)
        !           235:   (inctimes (sassq 'funargno
        !           236:                   (get 'Measures fform)
        !           237:                   '(lambda ()
        !           238:                            (cprintf "error: %s has no funargno"
        !           239:                                     fform)
        !           240:                            (terpr)
        !           241:                            (break)))
        !           242:            times))
        !           243: 
        !           244: ; increment the 'funargtyp' information of the functional form
        !           245: ; if the particular function/form has never yet been used with his
        !           246: ; functional form, create the entry
        !           247: 
        !           248: (defun IncrFunArgTyp (fform funct)
        !           249:   (inc (sassoc funct ; get (fn.#oftimes). This has to be sassoc NOT sassq.
        !           250:               (cadr (sassq 'funargtyp  ; get (funargtyp ...)
        !           251:                            (get 'Measures fform)
        !           252:                            '(lambda ()
        !           253:                                     (cprintf "error: %s has no funargtyp"
        !           254:                                              fform)
        !           255:                                     (terpr)
        !           256:                                     (break))))
        !           257:               ; 'funargtyp' was there but not the funct
        !           258:               ; should return (fn.#oftimes)
        !           259:               '(lambda ()
        !           260:                        (cond ((setq dummy (cadr (assq 'funargtyp
        !           261:                                                       (get 'Measures fform))))
        !           262:                               ; the alist is not empty and we
        !           263:                               ; know that funct was not there
        !           264:                               (assq funct
        !           265:                                     (nconc dummy
        !           266:                                            (list (cons funct 0)))))
        !           267:                              ; the alist is empty, so add the element
        !           268:                              (t (assq funct
        !           269:                                       (cadr (nconc (assq 'funargtyp
        !           270:                                                          (get 'Measures fform))
        !           271:                                                    (list (list (cons funct 0))))))))))))
        !           272: ; increment the 'times' attribute of the function
        !           273: 
        !           274: (defun IncrTimes (funct)
        !           275:   (inc (assq 'times (get 'Measures funct))))
        !           276: 
        !           277: ; update the 'avg arg size' attribute of the function
        !           278: ; actually it is the total size. it should be divided by the 'times'
        !           279: ; attribute to get the avg size.
        !           280: 
        !           281: (defun IncrSize (funct size)
        !           282:   (rplacd (assq 'size (get 'Measures funct))
        !           283:          (add (cdr (assq 'size (get 'Measures funct)))
        !           284:               size)))
        !           285: 
        !           286: ; This adds the given function as a property of Measures and
        !           287: ; initializes it to have the 'times' and 'size' attributes.
        !           288: 
        !           289: (defun InitUDF (UDF)
        !           290:   (putprop 'Measures '((times . 0) (size . 0)) UDF))
        !           291: 
        !           292: 
        !           293: ; This increments the times and the size atribute of a UDF, if it exists 
        !           294: ; Otherwise, it does nothing.
        !           295: 
        !           296: (defun IncrUDF (UDF seq)
        !           297:   (cond 
        !           298:    ((and (memq UDF TracedFns) (get 'Measures UDF)) ;if the UDF is traceable
        !           299:     (IncrTimes UDF)
        !           300:     (IncrSize UDF (size seq)))))
        !           301: 
        !           302: ; This adds the 'size' attribute to the alist corresponding to each
        !           303: ; function in 'FnList' and initializes the value to 0.
        !           304: 
        !           305: (defun InitSize (FnList)
        !           306:   (mapcar '(lambda (funct) (nconc (get 'Measures funct) (list (cons 'size 0))))
        !           307:          FnList))
        !           308: 
        !           309: ; This adds the 'funargtyp' (functional argument type) attribute to
        !           310: ; the alist corresponding to each functional form in 'FnFormList' and
        !           311: ; initializes the value to nil.
        !           312: 
        !           313: (defun InitFunArgTyp (FnFormList)
        !           314:   (mapcar '(lambda (fform)
        !           315:                   (nconc (get 'Measures fform)
        !           316:                          (list (list 'funargtyp))))
        !           317:          FnFormList))
        !           318: 
        !           319: ; This adds the 'funargno' (number of functional args) attribute to
        !           320: ; the alist correphsponding to each functional form in 'FnFormList'
        !           321: ; and initializes the value to 0.
        !           322: 
        !           323: (defun InitFunArgNo (FnFormList)
        !           324:   (mapcar '(lambda (fform)
        !           325:                   (nconc (get 'Measures fform)
        !           326:                          (list (cons 'funargno 0))))
        !           327:          FnFormList))
        !           328: 
        !           329: ; Prints out the stats to a file
        !           330: 
        !           331: (defun PrintMeasures (sFileName)
        !           332:   (cond (sFileName
        !           333:         (let ((statPort nil))
        !           334:              (cond ((setq statPort (outfile sFileName 'append))
        !           335:                     (SendMeasures statPort) ; write the stuff
        !           336:                     (terpri statPort)
        !           337:                     (close statPort))
        !           338:                    (t (terpr)
        !           339:                       (patom "Cannot open statFile")
        !           340:                       (terpr)))))
        !           341:        (t (SendMeasures nil))))
        !           342: 
        !           343: 
        !           344: ; Traverses the Measures structure and prints out the
        !           345: ; info onto 'port'.
        !           346: ; Also removes the attributes from Measures (during traversal)
        !           347: 
        !           348: (defun SendMeasures (port)
        !           349:   (do ((functlist (plist 'Measures) 
        !           350:                  (cddr functlist)));for each alternate elem in functlist
        !           351:       ((null functlist)) ; end when all done
        !           352:       (let ((fnStats (cadr functlist)))
        !           353:           (cond ((and fnStats (not (zerop (cdr (assoc 'times fnStats)))))
        !           354:                  (cprintf "%s:" (printName (car functlist)) port)
        !           355:                  (do ((proplist fnStats (cdr proplist)))
        !           356:                      ((null proplist))
        !           357:                      (let ((prop (car proplist))) ; for each prop in proplist
        !           358:                           (cond ((eq (car prop) 'funargtyp) ; if it is funargtyp
        !           359:                                  (doFuncArg port prop))
        !           360:                                 (t (cprintf "  %s" (car prop) port);if not funargtyp
        !           361:                                    (cprintf "  %d" (cdr prop) port)))))
        !           362:                  ; end of function
        !           363:                  (terpri port)
        !           364:                  (terpri port)))))); a newline separates functions
        !           365: 
        !           366: (defun doFuncArg (port prop)
        !           367:   (terpri port)
        !           368:   (terpri port)
        !           369:   (cprintf "                   Functional Args" nil port)
        !           370:   (terpri port)
        !           371:   (cprintf "           Name                    Times" nil port)
        !           372:   (terpri port)
        !           373:   (do ((funclist (cadr prop) (cdr funclist)))
        !           374:       ((null funclist))
        !           375:       (cprintf "               " nil port)
        !           376:       (patom (printName (caar funclist)) port)
        !           377:       (cprintf "                       %d" (cdar funclist) port)
        !           378:       (terpri port)))
        !           379: 
        !           380: (defun printName (fnName)
        !           381:   (let ((zzName (reverse (explodec fnName)))
        !           382:        (tName nil))
        !           383:        (setq tName (memq '$ zzName))
        !           384:        (cond (tName (implode (reverse (cdr tName))))
        !           385:             (t 
        !           386:              (setq tName (memq '_ zzName))
        !           387:              (cond (tName (implode (reverse (cdr tName))))
        !           388:                    ((stringp fnName) (concat '|"| fnName '|"|))
        !           389:                    (t (put_obj fnName)))))))
        !           390: 
        !           391: ; this is the same as the function in fp_main.l except that it takes
        !           392: ; an extra argument which is the port name. it is used for printing
        !           393: ; out a lisp object in the FP form
        !           394: 
        !           395: (defun d_isplay (obj port)
        !           396:   (cond ((null obj) (patom "<>" port))
        !           397:        ((atom obj) (patom obj port))
        !           398:        ((listp obj)
        !           399:         (patom "<" port)
        !           400:         (maplist 
        !           401:          '(lambda (x) 
        !           402:                   (d_isplay (car x) port)
        !           403:                   (cond ((not (onep (length x))) (patom " " port)))) obj)
        !           404:         (patom ">" port))))
        !           405: 
        !           406: 
        !           407: (defun measAlph (al seq)
        !           408:   (IncrFunArgTyp 'alpha$fp al)
        !           409:   (IncrTimes 'alpha$fp)
        !           410:   (IncrSize 'alpha$fp (size seq)))
        !           411: 
        !           412: (defun measIns (ins seq)
        !           413:   (IncrFunArgTyp 'insert$fp ins)
        !           414:   (IncrTimes 'insert$fp)
        !           415:   (IncrSize 'insert$fp (size seq)))
        !           416: 
        !           417: (defun measTi (ains seq)
        !           418:   (IncrFunArgTyp 'ti$fp ains)
        !           419:   (IncrTimes 'ti$fp)
        !           420:   (IncrSize 'ti$fp (size seq)))
        !           421: 
        !           422: (defun measSel (sel seq)
        !           423:   (IncrFunArgTyp 'select$fp sel)
        !           424:   (IncrTimes 'select$fp)
        !           425:   (IncrSize 'select$fp (size seq)))
        !           426: 
        !           427: (defun measCons (cons seq)
        !           428:   (IncrFunArgTyp 'constant$fp cons)
        !           429:   (IncrTimes 'constant$fp)
        !           430:   (IncrSize 'constant$fp (size seq)))
        !           431: 
        !           432: (defun measCond (c1 c2 c3 seq)
        !           433:   (IncrFunArgTyp 'condit$fp c1)
        !           434:   (IncrFunArgTyp 'condit$fp c2)
        !           435:   (IncrFunArgTyp 'condit$fp c3)
        !           436:   (IncrTimes 'condit$fp)
        !           437:   (IncrSize 'condit$fp (size seq)))
        !           438: 
        !           439: (defun measWhile (w1 w2 seq)
        !           440:   (IncrFunArgTyp 'while$fp  w1)
        !           441:   (IncrFunArgTyp 'while$fp  w2)
        !           442:   (IncrTimes 'while$fp)
        !           443:   (IncrSize 'while$fp (size seq)))
        !           444: 
        !           445: (defun measComp (cm1 cm2 seq)
        !           446:   (IncrFunArgTyp 'compos$fp cm1)
        !           447:   (IncrFunArgTyp 'compos$fp cm2)
        !           448:   (IncrTimes 'compos$fp)
        !           449:   (IncrSize 'compos$fp (size seq)))
        !           450: 
        !           451: (defun measConstr (fns seq)
        !           452:   (mapcar '(lambda (x) (IncrFunArgTyp 'constr$fp x)) fns)
        !           453:   (IncrFunArgNo 'constr$fp (length fns))
        !           454:   (IncrTimes 'constr$fp)
        !           455:   (IncrSize 'constr$fp (size seq)))
        !           456: 
        !           457: ; get the corect name of the functional form
        !           458: 
        !           459: (defmacro getFform (xx)
        !           460:   `(implode (nreverse `(p f ,@(cdr (nreverse (explodec (cxr 0 ,xx))))))))
        !           461: 

unix.superglobalmegacorp.com

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