|
|
1.1 ! root 1: (setq rcs-common2- ! 2: "$Header: common2.l,v 1.10 84/02/29 19:32:00 jkf Exp $") ! 3: ! 4: ;; ! 5: ;; common2.l -[Fri Feb 3 07:42:40 1984 by jkf]- ! 6: ;; ! 7: ;; lesser used functions ! 8: ;; ! 9: ! 10: ! 11: (declare (macros t)) ! 12: ! 13: ;--- process functions ! 14: ; these functions permit the user to start up processes and either ! 15: ; to either wait for their completion or to continue processing, ! 16: ; communicating with them through a pipe. ! 17: ; ! 18: ; the main function, *process, is written in C. These functions ! 19: ; handle the common cases ! 20: ; ! 21: ;--- *process-send :: start a process and return port to write to ! 22: ; ! 23: (defun *process-send (command) ! 24: (cadr (*process command nil t))) ! 25: ! 26: ;--- *process-receive :: start a process and return port to read from ! 27: ; ! 28: (defun *process-receive (command) ! 29: (car (*process command t))) ! 30: ! 31: ;--- process :: the old nlambda version of process ! 32: ; this function is kept around for compatibility ! 33: ; use: (process command [frompipe [topipe]]) ! 34: ; if the from and to pipes aren't given, run it and wait ! 35: ; ! 36: (defun process fexpr (args) ! 37: (declare (*args 1 3)) ! 38: (let ((command (car args)) ! 39: (fromport (cadr args)) ! 40: (toport (caddr args))) ! 41: (cond ((null (cdr args)) (*process command)) ; call and wait ! 42: (t (let ((res (*process command fromport toport))) ! 43: (cond (fromport (set fromport (cadr res)))) ! 44: (cond (toport (set toport (car res)))) ! 45: ; return pid ! 46: (caddr res)))))) ! 47: ! 48: ! 49: ;--- msg : print a message consisting of strings and values ! 50: ; arguments are: ! 51: ; N - print a newline ! 52: ; (N foo) - print foo newlines (foo is evaluated) ! 53: ; B - print a blank ! 54: ; (B foo) - print foo blanks (foo is evaluated) ! 55: ; (P foo) - print following args to port foo (foo is evaluated) ! 56: ; (C foo) - go to column foo (foo is evaluated) ! 57: ; (T n) - print n tabs ! 58: ; D - drain ! 59: ; other - evaluate a princ the result (remember strings eval to themselves) ! 60: ! 61: (defmacro msg (&rest msglist) ! 62: (do ((ll msglist (cdr ll)) ! 63: (result) ! 64: (cur nil nil) ! 65: (curport nil) ! 66: (current)) ! 67: ((null ll) `(progn ,@(nreverse result))) ! 68: (setq current (car ll)) ! 69: (If (dtpr current) ! 70: then (If (eq (car current) 'N) ! 71: then (setq cur `(msg-tyo-char 10 ,(cadr current))) ! 72: elseif (eq (car current) 'B) ! 73: then (setq cur `(msg-tyo-char 32 ,(cadr current))) ! 74: elseif (eq (car current) 'T) ! 75: then (setq cur `(msg-tyo-char #\tab ,(cadr current))) ! 76: elseif (eq (car current) 'P) ! 77: then (setq curport (cadr current)) ! 78: elseif (eq (car current) 'C) ! 79: then (setq cur `(tab (1- ,(cadr current)))) ! 80: else (setq cur `(msg-print ,current))) ! 81: elseif (eq current 'N) ! 82: then (setq cur (list 'terpr)) ; (can't use backquote ! 83: elseif (eq current 'B) ; since must have new ! 84: then (setq cur (list 'tyo 32)) ; dtpr cell at end) ! 85: elseif (eq current 'D) ! 86: then (setq cur '(drain)) ! 87: else (setq cur `(msg-print ,current))) ! 88: (If cur ! 89: then (setq result (cons (If curport then (nconc cur (ncons curport)) ! 90: else cur) ! 91: result))))) ! 92: ! 93: ! 94: ! 95: ! 96: (defun msg-tyo-char (ch n &optional (port nil)) ! 97: (do ((i n (1- i))) ! 98: ((< i 1)) ! 99: (cond ((eq ch 10) (terpr port)) ! 100: (t (tyo ch port))))) ! 101: ! 102: (defun msg-print (item &optional (port nil)) ! 103: (patom item port)) ! 104: ! 105: ;--- printblanks :: print out a stream of blanks to the given port ! 106: ; (printblanks 'x_numberofblanks 'p_port) ! 107: ; ! 108: (def printblanks ! 109: (lambda (n prt) ! 110: (let ((easy (memq n '( 0 "" ! 111: 1 " " ! 112: 2 " " ! 113: 3 " " ! 114: 4 " " ! 115: 5 " " ! 116: 6 " " ! 117: 7 " " ! 118: 8 " ")))) ! 119: (cond (easy (patom (cadr easy) prt)) ! 120: (t (do ((i n (1- i))) ! 121: ((<& i 1)) ! 122: (patom " " prt))))))) ! 123: ! 124: ! 125: ! 126: ! 127: ! 128: ; --- linelength [numb] ! 129: ; ! 130: ; sets the linelength (actually just varib linel) to the ! 131: ; number given: numb ! 132: ; if numb is not given, the current line length is returned ! 133: ; ! 134: ! 135: (declare (special linel)) ! 136: ! 137: (setq linel 80) ! 138: ! 139: (def linelength ! 140: (nlambda (form) ! 141: (cond ((null form) linel ) ! 142: ((numberp (car form)) (setq linel (car form))) ! 143: (t linel)))) ! 144: ! 145: ; ======================================== ! 146: ; ! 147: ; (charcnt port) ! 148: ; returns the number of characters left on the current line ! 149: ; on the given port ! 150: ; ! 151: ; ======================================= ! 152: ! 153: ! 154: (def charcnt ! 155: (lambda (port) (- linel (nwritn port)))) ! 156: ! 157: ;--- nthcdr :: do n cdrs of the list and return the result ! 158: ; ! 159: ; ! 160: (defun nthcdr (index list) ! 161: (cond ((fixp index) ! 162: (cond ((<& index 0) ! 163: (cons nil list)) ! 164: ((=& index 0) ! 165: list) ! 166: (t (nthcdr (1- index) (cdr list))))) ! 167: (t (error "Non fixnum first argument to nthcdr " index)))) ! 168: ! 169: ;--- nthcdr (cmacro) :: version of nthcdr for use by the compiler ! 170: ; ! 171: (defcmacro nthcdr (index list) ! 172: (if (and (fixp index) (=& index 0)) ! 173: then list ; (nthcdr 0 expr) => expr ! 174: else (let ((val (assq index '((1 . cdr) ! 175: (2 . cddr) ! 176: (3 . cdddr) ! 177: (4 . cddddr) ! 178: (5 . cdddddr) ! 179: (6 . cddddddr))))) ! 180: (cond (val `(,(cdr val) ,list)) ; (nthcdr 1-6 list) ! 181: (t `(nthcdr ,index ,list)))))) ; other cases ! 182: ! 183: ! 184: ;--- nth :: return nth element of the list ! 185: ; cdr index times and then car to get the element. ! 186: ; thus the first element is 0 ! 187: ; ! 188: (defun nth (index list) ! 189: (car (nthcdr index list))) ! 190: ! 191: ;--- nth (cmacro) :: compiler macro to do the same thing ! 192: ; ! 193: (defcmacro nth (index list) ! 194: `(car (nthcdr ,index ,list))) ! 195: ! 196: ! 197: ! 198: ! 199: ;;============================== ! 200: ; (assqr val alist) ! 201: ; acts much like assq, it looks for val in the cdr of elements of ! 202: ; the alist and returns the element if found. ! 203: ; fix this when the compiler works ! 204: (eval-when nil (def assqr ! 205: (lambda (val alist) ! 206: (do ((al alist (cdr al))) ! 207: ((null al) nil) ! 208: (cond ((eq val (cdar al)) (return (car al)))))))) ! 209: ! 210: ! 211: ; ==================== ! 212: ; (listp 'x) is t if x is a non-atom or nil ! 213: ; ==================== ! 214: (def listp (lambda (val) (or (dtpr val) (null val)))) ! 215: ! 216: ! 217: ! 218: ;--- memcar - VAL : lispval ! 219: ; - LIS : list ! 220: ; returns t if VAL found as the car of a top level element. ! 221: ;temporarily turn this off till the compiler can handle it. ! 222: (eval-when nil (def memcar ! 223: (lambda (a l) ! 224: (do ((ll l (cdr ll))) ! 225: ((null ll) nil) ! 226: (cond ((equal (caar ll) a) (return (cdar ll)))))))) ! 227: ! 228: ; ================================= ! 229: ; ! 230: ; (memcdr 'val 'listl) ! 231: ; ! 232: ; the list listl is searched for a list ! 233: ; with cdr equal to val. if found, the ! 234: ; car of that list is returned. ! 235: ; ================================== ! 236: ;fix this when compiler works ok ! 237: (eval-when nil (def memcdr ! 238: (lambda (a l) ! 239: (do ((ll l (cdr ll))) ! 240: ((null ll) nil) ! 241: (cond ((equal (cdar ll) a) (return (caar l)))))))) ! 242: ! 243: ! 244: ;this looks like funcall, so we will just use it ! 245: '(def apply* ! 246: (nlambda ($x$) ! 247: (eval (cons (eval (car $x$)) (cdr $x$))))) ! 248: ! 249: (putd 'apply* (getd 'funcall)) ! 250: ! 251: (defun remq (item list &optional (cnt -1)) ;no tail recursion sucks. ! 252: (let ((head nil) ! 253: (tail nil)) ! 254: (do ((l list (cdr l)) ! 255: (newcell)) ! 256: ((null l) head) ! 257: (cond ((or (not (eq (car l) item)) ! 258: (=& 0 cnt)) ! 259: (setq newcell (list (car l))) ! 260: (cond ((null head) (setq head newcell)) ! 261: (t (rplacd tail newcell))) ! 262: (setq tail newcell)) ! 263: (t (setq cnt (1- cnt))))))) ! 264: ! 265: (defun tab n ! 266: (prog (nn prt over) ! 267: (setq nn (arg 1)) ! 268: (cond ((>& n 1) (setq prt (arg 2)))) ! 269: (cond ((>& (setq over (nwritn prt)) nn) ! 270: (terpri prt) ! 271: (setq over 0))) ! 272: (printblanks (- nn over) prt))) ! 273: ! 274: ;--- charcnt :: returns the number of characters left on the current line ! 275: ; p - port ! 276: ;(local function) ! 277: (def charcnt ! 278: (lambda (port) (- linel (nwritn port)))) ! 279: ! 280: ;(local function) ! 281: ; ! 282: (declare (special $outport$)) ! 283: (def $patom1 (lambda (x) (patom x $outport$))) ! 284: ! 285: ;;; --- cmu functions --- ! 286: (def attach ! 287: (lambda (x y) ! 288: (cond ((dtpr y) (rplacd y (cons (car y) (cdr y))) (rplaca y x)) ! 289: (t (error "An atom can't be attached to " y))))) ! 290: (def Cnth ! 291: (lambda (x n) ! 292: (cond ((> 1 n) (cons nil x)) ! 293: (t ! 294: (prog nil ! 295: lp (cond ((or (atom x) (eq n 1)) (return x))) ! 296: (setq x (cdr x)) ! 297: (setq n (1- n)) ! 298: (go lp)))))) ! 299: ! 300: ! 301: ! 302: ! 303: (def dsubst ! 304: (lambda (x y z) ! 305: (prog (b) ! 306: (cond ((eq y (setq b z)) (return (copy x)))) ! 307: lp ! 308: (cond ((atom z) (return b)) ! 309: ((cond ((symbolp y) (eq y (car z))) (t (equal y (car z)))) ! 310: (rplaca z (copy x))) ! 311: (t (dsubst x y (car z)))) ! 312: (cond ((and y (eq y (cdr z))) (rplacd z (copy x)) (return b))) ! 313: (setq z (cdr z)) ! 314: (go lp)))) ! 315: ! 316: (putd 'eqstr (getd 'equal)) ! 317: ! 318: (defun insert (x l comparefn nodups) ! 319: (cond ((null l) (list x)) ! 320: ((atom l) (error "an atom, can't be inserted into" l)) ! 321: ((and nodups (member x l)) l) ! 322: (t (cond ! 323: ((null comparefn) (setq comparefn (function alphalessp)))) ! 324: (prog (l1 n n1 y) ! 325: (setq l1 l) ! 326: (setq n (length l)) ! 327: a (setq n1 (/ (add1 n) 2)) ! 328: (setq y (Cnth l1 n1)) ! 329: (cond ((< n 3) ! 330: (cond ((funcall comparefn x (car y)) ! 331: (cond ! 332: ((not (equal x (car y))) ! 333: (rplacd y (cons (car y) (cdr y))) ! 334: (rplaca y x)))) ! 335: ((eq n 1) (rplacd y (cons x (cdr y)))) ! 336: ((funcall comparefn x (cadr y)) ! 337: (cond ! 338: ((not (equal x (cadr y))) ! 339: (rplacd (cdr y) ! 340: (cons (cadr y) (cddr y))) ! 341: (rplaca (cdr y) x)))) ! 342: (t (rplacd (cdr y) (cons x (cddr y)))))) ! 343: ((funcall comparefn x (car y)) ! 344: (cond ! 345: ((not (equal x (car y))) ! 346: (setq n (sub1 n1)) ! 347: (go a)))) ! 348: (t (setq l1 (cdr y)) (setq n (- n n1)) (go a)))) ! 349: l))) ! 350: ! 351: ! 352: ! 353: ! 354: (def kwote (lambda (x) (list 'quote x))) ! 355: ! 356: (def lconc ! 357: (lambda ! 358: (ptr x) ! 359: (prog (xx) ! 360: (return ! 361: (cond ((atom x) ptr) ! 362: (t (setq xx (last x)) ! 363: (cond ((atom ptr) (cons x xx)) ! 364: ((dtpr (cdr ptr)) ! 365: (rplacd (cdr ptr) x) ! 366: (rplacd ptr xx)) ! 367: (t (rplaca (rplacd ptr xx) x))))))))) ! 368: (def ldiff ! 369: (lambda (x y) ! 370: (cond ((eq x y) nil) ! 371: ((null y) x) ! 372: (t ! 373: (prog (v z) ! 374: (setq z (setq v (ncons (car x)))) ! 375: loop (setq x (cdr x)) ! 376: (cond ((eq x y) (return z)) ! 377: ((null x) (error "not a tail - ldiff"))) ! 378: (setq v (cdr (rplacd v (ncons (car x))))) ! 379: (go loop)))))) ! 380: ! 381: (def lsubst ! 382: (lambda (x y z) ! 383: (cond ((null z) nil) ! 384: ((atom z) (cond ((eq y z) x) (t z))) ! 385: ((equal y (car z)) (nconc (copy x) (lsubst x y (cdr z)))) ! 386: (t (cons (lsubst x y (car z)) (lsubst x y (cdr z))))))) ! 387: ! 388: (def merge ! 389: (lambda (a b %%cfn) ! 390: (declare (special %%cfn)) ! 391: (cond ((null %%cfn) (setq %%cfn (function alphalessp)))) ! 392: (merge1 a b))) ! 393: ! 394: (def merge1 ! 395: (lambda (a b) ! 396: (declare (special %%cfn)) ! 397: (cond ((null a) b) ! 398: ((null b) a) ! 399: (t ! 400: (prog (val end) ! 401: (setq val ! 402: (setq end ! 403: (cond ((funcall %%cfn (car a) (car b)) ! 404: (prog1 a (setq a (cdr a)))) ! 405: (t (prog1 b (setq b (cdr b))))))) ! 406: loop (cond ((null a) (rplacd end b) (return val)) ! 407: ((null b) (rplacd end a) (return val)) ! 408: ((funcall %%cfn (car a) (car b)) ! 409: (rplacd end a) ! 410: (setq a (cdr a))) ! 411: (t (rplacd end b) (setq b (cdr b)))) ! 412: (setq end (cdr end)) ! 413: (go loop)))))) ! 414: ! 415: (defmacro neq (a b) `(not (eq ,a ,b))) ! 416: ! 417: (putd 'nthchar (getd 'getchar)) ! 418: ;(def nthchar ! 419: ; (lambda (x n) ! 420: ; (cond ((plusp n) (car (Cnth (explodec x) n))) ! 421: ; ((minusp n) (car (Cnth (reverse (explodec x)) (minus n)))) ! 422: ; ((zerop n) nil)))) ! 423: ! 424: (defmacro quote! (&rest a) (quote!-expr-mac a)) ! 425: ! 426: (eval-when (compile eval load) ! 427: ! 428: (defun quote!-expr-mac (form) ! 429: (cond ((null form) nil) ! 430: ((atom form) `',form) ! 431: ((eq (car form) '!) ! 432: `(cons ,(cadr form) ,(quote!-expr-mac (cddr form)))) ! 433: ((eq (car form) '!!) ! 434: (cond ((cddr form) `(append ,(cadr form) ! 435: ,(quote!-expr-mac (cddr form)))) ! 436: (t (cadr form)))) ! 437: (t `(cons ,(quote!-expr-mac (car form)) ! 438: ,(quote!-expr-mac (cdr form)))))) ! 439: ! 440: ) ! 441: ! 442: (defun remove (item list &optional (cnt -1)) ! 443: (let ((head '()) ! 444: (tail nil)) ! 445: (do ((l list (cdr l)) ! 446: (newcell)) ! 447: ((null l) head) ! 448: (cond ((or (not (equal (car l) item)) ! 449: (zerop cnt)) ! 450: (setq newcell (list (car l))) ! 451: (cond ((null head) (setq head newcell)) ! 452: (t (rplacd tail newcell))) ! 453: (setq tail newcell)) ! 454: (t (setq cnt (1- cnt))))))) ! 455: ! 456: (def subpair ! 457: (lambda (old new expr) ! 458: (cond (old (subpr expr old (or new '(nil)))) (t expr)))) ! 459: ! 460: (def subpr ! 461: (lambda (expr l1 l2) ! 462: (prog (d a) ! 463: (cond ((atom expr) (go lp)) ! 464: ((setq d (cdr expr)) (setq d (subpr d l1 l2)))) ! 465: (setq a (subpr (car expr) l1 l2)) ! 466: (return ! 467: (cond ((or (neq a (car expr)) ! 468: (neq d (cdr expr))) (cons a d)) ! 469: (t expr))) ! 470: lp (cond ((null l1) (return expr)) ! 471: (l2 (cond ((eq expr (car l1)) ! 472: (return (car l2))))) ! 473: (t (cond ((eq expr (caar l1)) ! 474: (return (cdar l1)))))) ! 475: (setq l1 (cdr l1)) ! 476: (and l2 (setq l2 (or (cdr l2) '(nil)))) ! 477: (go lp)))) ! 478: (def tailp ! 479: (lambda (x y) ! 480: (and x ! 481: (prog nil ! 482: lp (cond ((atom y) (return nil)) ((eq x y) (return x))) ! 483: (setq y (cdr y)) ! 484: (go lp))))) ! 485: ! 486: (def tconc ! 487: (lambda (p x) ! 488: (cond ((atom p) (cons (setq x (ncons x)) x)) ! 489: ((dtpr (cdr p)) (rplacd p (cdr (rplacd (cdr p) (ncons x))))) ! 490: (t (rplaca p (cdr (rplacd p (ncons x)))))))) ! 491: ! 492: ;--- int:vector-range-error ! 493: ; this is called from compiled code if a vector reference is made ! 494: ; which is out of bounds. it should print an error message and ! 495: ; never return ! 496: (defun int:vector-range-error (vec index) ! 497: (error "vector index out of range detected in compiled code " ! 498: (list vec index))) ! 499: ! 500: ;--- int:wrong-number-of-args-error :: pass wna error message to user ! 501: ; this is called from compiled code (through wnaerr in the C interpreter) ! 502: ; when it has been detected that the wrong number of arguments have ! 503: ; been passed. The state of the arguments are: ! 504: ; args 1 to (- n 3) are the acutal arguments ! 505: ; arg (- n 2) is the name of the function called ! 506: ; arg (- n 1) is the minimum number of arguments allowed ! 507: ; arg n is the maximum number of arguments allowed ! 508: ; (or -1 if there is no maximum) ! 509: (defun int:wrong-number-of-args-error n ! 510: (let ((max (arg n)) ! 511: (min (arg (1- n))) ! 512: (name (arg (- n 2)))) ! 513: (do ((i (- n 3) (1- i)) ! 514: (x) ! 515: (args)) ! 516: ((<& i 1) ! 517: ; cases ! 518: ; exact number ! 519: ; min and max ! 520: ; only a min ! 521: (if (=& min max) ! 522: then (setq x ! 523: (format nil ! 524: "`~a' expects ~r argument~p but was given ~@d:" ! 525: name min min (length args))) ! 526: elseif (=& max -1) ! 527: then (setq x ! 528: (format nil ! 529: "`~a' expects at least ~r argument~p but was given ~@d:" ! 530: name min min (length args))) ! 531: else (setq x ! 532: (format nil ! 533: "`~a' expects between ~r and ~r arguments but was given ~@d:" ! 534: name min max (length args)))) ! 535: ! 536: (error x args)) ! 537: (push (arg i) args)))) ! 538: ;--- functions to retrieve parts of the vector returned by ! 539: ; filestat ! 540: ; ! 541: (eval-when (compile eval) ! 542: (defmacro filestat-chk (name index) ! 543: `(defun ,name (arg) ! 544: (cond ((vectorp arg) ! 545: (vref arg ,index)) ! 546: (t (error (concat ',name '|: bad arg |) arg)))))) ! 547: (filestat-chk filestat:mode 0) ! 548: (filestat-chk filestat:type 1) ! 549: (filestat-chk filestat:nlink 2) ! 550: (filestat-chk filestat:uid 3) ! 551: (filestat-chk filestat:gid 4) ! 552: (filestat-chk filestat:size 5) ! 553: (filestat-chk filestat:atime 6) ! 554: (filestat-chk filestat:mtime 7) ! 555: (filestat-chk filestat:ctime 8) ! 556: (filestat-chk filestat:dev 9) ! 557: (filestat-chk filestat:rdev 10) ! 558: (filestat-chk filestat:ino 11) ! 559: ! 560: ;; lisp coded showstack and baktrace. ! 561: ;; ! 562: ! 563: (declare (special showstack-prinlevel showstack-prinlength ! 564: showstack-printer prinlevel prinlength)) ! 565: ! 566: (or (boundp 'showstack-prinlevel) (setq showstack-prinlevel 3)) ! 567: (or (boundp 'showstack-prinlength) (setq showstack-prinlength 4)) ! 568: (or (boundp 'showstack-printer) (setq showstack-printer 'print)) ! 569: (or (getd 'old-showstack) (putd 'old-showstack (getd 'showstack))) ! 570: (or (getd 'old-baktrace) (putd 'old-baktrace (getd 'baktrace))) ! 571: ! 572: ;--- showstack :: do a stack backtrace. ! 573: ; arguments (unevaluated) are ! 574: ; t - print trace expressions too (normally they are not printed) ! 575: ; N - for some fixnum N, only print N levels. ! 576: ; len N - set prinlength to N ! 577: ; lev N - set prinlevel to N ! 578: ; ! 579: (defun showstack fexpr (args) ! 580: (showstack-baktrace args t)) ! 581: ! 582: (defun baktrace fexpr (args) ! 583: (showstack-baktrace args nil)) ! 584: ! 585: (defun showstack-baktrace (args showstackp) ! 586: (let ((print-trace nil) ! 587: (levels-to-print -1) ! 588: (prinlevel showstack-prinlevel) ! 589: (prinlength showstack-prinlength) ! 590: (res nil) ! 591: (newres nil) ! 592: (oldval nil) ! 593: (stk nil)) ! 594: ;; scan arguments ! 595: (do ((xx args (cdr xx))) ! 596: ((null xx)) ! 597: (cond ((eq t (car xx)) (setq print-trace t)) ! 598: ((fixp (car xx)) (setq levels-to-print (car xx))) ! 599: ((eq 'lev (car xx)) ! 600: (setq xx (cdr xx) prinlevel (car xx))) ! 601: ((eq 'len (car xx)) ! 602: (setq xx (cdr xx) prinlength (car xx))))) ! 603: ;; print the levels ! 604: (do ((levs levels-to-print) ! 605: (firsttime t nil)) ! 606: ((or (equal 0 stk) ! 607: (zerop levs)) ! 608: (terpr)) ! 609: (setq res (int:showstack stk)) ! 610: (cond ((null res) (terpr) (return nil))) ! 611: (setq stk (cdr res) ! 612: res (car res)) ! 613: (cond ((or print-trace (not (trace-funp res))) ! 614: (cond ((and oldval showstackp) ! 615: (setq newres (subst-eq '<**> oldval res))) ! 616: (t (setq newres res))) ! 617: (cond (showstackp (funcall showstack-printer newres) (terpr)) ! 618: (t (baktraceprint newres firsttime))) ! 619: (setq levs (1- levs)) ! 620: (setq oldval res)))))) ! 621: ! 622: (defun baktraceprint (form firsttime) ! 623: (cond ((not firsttime) (patom " -- "))) ! 624: (cond ((> (nwritn) 65) (terpr))) ! 625: (cond ((atom form) (print form)) ! 626: (t (let ((prinlevel 1) ! 627: (prinlength 2)) ! 628: (cond ((dtpr form) (print (car form))) ! 629: (t (print form))))))) ! 630: ! 631: ! 632: ;--- trace-funp :: see if this is a trace function call ! 633: ; return t if this call is a result of tracing a function, or of calling ! 634: ; showstack ! 635: ; ! 636: (defun trace-funp (expr) ! 637: (or (and (symbolp expr) ! 638: (memq expr '(T-eval T-apply T-setq ! 639: eval int:showstack showstack-baktrace))) ! 640: (and (dtpr expr) ! 641: (cond ((symbolp (car expr)) ! 642: (memq (car expr) '(trace-break T-cond T-eval T-setq ! 643: T-apply))) ! 644: ((dtpr (car expr)) ! 645: (and (eq 'lambda (caar expr)) ! 646: (eq 'T-arglst (caadar expr)))))))) ! 647: ! 648: ;--- subst-eq :: replace parts eq to new with old ! 649: ; make new list structure ! 650: ; ! 651: (defun subst-eq (new old list) ! 652: (cond ((eq old list) ! 653: new) ! 654: ((and (dtpr list) ! 655: (subst-eqp old list)) ! 656: (cond ((eq old (car list)) ! 657: (cons new (subst-eq new old (cdr list)))) ! 658: ((dtpr (car list)) ! 659: (cons (subst-eq new old (car list)) ! 660: (subst-eq new old (cdr list)))) ! 661: (t (cons (car list) ! 662: (subst-eq new old (cdr list)))))) ! 663: (t list))) ! 664: ! 665: (defun subst-eqp (old list) ! 666: (cond ((eq old list) t) ! 667: ((dtpr list) ! 668: (or (subst-eqp old (car list)) ! 669: (subst-eqp old (cdr list)))) ! 670: (t nil))) ! 671: ! 672: ! 673: ! 674: ;;; environment macros ! 675: ! 676: (defmacro environment (&rest args) ! 677: (do ((xx args (cddr xx)) ! 678: (when)(action)(res)) ! 679: ((null xx) ! 680: `(progn 'compile ! 681: ,@(nreverse res))) ! 682: (setq when (car xx) ! 683: action (cadr xx)) ! 684: (if (atom when) ! 685: then (setq when (ncons when))) ! 686: (if (and (dtpr action) ! 687: (symbolp (car action))) ! 688: then (setq action (cons (concat "environment-" (car action)) ! 689: (cdr action)))) ! 690: (push `(eval-when ,when ,action) res))) ! 691: ! 692: ! 693: (defun environment-files fexpr (names) ! 694: (mapc '(lambda (filename) ! 695: (if (not (get filename 'version)) then (load filename))) ! 696: names)) ! 697: ! 698: (defun environment-syntax fexpr (names) ! 699: (mapc '(lambda (class) ! 700: (caseq class ! 701: (maclisp (cvttomaclisp)) ! 702: (intlisp (cvttointlisp)) ! 703: (ucilisp (cvttoucilisp)) ! 704: ((franz franzlisp) (cvttofranzlisp)) ! 705: (t (error "unknown syntax conversion type " class)))) ! 706: names)) ! 707: ! 708: ;--- standard environments ! 709: (defmacro environment-maclisp (&rest args) ! 710: `(environment (compile load eval) (files machacks) ! 711: (compile eval) (syntax maclisp) ! 712: ,@args)) ! 713: ! 714: ! 715: (defmacro environment-lmlisp (&rest args) ! 716: `(environment (compile load eval) (files machacks lmhacks) ! 717: (compile eval) (syntax maclisp) ! 718: ,@args)) ! 719: ! 720: ;;;--- i/o functions redefined. ! 721: ; The common I/O functions are redefined here to do tilde expansion ! 722: ; if the tilde-expansion symbol is non nil ! 723: (declare (special tilde-expansion)) ! 724: ! 725: ;First, define the current <name> as int:<name> ! 726: ; ! 727: (cond ((null (getd 'int:infile)) ! 728: (putd 'int:infile (getd 'infile)) ! 729: (putd 'int:outfile (getd 'outfile)) ! 730: (putd 'int:fileopen (getd 'fileopen)) ! 731: (putd 'int:cfasl (getd 'cfasl)) ! 732: (putd 'int:fasl (getd 'fasl)))) ! 733: ! 734: ;Second, define the new functions: ! 735: ! 736: (defun infile (filename) ! 737: (cond ((not (or (symbolp filename) (stringp filename))) ! 738: (error "infile: non symbol or string filename " filename))) ! 739: (cond (tilde-expansion (setq filename (tilde-expand filename)))) ! 740: (int:infile filename)) ! 741: ! 742: (defun outfile (filename &optional args) ! 743: (cond ((not (or (symbolp filename) (stringp filename))) ! 744: (error "outfile: non symbol or string filename " filename))) ! 745: (cond (tilde-expansion (setq filename (tilde-expand filename)))) ! 746: (int:outfile filename args)) ! 747: ! 748: ;--- fileopen :: open a file with a non-standard stdio file ! 749: ; [this should probably be flushed because it depends on stdio, ! 750: ; which we may not use in the future] ! 751: (defun fileopen (filename mode) ! 752: (cond ((not (or (symbolp filename) (stringp filename))) ! 753: (error "fileopen: non symbol or string filename " filename))) ! 754: (cond (tilde-expansion (setq filename (tilde-expand filename)))) ! 755: (int:fileopen filename mode)) ! 756: ! 757: (defun fasl (filename &rest args) ! 758: (cond ((not (or (symbolp filename) (stringp filename))) ! 759: (error "fasl: non symbol or string filename " filename))) ! 760: (cond (tilde-expansion (setq filename (tilde-expand filename)))) ! 761: (lexpr-funcall 'int:fasl filename args)) ! 762: ! 763: (defun cfasl (filename &rest args) ! 764: (cond ((not (or (symbolp filename) (stringp filename))) ! 765: (error "cfasl: non symbol or string filename " filename))) ! 766: (cond (tilde-expansion (setq filename (tilde-expand filename)))) ! 767: (lexpr-funcall 'int:cfasl filename args)) ! 768: ! 769: ! 770: ;--- probef :: test if a file exists ! 771: ; ! 772: (defun probef (filename) ! 773: (cond ((not (or (symbolp filename) (stringp filename))) ! 774: (error "probef: non symbol or string filename " filename))) ! 775: (sys:access filename 0)) ! 776: ! 777: ! 778: ! 779: (declare (special user-name-to-dir-cache)) ! 780: (or (boundp 'user-name-to-dir-cache) (setq user-name-to-dir-cache nil)) ! 781: ! 782: ;--- username-to-dir ! 783: ; given a user name, return the home directory name ! 784: ; ! 785: (defun username-to-dir (name) ! 786: (cond ((symbolp name) (setq name (get_pname name))) ! 787: ((stringp name)) ! 788: (t (error "username-to-dir: Illegal name " name))) ! 789: (let ((val (assoc name user-name-to-dir-cache))) ! 790: (cond ((null val) ! 791: (setq val (sys:getpwnam name)) ! 792: (cond (val (push (cons name val) user-name-to-dir-cache)))) ! 793: (t (setq val (cdr val)))) ! 794: (cond (val (sys:getpwnam-dir val))))) ! 795: ! 796: ;--- username-to-dir-flush-cache :: clear all memory of where users are ! 797: ; it is important to call this function upon startup to clear all ! 798: ; knowledge of pathnames since this object file could have been copied ! 799: ; from another machine ! 800: ; ! 801: (defun username-to-dir-flush-cache () ! 802: (setq user-name-to-dir-cache nil)) ! 803: ! 804: ;--- lisp interface to int:franz-call ! 805: ; ! 806: (eval-when (compile eval) ! 807: (setq fc_getpwnam 1 fc_access 2 fc_chdir 3 fc_unlink 4 ! 808: fc_time 5 fc_chmod 6 fc_getpid 7 fc_stat 8 ! 809: fc_gethostname 9 fc_link 10 fc_sleep 11 fc_nice 12)) ! 810: ! 811: ;--- sys:getpwnam ! 812: ; (sys:getpwnam 'st_username) ! 813: ; rets vector: (t_name x_uid x_gid t_dir) ! 814: ; ! 815: (defun sys:getpwnam (name) ! 816: (cond ((or (symbolp name) (stringp name)) ! 817: (int:franz-call #.fc_getpwnam name)) ! 818: (t (error "sys:getpwnam : illegal name " name)))) ! 819: ! 820: ; return dir portion ! 821: ; ! 822: (defun sys:getpwnam-dir (vec) (vref vec 3)) ! 823: ! 824: (defun sys:access (name class) ! 825: (cond ((and (or (symbolp name) (stringp name)) ! 826: (fixp class)) ! 827: (cond (tilde-expansion (setq name (tilde-expand name)))) ! 828: (zerop (int:franz-call #.fc_access name class))) ! 829: (t (error "sys:access : illegal name or class " name class)))) ! 830: ! 831: (defun chdir (dir) ! 832: (cond ((or (symbolp dir) (stringp dir)) ! 833: (cond (tilde-expansion (setq dir (tilde-expand dir)))) ! 834: (cond ((zerop (int:franz-call #.fc_chdir dir))) ! 835: (t (error "cd: can't chdir to " dir)))) ! 836: (t (error "chdir: illegal argument " dir)))) ! 837: ! 838: ;--- sys:unlink :: unlink (remove) a file ! 839: ; ! 840: (defun sys:unlink (name) ! 841: (cond ((or (symbolp name) (stringp name)) ! 842: (cond (tilde-expansion (setq name (tilde-expand name)))) ! 843: (cond ((zerop (int:franz-call #.fc_unlink name))) ! 844: (t (error "sys:unlink : unlink failed of " name)))) ! 845: (t (error "sys:unlink : illegal argument " name)))) ! 846: ! 847: ;--- sys:link :: make (hard) link to file ! 848: ; ! 849: (defun sys:link (oldname newname) ! 850: (cond ((or (symbolp oldname) (stringp oldname)) ! 851: (cond (tilde-expansion (setq oldname (tilde-expand oldname)))) ! 852: (cond ((or (symbolp newname) (stringp newname)) ! 853: (cond (tilde-expansion (setq newname ! 854: (tilde-expand newname)))) ! 855: (cond ((zerop (int:franz-call #.fc_link oldname newname))) ! 856: (t (error "sys:link : unlink failed of " ! 857: oldname newname)))) ! 858: (t (error "sys:unlink : illegal argument " newname)))) ! 859: (t (error "sys:unlink : illegal argument " oldname)))) ! 860: ! 861: ;--- sys:time :: return 'absolute' time in seconds ! 862: ; ! 863: (defun sys:time () ! 864: (int:franz-call #.fc_time)) ! 865: ! 866: ;--- sys:chmod :: change mode of file ! 867: ; return t iff it succeeded. ! 868: ; ! 869: (defun sys:chmod (name mode) ! 870: (cond ((and (or (stringp name) (symbolp name)) ! 871: (fixp mode)) ! 872: (cond (tilde-expansion (setq name (tilde-expand name)))) ! 873: (cond ((zerop (int:franz-call #.fc_chmod name mode))) ! 874: (t (error "sys:chmod : chmod failed of " name)))) ! 875: (t (error "sys:chmod : illegal argument(s): " name mode)))) ! 876: ! 877: (defun sys:getpid () ! 878: (int:franz-call #.fc_getpid)) ! 879: ! 880: (defun filestat (name) ! 881: (let (ret) ! 882: (cond ((or (symbolp name) (stringp name)) ! 883: (cond (tilde-expansion (setq name (tilde-expand name)))) ! 884: (cond ((null (setq ret (int:franz-call #.fc_stat name))) ! 885: (error "filestat : file doesn't exist " name)) ! 886: (t ret))) ! 887: (t (error "filestat : illegal argument " name))))) ! 888: ! 889: ;--- sys:gethostname :: retrieve the current host name as a string ! 890: ; ! 891: (defun sys:gethostname () ! 892: (int:franz-call #.fc_gethostname)) ! 893: ! 894: (defun sleep (seconds) ! 895: ;; (sleep 'x_seconds) ! 896: ;; pause for the given number of seconds ! 897: (cond ((fixp seconds) (int:franz-call #.fc_sleep seconds)) ! 898: (t (error "sleep: non-fixnum argument " seconds)))) ! 899: ! 900: (defun sys:nice (delta-priority) ! 901: ;; modify the priority by the given amount ! 902: (cond ((fixp delta-priority) (int:franz-call #.fc_nice delta-priority)) ! 903: (t (error "sys:nice: non-fixnum argument " delta-priority))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.