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

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

unix.superglobalmegacorp.com

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