mirror of
https://github.com/PDP-10/its.git
synced 2026-02-06 16:44:44 +00:00
259
src/ellen/check.52
Normal file
259
src/ellen/check.52
Normal file
@@ -0,0 +1,259 @@
|
||||
;;; -*- Mode: Lisp; Package: Macsyma -*-
|
||||
;;; Checking functions for PRIMER FASL
|
||||
;;; (c) Copyright 1982 Masssachusetts Institute of Technology
|
||||
|
||||
(macsyma-module check)
|
||||
|
||||
(load-macsyma-macros mrgmac)
|
||||
|
||||
(DECLARE (SPECIAL CLABEL DLABEL $% $LABELS $LINENUM EXAMPLE1
|
||||
PRAC-EXAMPLE1 PRAC-EXAMPLE2 RADCANEXAMPLE)
|
||||
(*EXPR MEVAL STRIPDOLLAR DISPLA MGRIND MAKSTRING MACSYMA RETRIEVE))
|
||||
|
||||
(DEFUN FUNCHKP (A B)
|
||||
(DO X (MREAD) (MREAD) NIL
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., we'll use this one.|)
|
||||
(RETURN (MACSYMA '((MDEFINE) (($F) $X)
|
||||
((MPLUS) ((MTIMES) 2 ((MEXPT) $X 2))
|
||||
((MTIMES) 2 $X) 4)))))
|
||||
((NOT (EQ (CAAR X) (CAR A)))
|
||||
(TERPRI) (PRINC '|Not a function definition, use := .|) NIL)
|
||||
((NOT (EQ (CAAADR X) (CAAR B)))
|
||||
(TERPRI) (PRINC '|Please use |)
|
||||
(PRINC (FULLSTRIP1 (CAAR B)))
|
||||
(PRINC '| as the function name.|) NIL)
|
||||
((NOT (EQ (CADADR X) (CADR B)))
|
||||
(TERPRI) (PRINC '|Please use |)
|
||||
(PRINC (FULLSTRIP1 (CADR B)))
|
||||
(PRINC '| for the variable.|) NIL)
|
||||
(($FREEOF (CADR B) (CADDR X))
|
||||
(TERPRI) (PRINC '|Please use |)
|
||||
(PRINC (FULLSTRIP1 (CADR B)))
|
||||
(PRINC '| in the function itself.|) NIL)
|
||||
(T (RETURN (MPRINEVAL))))
|
||||
(TERPRI) (PRINC '|Try again.|)))
|
||||
|
||||
(DEFUN ASSIGNCHKP (X)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., I'll do it for you.|)
|
||||
(MACSYMA '((MSETQ) $A 3)) 'NOLABEL)
|
||||
((NOT (EQ 'MSETQ (CAAR X)))
|
||||
(TERPRI) (PRINC '|Not an assignment.|) NIL)
|
||||
((NOT (EQ '$A (CADR X)))
|
||||
(TERPRI) (PRINC '|Please use A.|) NIL)
|
||||
((NOT (MNUMP (CADDR X)))
|
||||
(COND ((NOT (EQ 'MMINUS (CAR (CAADDR X))))
|
||||
(TERPRI) (PRINC '|Please assign a number value.|) NIL)
|
||||
(T T)))
|
||||
(T T)))
|
||||
|
||||
|
||||
(DEFUN CHKEXONEP (X)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., I'll do it for you.|)
|
||||
(MACSYMA EXAMPLE1) 'NOLABEL)
|
||||
((ATOM X)
|
||||
(TERPRI) (PRINC '|Oops, you typed the ; too soon.|) NIL)
|
||||
((EQ 'MPLUS (CAAR X))
|
||||
(TERPRI) (PRINC '|The X+1 should be in parentheses.|) NIL)
|
||||
((EQ 'MTIMES (CAAR X))
|
||||
(TERPRI) (PRINC '|Use ^ or two asterisks for exponentiation.|) NIL)
|
||||
((NOT (MNUMP (CADDR X)))
|
||||
(TERPRI) (PRINC '|Use a small positive number for the exponent, please.|) NIL)
|
||||
((AND (MNUMP (CADDR X)) (GREATERP (CADDR X) 6))
|
||||
(TERPRI) (PRINC '|MACSYMA will only expand up to the value|)
|
||||
(TERPRI) (PRINC '|of MAXPOSEX or MAXNEGEX. Their initial|)
|
||||
(TERPRI) (PRINC '|value is 6.|) NIL)
|
||||
((NOT (PALIKE EXAMPLE1 X)) NIL)
|
||||
(T T)))
|
||||
|
||||
(DEFUN POLYCHK (A)
|
||||
((LAMBDA (VAR)
|
||||
(COND ((OR (EQ '$EXIT A) (EQ '$QUIT A)) (PRIMER-EXIT))
|
||||
((EQ '$NO A)
|
||||
(TERPRI) (PRINC '|O.K., we'll use this one.|)
|
||||
(DISPLA (POWER PRAC-EXAMPLE1 2))
|
||||
(MACSYMA (POWER PRAC-EXAMPLE1 2)) 'NOLABEL)
|
||||
((ATOM A)
|
||||
(TERPRI) (PRINC '|That polynomial won't be very interesting.|)
|
||||
(TERPRI) (PRINC '|Let's use |)
|
||||
(DISPLA (POWER PRAC-EXAMPLE1 2))
|
||||
(MACSYMA (POWER PRAC-EXAMPLE1 2)) 'NOLABEL)
|
||||
((MEMQ (CAAR A) '(MPLUS MTIMES))
|
||||
(TERPRI) (PRINC '|Ok, to make that a bit more interesting,|)
|
||||
(TERPRI) (PRINC '|let's square it.|)
|
||||
(MACSYMA (POWER A 2)) 'NOLABEL)
|
||||
((EQ (CAAR A) 'MEXPT)
|
||||
(COND ((ATOM (CADR A))
|
||||
(TERPRI) (PRINC '|That polynomial won't be very interesting.|)
|
||||
(TERPRI) (PRINC '|Let's use |)
|
||||
(DISPLA (POWER PRAC-EXAMPLE1 2))
|
||||
(MACSYMA (POWER PRAC-EXAMPLE1 2)) 'NOLABEL)
|
||||
((FREE (CADR A) VAR)
|
||||
(FREE (CADDR A) VAR))
|
||||
(T (AND (FIXP (CADDR A))
|
||||
(GREATERP (CADDR A) 0.)
|
||||
(POLYP (CADR A))))))
|
||||
((EQ (CAAR A) 'MDEFINE)
|
||||
(TERPRI) (PRINC '|It isn't necessary to define it as a function.|) NIL)
|
||||
((NOT (MEMQ (CAAR A)'(MPLUS MTIMES MEXPT)))
|
||||
(TERPRI) (PRINC '|Oops.|) NIL)
|
||||
(T T))) '$X))
|
||||
|
||||
(DEFUN VALUEP (X)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., I'll do it for you.|)
|
||||
(MACSYMA '(($F) 3)) 'NOLABEL)
|
||||
((NOT (EQ (CAAR X) '$F))
|
||||
(TERPRI) (PRINC '|Oops, wrong function name.|) NIL)
|
||||
((NOT (OR (MMMINUSP (CADR X)) (MNUMP (CADR X))))
|
||||
(TERPRI) (PRINC '|Please use a number for the value.|) NIL)
|
||||
(T T)))
|
||||
|
||||
(DEFUN SUBEXAMPLE1 (X)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K. I'll do it for you.|)
|
||||
(MACSYMA '(($SUBSTITUTE) 1 ((MPLUS) ((MEXPT) ((%SIN) $X) 2)
|
||||
((MEXPT) ((%COS) $X) 2)) $%))
|
||||
'NOLABEL)
|
||||
((ATOM X)
|
||||
(TERPRI) (PRINC '|Oops, you typed the ; too soon.|) NIL)
|
||||
((OR (EQUAL '(($SUBSTITUTE) 1 ((MPLUS) ((MEXPT) ((%SIN) $X) 2)
|
||||
((MEXPT) ((%COS) $X) 2)) $%)
|
||||
X)
|
||||
(EQUAL '(($SUBSTITUTE) ((MPLUS) 1 ((MMINUS)
|
||||
((MEXPT) ((%SIN) $X) 2)))
|
||||
((MEXPT) ((%COS) $X) 2) $%) X)
|
||||
(EQUAL '(($SUBSTITUTE) ((MPLUS) 1 ((MMINUS)
|
||||
((MEXPT) ((%COS) $X) 2)))
|
||||
((MEXPT) ((%SIN) $X) 2) $%) X)))
|
||||
((NOT (EQ '$SUBSTITUTE (CAAR X)))
|
||||
(TERPRI) (PRINC '|That should be SUBST.|) NIL)
|
||||
(T (SUBCHK X))))
|
||||
|
||||
(DEFUN SUBEXAMPLE2 (X)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K. I'll do it for you.|)
|
||||
(MACSYMA '(($RATSUBST) 1 ((MPLUS) ((MEXPT) ((%SIN) $X) 2)
|
||||
((MEXPT) ((%COS) $X) 2)) $%))
|
||||
'NOLABEL)
|
||||
((ATOM X)
|
||||
(TERPRI) (PRINC '|Oops, you typed the ; too soon.|) NIL)
|
||||
((OR (EQUAL '(($RATSUBST) 1 ((MPLUS) ((MEXPT) ((%SIN) $X) 2)
|
||||
((MEXPT) ((%COS) $X) 2)) $%)
|
||||
X)
|
||||
(EQUAL '(($RATSUBST) ((MPLUS) 1 ((MMINUS)
|
||||
((MEXPT) ((%SIN) $X) 2)))
|
||||
((MEXPT) ((%COS) $X) 2) $%) X)
|
||||
(EQUAL '(($RATSUBST) ((MPLUS) 1 ((MMINUS)
|
||||
((MEXPT) ((%COS) $X) 2)))
|
||||
((MEXPT) ((%SIN) $X) 2) $%) X)))
|
||||
((NOT (EQ '$RATSUBST (CAAR X)))
|
||||
(TERPRI) (PRINC '|That should be RATSUBST.|) NIL)
|
||||
(T (SUBCHK X))))
|
||||
|
||||
(DEFUN SUBCHK (X)
|
||||
(COND ((EQUAL 1 (CADR X))
|
||||
(COND ((NOT (EQUAL '((MPLUS) ((MEXPT) ((%SIN) $X) 2)
|
||||
((MEXPT) ((%COS) $X) 2))
|
||||
(CADDR X)))
|
||||
(TERPRI) (PRINC '|The thing you are substituting for |)
|
||||
(TERPRI) (PRINC '|should be SIN(X)^2+COS(X)^2 for this method.|) NIL)
|
||||
(T T)))
|
||||
((EQUAL '((MPLUS) 1 ((MMINUS) ((MEXPT) ((%SIN) $X) 2))) (CADR X))
|
||||
(COND ((NOT (EQUAL '((MEXPT) ((%COS) $X) 2) (CADDR X)))
|
||||
(TERPRI) (PRINC '|The thing you are substituting for |)
|
||||
(TERPRI) (PRINC '|should be COS(X)^2 for this method.|) NIL)
|
||||
(T T)))
|
||||
((EQUAL '((MPLUS) 1 ((MMINUS) ((MEXPT) ((%COS) $X) 2))) (CADR X))
|
||||
(COND ((NOT (EQUAL '((MEXPT) ((%SIN) $X) 2) (CADDR X)))
|
||||
(TERPRI) (PRINC '|The thing you are substituting for |)
|
||||
(TERPRI) (PRINC '|should be SIN(X)^2 for this method.|) NIL)
|
||||
(T T)))
|
||||
((NOT (MEMBER (CADR X)
|
||||
'(1 ((MPLUS) 1 ((MMINUS) ((MEXPT) ((%COS) $X) 2)))
|
||||
((MPLUS) 1 ((MMINUS) ((MEXPT) ((%SIN) $X) 2))) )))
|
||||
(TERPRI) (PRINC '|Use 1, 1-SIN(X)^2, or 1-COS(X)^2 as something|)
|
||||
(TERPRI) (PRINC '|to substitute in.|) NIL)
|
||||
((NOT (EQ (CADDDR X) DLABEL))
|
||||
(TERPRI) (PRINC '|Use % or check your D-line number.|) NIL)
|
||||
(T NIL)))
|
||||
|
||||
(DEFUN CHKRADCAN (X)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K.,I'll do it for you.|)
|
||||
(MACSYMA RADCANEXAMPLE) 'NOLABEL)
|
||||
((ATOM X)
|
||||
(TERPRI) (PRINC '|Oops, you typed the ; too soon.|) NIL)
|
||||
((NOT (ISITIN '%LOG X))
|
||||
(TERPRI) (PRINC '|The word LOG is used just like that.|) NIL)
|
||||
((NOT (PALIKE RADCANEXAMPLE X)) NIL)
|
||||
(T T)))
|
||||
|
||||
(DEFUN PE2CHK (X)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K.,I'll do it for you.|)
|
||||
(MACSYMA PRAC-EXAMPLE2) 'NOLABEL)
|
||||
((ATOM X)
|
||||
(TERPRI) (PRINC '|Oops, you typed the ; too soon.|) NIL)
|
||||
((PALIKE '((MEXPT) ((MPLUS) ((MEXPT) $X 2) 3) ((MMINUS) 1))
|
||||
X))
|
||||
((NOT (PALIKE PRAC-EXAMPLE2 X)) NIL)
|
||||
(T T)))
|
||||
|
||||
(DEFUN DOITYOURSELF (X)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., never mind.|) 'NOLABEL)
|
||||
((NULL X)
|
||||
(TERPRI) (PRINC '|Oops, that wasn't much of an expression.|)
|
||||
(TERPRI) (PRINC CLABEL) NIL)
|
||||
(T T)))
|
||||
|
||||
(DEFUN SYNCHK (FUN PAT)
|
||||
(DO ((X (MREAD) (MREAD))) (NIL)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., I'll show you.|)
|
||||
(DISPLA PAT)
|
||||
(RETURN (MACSYMA PAT)) 'NOLABEL)
|
||||
((SYNCHK2 FUN PAT X) (RETURN (MPRINEVAL)))
|
||||
(T (TERPRI) (PRINC '|Try again.|)))))
|
||||
|
||||
(DEFUN SYNCHK2 (FUN PAT X)
|
||||
(COND ((ATOM X)
|
||||
(COND ((EQ (GETOP (CAR FUN)) X)
|
||||
(TERPRI) (PRINC '|Oops, that was just |)
|
||||
(MGRIND (GETOP (CAR FUN)) NIL)
|
||||
(PRINC '|, try|)
|
||||
(PRINC (FULLSTRIP1 PAT)) NIL)
|
||||
((NUMBERP X)
|
||||
(TERPRI) (PRINC '|Oops, that was just a number, what about |)
|
||||
(MGRIND (GETOP (CAR FUN)) NIL)
|
||||
(PRINC '|/?|) NIL)
|
||||
(T (TERPRI) (PRINC '|Oops, you typed the ; too soon.|))) NIL)
|
||||
((NOT (PALIKE PAT X)) NIL)
|
||||
(T T)))
|
||||
(DEFUN PARTCHK (CMD PAT)
|
||||
(DO ((X (MREAD) (MREAD))) (NIL)
|
||||
(COND ((ATOM X)
|
||||
(TERPRI) (PRINC '|Aw, come on, this is easy.|) NIL)
|
||||
((NOT (EQ CMD (CAAR X)))
|
||||
(COND ((MEMQ (CAR (PLIST (CAAR X))) '(SUBR LSUBR EXPR FEXPR))
|
||||
(TERPRI) (PRINC '|Please use the |)
|
||||
(PRINC (FULLSTRIP1 CMD))
|
||||
(PRINC '| command.|))
|
||||
(T (TERPRI) (PRINC '|Check your spelling.|))) NIL)
|
||||
((EQ '$END (MEVAL X))
|
||||
(TERPRI) (PRINC '|Whoops, that "PART" is off the end of the expression.|) NIL)
|
||||
((PALIKE PAT (MPRINEVAL)) (RETURN T)))
|
||||
(TERPRI) (PRINC '|Try again.|) (TERPRI)))
|
||||
@@ -1,297 +0,0 @@
|
||||
;;;-*-lisp-*-
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;To run this primer interpreted, the following files must be LOADFILED into ;;
|
||||
;;MACSYMA: MRG;MACROS FASL, ELLEN;CHECK >, ELLEN;SCRIPT >, and this file. ;;
|
||||
;;I do not recommend doing that, however. -Ellen ;;
|
||||
;;(C) Copyright 1979, Massachusetts Institute of Technology ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
(DECLARE (SPECIAL CLABEL DLABEL NSP TB LP RP SCRIPTINDEX LISPREADTABLE
|
||||
$% $LABELS $LINENUM $INCHAR $OUTCHAR
|
||||
LINEL GCT $SHOWTIME $LASTTIME)
|
||||
(UNSPECIAL *)
|
||||
(*EXPR MEVAL STRIPDOLLAR DISPLA MGRIND MAKSTRING ADD2LNC RETRIEVE)
|
||||
(*FEXPR $LOADFILE) (FASLOAD MACROS FASL DSK MRG))
|
||||
|
||||
(DECLARE (EVAL (READ)))
|
||||
(SETSYNTAX '/# 'MACRO 'TYI)
|
||||
(SETSYNTAX '/" 'MACRO 'READTEXT)
|
||||
(DEFUN READTEXT ()
|
||||
(LAMBIND ((READTABLE (GET 'PRIMER 'ARRAY)))
|
||||
(DO ((S (READ) (READ)) (NL)) ((EQ '/" S) `(TEXT ',(NREVERSE NL)))
|
||||
(SETQ NL (CONS S NL))
|
||||
(IF (EQ '/@ S)
|
||||
(LAMBIND ((READTABLE LISPREADTABLE)) (SETQ NL (CONS (READ) NL)))))))
|
||||
|
||||
(SETSYNTAX #~ 'MACRO 'NOFILL)
|
||||
(DEFUN NOFILL ()
|
||||
(DO ((C (TYI) (TYI)) (CL))
|
||||
((= #~ C) `(PRINC ',(MAKNAM (NREVERSE CL))))
|
||||
(SETQ CL (CONS C CL))))
|
||||
|
||||
(*ARRAY 'PRIMER 'READTABLE T)
|
||||
(LAMBIND ((READTABLE (GET 'PRIMER 'ARRAY)))
|
||||
(DO I ## (1+ I) (> I #@) (SETSYNTAX I 1 I))
|
||||
(DO I #a (1+ I) (> I #z) (SETSYNTAX I 1 I))
|
||||
(SETSYNTAX #` 'SINGLE #`)
|
||||
(SETSYNTAX #@ 'SINGLE #@)
|
||||
(SETSYNTAX #" 'SINGLE #"))
|
||||
|
||||
(DECLARE (COUTPUT (READ)))
|
||||
(DEFUN IF MACRO (X)
|
||||
(COND ((NULL (CDDDR X)) `(COND (,(CADR X) ,(CADDR X))))
|
||||
(T `(COND (,(CADR X) ,(CADDR X)) (T . ,(CDDDR X))))))
|
||||
|
||||
(SETQ LISPREADTABLE READTABLE
|
||||
SCRIPTINDEX '(($INTRO (SCRIPT INTRO DSK ELLEN)(CHECK FASL DSK ELLEN))
|
||||
($CONSOLEPRIMER (SCRIPT INTRO DSK ELLEN)
|
||||
(CHECK FASL DSK ELLEN))
|
||||
($HELP (SCRIPT INTRO DSK ELLEN)(CHECK FASL DSK ELLEN))
|
||||
($SYNTAX (SCRIPT INTRO DSK ELLEN)(CHECK FASL DSK ELLEN))
|
||||
($SIMPLIFICATION (SCRIPT INTRO DSK ELLEN)
|
||||
(CHECK FASL DSK ELLEN))
|
||||
($SCRATCHPAD (SCRIPT INTRO DSK ELLEN)
|
||||
(CHECK FASL DSK ELLEN))
|
||||
($ASSIGNMENT (SCRIPT AUX DSK ELLEN)
|
||||
(CHECK FASL DSK ELLEN))
|
||||
($FILING (SCRIPT AUX DSK ELLEN)
|
||||
(CHECK FASL DSK ELLEN))
|
||||
($STRINGCOMMANDS (SCRIPT AUX DSK ELLEN)
|
||||
(CHECK FASL DSK ELLEN))
|
||||
($MATRICES (SCRIPT MATRIX DSK ELLEN)
|
||||
(CHECK FASL DSK ELLEN))
|
||||
($SHARE (SHARE SCRIPT DSK ELLEN))
|
||||
($ABSIMP (SHARE SCRIPT DSK ELLEN))
|
||||
($ROMBER (SHARE SCRIPT DSK ELLEN))
|
||||
($FFT (SHARE SCRIPT DSK ELLEN))
|
||||
($DESOLN (SHARE SCRIPT DSK ELLEN))
|
||||
($UNITS (SHARE SCRIPT DSK ELLEN))
|
||||
($ARRAY (SHARE SCRIPT DSK ELLEN))
|
||||
($DIMEN (SHARE SCRIPT DSK ELLEN))
|
||||
($DUMP (SHARE SCRIPT DSK ELLEN))
|
||||
($FACT (SHARE SCRIPT DSK ELLEN))
|
||||
($INTPOL (SHARE SCRIPT DSK ELLEN))
|
||||
($MATCH (MATCH SCRIPT DSK MRG))))
|
||||
|
||||
|
||||
(DEFUN $PRIMER FEXPR (X)
|
||||
(SETQ X (COND (X (CAR X))
|
||||
((SEENP (STATUS UNAME) '$CONSOLEPRIMER) '$HELP)
|
||||
(T '$CONSOLEPRIMER)))
|
||||
(*CATCH 'PQUIT (SCRIPT X T))
|
||||
'$DONE)
|
||||
|
||||
(DEFUN SEENP (USER SC)
|
||||
(PROGB (IN)
|
||||
(SETQ IN (OPEN '(USER PROFIL DSK ALJABR) 'IN))
|
||||
(DO ((U (READ IN 'EOF) (READ IN 'EOF))) ((EQ U 'EOF) (CLOSE IN) NIL)
|
||||
(COND ((EQ USER (CAR U)) (CLOSE IN) (RETURN (MEMQ SC (CDR U))))))))
|
||||
|
||||
(DEFUN SEEN (USER SC)
|
||||
(PROGB (IN OUT)
|
||||
(SETQ IN (OPEN '(USER PROFIL DSK ALJABR) 'IN)
|
||||
OUT (OPEN '(USER PROFIL DSK ALJABR) 'OUT))
|
||||
(DO ((U (READ IN NIL) (READ IN NIL)) (SUCCESS))
|
||||
((NULL U) (IFN SUCCESS (PRINT (LIST USER SC) OUT)))
|
||||
(IFN (EQ USER (CAR U)) T (SETQ SUCCESS T) (RPLACD U (CONS SC (CDR U))))
|
||||
(PRINT U OUT))
|
||||
(CLOSE IN) (CLOSE OUT)))
|
||||
|
||||
(DEFUN SCRIPT (SC TOP)
|
||||
(SETQ SC (GETSCRIPT SC TOP))
|
||||
(*CATCH 'EXIT (DO () ((NULL SC)) (TERPRI) (EVAL (CAR SC))
|
||||
(SETQ SC (CDR SC)))))
|
||||
|
||||
(DEFUN GETSCRIPT (SC TOP)
|
||||
(PROGB (*)
|
||||
(COND ((GET SC 'SCRIPT))
|
||||
((AND (SETQ * (CDR (ASSQ SC SCRIPTINDEX)))
|
||||
(DO ((L * (CDR L))) ((NULL L) T)
|
||||
(APPLY '$LOADFILE (CAR L)))
|
||||
(GET SC 'SCRIPT)))
|
||||
(T (TERPRI) (PRINC '|No such script.|) (COND (TOP (ERR)))))))
|
||||
|
||||
(DEFUN TEXT (L)
|
||||
(TERPRI) (TYO TB)
|
||||
(DO ((X) (W) (WD 8)) ((NULL L)) (DECLARE (FIXNUM W WD))
|
||||
(IF (NOT (EQ '/@ (CAR L))) (SETQ X (CAR L) W (FLATC X))
|
||||
(SETQ L (CDR L) X (STRGRIND (EVAL (CAR L))) W (LENGTH X)))
|
||||
(COND ((>= (+ 3 W WD) LINEL) (TERPRI) (SETQ WD 0)))
|
||||
(IF (ATOM X) (PRINC X) (MAPC 'TYO X)) (TYO NSP)
|
||||
(SETQ L (CDR L) WD (+ 1 W WD))))
|
||||
|
||||
|
||||
(DEFUN EXIT () (*THROW 'EXIT NIL))
|
||||
(DEFUN PQUIT () (*THROW 'PQUIT NIL))
|
||||
|
||||
|
||||
(DEFUN YESORNO ()
|
||||
(TERPRI)
|
||||
(DO ANS (RETRIEVE NIL NIL) (RETRIEVE NIL NIL) NIL
|
||||
(COND ((MEMQ ANS '($YES $YEP $YEAH $Y $YUP $SURE $OK $T)) (RETURN T))
|
||||
((MEMQ ANS '($NO $N $NOPE $NIL)) (RETURN NIL))
|
||||
(T (PRINC '|Was that a YES or a NO?|)
|
||||
(TERPRI)))))
|
||||
|
||||
(DEFUN MREAD ()
|
||||
(SETQ CLABEL (MAKLABEL $INCHAR $LINENUM)) (ADD2LNC CLABEL $LABELS)
|
||||
(TERPRI) (PRLABEL CLABEL) (SET CLABEL (RETRIEVE NIL NIL)))
|
||||
|
||||
(DEFUN MPRINEVAL ()
|
||||
(PROGB (TIME)
|
||||
(SETQ TIME (RUNTIME) GCT (STATUS GCTIME) $% (MEVAL (EVAL CLABEL)))
|
||||
(SETQ DLABEL (MAKLABEL $OUTCHAR $LINENUM)) (ADD2LNC DLABEL $LABELS)
|
||||
(DISPLA `((MLABLE) ,DLABEL ,(SET DLABEL $%)))
|
||||
(SETQ $LASTTIME (LIST '(MLIST SIMP)
|
||||
(COMPUTIME (RUNTIME) TIME)
|
||||
(COMPUTIME (STATUS GCTIME) GCT)))
|
||||
(COND ($SHOWTIME (IF (NOT (ZEROP (CHARPOS T))) (TERPRI))
|
||||
(PRINC '|time=|) (PRINC (CADR $LASTTIME)) (PRINC '| msec.|)
|
||||
(TERPRI)))
|
||||
(SETQ $LINENUM (1+ $LINENUM))
|
||||
$%))
|
||||
|
||||
(DEFUN MACSYMA (FORM)
|
||||
(SETQ CLABEL (MAKLABEL $INCHAR $LINENUM)) (ADD2LNC CLABEL $LABELS)
|
||||
(TERPRI) (PRLABEL CLABEL) (MAPC 'PRINC (MAKSTRING FORM)) (TYO #;)
|
||||
(SET CLABEL FORM) (MPRINEVAL))
|
||||
|
||||
(DEFUN MAKLABEL (C N) (IMPLODE (NCONC (EXPLODEN C) (EXPLODEN N))))
|
||||
|
||||
(DEFUN PRLABEL (L) (PRINC '|(|) (PRINC (STRIPDOLLAR L)) (PRINC '|) |))
|
||||
|
||||
(DEFUN CLINE (X)
|
||||
(TERPRI)
|
||||
(TYO TB)
|
||||
(MGRIND X T)) ;MGRIND take OUTPUT file as 2nd arg -- RWK
|
||||
|
||||
|
||||
(DEFUN CENTER (X) (DISPLA (LIST '(MLABLE) NIL X)))
|
||||
|
||||
|
||||
|
||||
(DEFUN DEFSCRIPT FEXPR (F) (PUT (CAR F) (CDR F) 'SCRIPT) (CAR F))
|
||||
|
||||
(DEFUN MACSYM ()
|
||||
(DO ((X)) ((NOT (ATOM X)) (CAR X))
|
||||
(MREAD) (SETQ X (ERRSET (MPRINEVAL)))))
|
||||
|
||||
(DEFUN INCHK (PAT)
|
||||
(DO ((X (MREAD) (MREAD))) (NIL)
|
||||
(COND ((OR (EQ '$EXIT X)(EQ '$QUIT X))
|
||||
(EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., I'll do it for you.|)
|
||||
(RETURN (MACSYMA PAT)))
|
||||
((PALIKE PAT X) (RETURN (MPRINEVAL)))
|
||||
(T (TERPRI) (PRINC '|Try again.|) (TERPRI)))))
|
||||
|
||||
(DEFUN OUTCHK (PAT)
|
||||
(DO X (MACSYM) (MACSYM) (PALIKE PAT X)
|
||||
(TERPRI) (PRINC '|Try again.|) (TERPRI)))
|
||||
|
||||
|
||||
(DEFUN INCHKP (P)
|
||||
(DO ((X (MREAD) (MREAD))(Y)) (NIL)
|
||||
(IF (SETQ Y (FUNCALL P X)) (RETURN (COND ((NOT (EQ Y 'NOLABEL))
|
||||
(MPRINEVAL))))
|
||||
(TERPRI) (PRINC '|Try again.|))))
|
||||
|
||||
(DEFUN OUTCHK2 (PRED)
|
||||
(DO X (MACSYM)(MACSYM)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (EXIT))
|
||||
((EQ '$NO X))
|
||||
((FUNCALL PRED X)))
|
||||
(TERPRI) (PRINC '|Try again.|) (TERPRI)))
|
||||
|
||||
(DEFUN PALIKE (PAT X)
|
||||
(COND ((EQ PAT X))
|
||||
((EQ 'DLABEL PAT) (PALIKE DLABEL X))
|
||||
((ATOM PAT) (AND (ATOM X) (EQUAL (MEVAL PAT) (MEVAL X))))
|
||||
((ATOM X) NIL)
|
||||
((EQ (CAAR PAT) (CAAR X))
|
||||
(SETQ PAT (CDR PAT) X (CDR X))
|
||||
(DO () ((NOT (PALIKE (CAR PAT) (CAR X))))
|
||||
(COND ((NULL PAT) (IF (NULL X) (RETURN T)))
|
||||
((NULL X) (RETURN NIL))
|
||||
(T (SETQ PAT (CDR PAT) X (CDR X))))))))
|
||||
|
||||
(DEFUN DECODE (X L)
|
||||
(COND ((NOT (EQ (TYPEP X) 'FIXNUM)) (NOR-ERR))
|
||||
((OR (NOT (> X 0)) (> X (LENGTH L))) (NOR-ERR))
|
||||
((SETQ X (NTHCDR (1- X) L)) (CAR X))
|
||||
(T (NOR-ERR))))
|
||||
|
||||
(DEFUN SPELLCHECK (X L)
|
||||
(COND ((NOT (ISITIN X L)) (SPELL-ERR))
|
||||
(T X)))
|
||||
|
||||
(DEFUN MENU (OPTS)
|
||||
(DO ((L OPTS (CDR L)) (I 1 (1+ I))) ((NULL L))
|
||||
(PRINC I) (PRINC '| - |) (PRINC (FULLSTRIP1 (CAR L)))
|
||||
(COND ((GET (CAR L) 'KIND) (TYO NSP) (PRINC (GET (CAR L) 'KIND))))
|
||||
(TERPRI)))
|
||||
|
||||
(DEFUN SPELL-ERR () (PRINC '|No such script. Try again.|) (TERPRI))
|
||||
(DEFUN OPT-ERR () (PRINC '|Illegal command to OPTIONS|) (TERPRI))
|
||||
(DEFUN NOR-ERR () (PRINC '|Number out of range|) (TERPRI))
|
||||
|
||||
|
||||
(DEFUN SELECT (L) (IF (EQ '$EXIT (SETQ L (SELECT1 L))) (PQUIT) (SCRIPT L NIL)))
|
||||
|
||||
(DEFUN SELECT1 (L)
|
||||
(DO ((ANS)) (NIL)
|
||||
(MENU L)
|
||||
(SETQ ANS (RETRIEVE NIL NIL))
|
||||
(COND ((FIXP ANS) (IF (SETQ ANS (DECODE ANS L)) (RETURN ANS)))
|
||||
((ATOM ANS) (IF (SETQ ANS (SPELLCHECK ANS L))(RETURN ANS))))))
|
||||
|
||||
(DEFUN CMDCHKP (CMD)
|
||||
(DO ((X (MREAD) (MREAD))) (NIL)
|
||||
(COND ((OR (EQ '$EXIT X)(EQ '$QUIT X))
|
||||
(EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., I'll do it for you.|)
|
||||
(RETURN (MACSYMA CMD)))
|
||||
((CMDCHKP2 CMD X)(RETURN (MPRINEVAL)))
|
||||
(T (TERPRI) (PRINC '|Try again.|)))))
|
||||
|
||||
|
||||
(DEFUN CMDCHKP2 (C D)
|
||||
(COND ((ATOM D)
|
||||
(TERPRI) (PRINC '|Oops, you typed the ; too soon.|) NIL)
|
||||
((NOT (EQ (CAAR C)(CAAR D)))
|
||||
(CMDCHKP3 (CAAR D)(CAAR C)) NIL)
|
||||
((EQ '$% (CADR D)))
|
||||
((NOT (EQUAL (CADR C)(CADR D)))
|
||||
(TERPRI) (PRINC '|Use |)
|
||||
(PRINC (FULLSTRIP1 (CADR C))) NIL)
|
||||
((NOT (PALIKE C D)) NIL)
|
||||
(T T)))
|
||||
|
||||
|
||||
(DEFUN CMDCHKP3 (E C)
|
||||
(COND ((MEMQ (CAR (PLIST E)) '(SUBR LSUBR EXPR FEXPR))
|
||||
(TERPRI)(PRINC '|Please use the |)
|
||||
(PRINC (FULLSTRIP1 C))
|
||||
(PRINC '| command.|))
|
||||
(T (TERPRI) (PRINC '|Check your spelling.|))))
|
||||
|
||||
(DEFUN INOUTCHK (CMD PAT)
|
||||
(DO ((X (MREAD) (MREAD))) (NIL)
|
||||
(COND ((ATOM X)
|
||||
(TERPRI) (PRINC '|Aw, come on, this is easy.|) NIL)
|
||||
((NOT (EQ CMD (CAAR X)))
|
||||
(COND ((MEMQ (CAR (PLIST (CAAR X))) '(SUBR LSUBR EXPR FEXPR))
|
||||
(TERPRI)(PRINC '|Please use the |)
|
||||
(PRINC (FULLSTRIP1 CMD))
|
||||
(PRINC '| command.|))
|
||||
(T (TERPRI) (PRINC '|Check your spelling.|))) NIL)
|
||||
((PALIKE PAT (MPRINEVAL))(RETURN T)))
|
||||
(TERPRI) (PRINC '|Try again.|)(TERPRI)))
|
||||
|
||||
(DEFUN ISITIN (A L)
|
||||
(COND ((ATOM L) (EQ A L))
|
||||
(T (DO () ((NULL L) NIL)
|
||||
(COND ((ISITIN A (CAR L)) (RETURN T))
|
||||
(T (SETQ L (CDR L))))))))
|
||||
|
||||
481
src/ellen/primer.239
Normal file
481
src/ellen/primer.239
Normal file
@@ -0,0 +1,481 @@
|
||||
;; -*- Mode: Lisp; Package: Macsyma; -*-
|
||||
|
||||
;; (c) Copyright 1976, 1984 Massachusetts Institute of Technology
|
||||
;; All Rights Reserved.
|
||||
|
||||
;; Enhancements (c) Copyright 1984 Symbolics Inc.
|
||||
;; All Rights Reserved.
|
||||
|
||||
;; The data and information in the Enhancements are proprietary to, and
|
||||
;; a valuable trade secret of, SYMBOLICS, INC., a Delaware corporation.
|
||||
;; They are given in confidence by SYMBOLICS, pursuant to the license
|
||||
;; agreement between Symbolics and their recipient, and may not be used,
|
||||
;; reproduced, or copied, or distributed to any other party, in whole or
|
||||
;; in part, without the prior written consent of SYMBOLICS except as
|
||||
;; permitted by the license agreement.
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;To run this primer interpreted, the following files must be LOADFILED into ;;
|
||||
;;MACSYMA: ELLEN;CHECK >, ELLEN;SCRIPT >, and this file. ;;
|
||||
;;I do not recommend doing that, however. -Ellen ;;
|
||||
;;(C) Copyright 1983, Massachusetts Institute of Technology ;;
|
||||
;; Enhancements (c) 1983, Symbolics, Inc. All Rights Reserved.
|
||||
;; The data and information in the Enhancements is proprietary
|
||||
;; to, and a valuable trade secret of, SYMBOLICS, INC., a
|
||||
;; Delaware corporation. It is given in confidence by
|
||||
;; SYMBOLICS, and may not be used as the basis of manufacture,
|
||||
;; or be reproduced or copied, or distributed to any other
|
||||
;; party, in whole or in part, without the prior written
|
||||
;; consent of SYMBOLICS.
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(macsyma-module primer)
|
||||
|
||||
(load-macsyma-macros mrgmac)
|
||||
|
||||
(DECLARE (SPECIAL CLABEL DLABEL $% $LABELS $LINENUM $INCHAR $OUTCHAR
|
||||
LINEL GCT $SHOWTIME $LASTTIME $LOADPRINT $DYNAMALLOC)
|
||||
(UNSPECIAL *)
|
||||
(special readtable)
|
||||
(*EXPR MEVAL STRIPDOLLAR DISPLA MGRIND MAKSTRING ADD2LNC RETRIEVE)
|
||||
)
|
||||
|
||||
;; The primer works by interpreting script files at runtime, and a special
|
||||
;; syntax is used for parsing them. Part of it is kept in the primer
|
||||
;; readtable, and some is done via readmacro characters. The macro characters
|
||||
;; will clobber the global Macsyma syntax, so don't expect to debug anything
|
||||
;; with the primer loaded. We wouldn't lose so badly if macro characters were
|
||||
;; per-readtable.
|
||||
|
||||
(DEFVAR LISP-READTABLE READTABLE)
|
||||
(DEFVAR PRIMER-READTABLE #-Franz (*ARRAY NIL 'READTABLE T)
|
||||
#+Franz (makereadtable nil))
|
||||
#+Franz
|
||||
(defvar vaxima-scr-dir (concat vaxima-main-dir "//ellen//"))
|
||||
|
||||
;; Text in a DEFSCRIPT form is parsed using the Lisp READ function, and is
|
||||
;; enclosed in double quotes. An @ inside the string allows an evaluation of a
|
||||
;; Lisp form at run time. Character translation is turned off and words are
|
||||
;; read as symbols. A string of text is read as a list of symbols.
|
||||
;; This is done to permit run-time justification of text to the
|
||||
;; appropriate console width.
|
||||
|
||||
#-Franz
|
||||
(SETSYNTAX #/" 'MACRO 'READTEXT)
|
||||
(DEFUN READTEXT ()
|
||||
(LET ((READTABLE PRIMER-READTABLE))
|
||||
#+Franz (sstatus uctolc nil)
|
||||
(DO ((S (READ) (READ)) (NL))
|
||||
((EQ '/" S)
|
||||
#+Franz (sstatus uctolc t)
|
||||
`(TEXT ',(NREVERSE NL)))
|
||||
(PUSH S NL)
|
||||
(IF (EQ '/@ S)
|
||||
(LET ((READTABLE LISP-READTABLE))
|
||||
#+Franz (sstatus uctolc t)
|
||||
(PUSH (READ) NL)
|
||||
#+Franz (sstatus uctolc nil))))))
|
||||
|
||||
;; Why is ` a single character object?
|
||||
|
||||
#-Franz
|
||||
(LET ((READTABLE PRIMER-READTABLE))
|
||||
(DO I #/# (1+ I) (> I #/@) (SETSYNTAX I 1 I))
|
||||
(DO I #/a (1+ I) (> I #/z) (SETSYNTAX I 1 I))
|
||||
(SETSYNTAX #/` 'SINGLE #/`)
|
||||
(SETSYNTAX #/@ 'SINGLE #/@)
|
||||
(SETSYNTAX #/" 'SINGLE #/"))
|
||||
|
||||
#+Franz
|
||||
(LET ((READTABLE PRIMER-READTABLE))
|
||||
(DO I #/# (1+ I) (> I #/@) (SETSYNTAX I 'vcharacter))
|
||||
(setsyntax #/` 'vsingle-character-symbol)
|
||||
(setsyntax #/@ 'vsingle-character-symbol)
|
||||
(setsyntax #/" 'vsingle-character-symbol))
|
||||
|
||||
;; This is for pieces of text which aren't supposed to be justified, i.e.
|
||||
;; no-fill mode. Text bracketed with ~'s rather than "'s gets printed
|
||||
;; directly. Newlines are printed between entries in a script.
|
||||
|
||||
#-Franz
|
||||
(SETSYNTAX #/~ 'MACRO 'NOFILL)
|
||||
(DEFUN NOFILL ()
|
||||
(DO ((C (TYI) (TYI)) (CL))
|
||||
((= #/~ C) `(PRINC ',(MAKNAM (NREVERSE CL))))
|
||||
(SETQ CL (CONS C CL))))
|
||||
|
||||
;; This associates a given script with the file it is found in
|
||||
;; and other files it needs to run. On bigger systems, just load
|
||||
;; the scripts in when the primer file is loaded.
|
||||
|
||||
#-Franz
|
||||
(DEFVAR SCRIPTINDEX '(($INTRO (SCRIPT INTRO DSK MACSYM)(CHECK FASL DSK MACSYM))
|
||||
($CONSOLEPRIMER (SCRIPT BEGIN DSK MACSYM)
|
||||
(CHECK FASL DSK MACSYM))
|
||||
($HELP (SCRIPT INTRO DSK MACSYM)(CHECK FASL DSK MACSYM))
|
||||
($SYNTAX (SCRIPT INTRO DSK MACSYM)(CHECK FASL DSK MACSYM))
|
||||
($SIMPLIFICATION (SCRIPT INTRO DSK MACSYM)
|
||||
(CHECK FASL DSK MACSYM))
|
||||
($SCRATCHPAD (SCRIPT INTRO DSK MACSYM)
|
||||
(CHECK FASL DSK MACSYM))
|
||||
($ASSIGNMENT (SCRIPT AUX DSK MACSYM)
|
||||
(CHECK FASL DSK MACSYM))
|
||||
($FILING (SCRIPT AUX DSK MACSYM)
|
||||
(CHECK FASL DSK MACSYM))
|
||||
($STRINGCOMMANDS (SCRIPT AUX DSK MACSYM)
|
||||
(CHECK FASL DSK MACSYM))
|
||||
($MATRICES (SCRIPT MATRIX DSK MACSYM)
|
||||
(CHECK FASL DSK MACSYM))
|
||||
($SHARE (SHARE SCRIPT DSK MACSYM))
|
||||
($ABSIMP (SHARE SCRIPT DSK MACSYM))
|
||||
($ROMBER (SHARE SCRIPT DSK MACSYM))
|
||||
($FFT (SHARE SCRIPT DSK MACSYM))
|
||||
($DESOLN (SHARE SCRIPT DSK MACSYM))
|
||||
($UNITS (SHARE SCRIPT DSK MACSYM))
|
||||
($ARRAY (SHARE SCRIPT DSK MACSYM))
|
||||
($DIMEN (SHARE SCRIPT DSK MACSYM))
|
||||
($DUMP (SHARE SCRIPT DSK MACSYM))
|
||||
($FACT (SHARE SCRIPT DSK MACSYM))
|
||||
($INTPOL (SHARE SCRIPT DSK MACSYM))
|
||||
))
|
||||
#+Franz
|
||||
(defvar scriptindex '(($intro intro)
|
||||
($franzprimer begin)
|
||||
($help intro)
|
||||
($syntax intro)
|
||||
($simplification intro)
|
||||
($scratchpad intro)
|
||||
($assignment aux)
|
||||
($filing aux)
|
||||
($stringcommands aux)
|
||||
($matrices matrix)))
|
||||
|
||||
;; The top-level function. If this is the first time a user has run a script,
|
||||
;; he/she is given the "console primer" and the fact that the console primer
|
||||
;; has been seen is kept in a file. When the primer is run later by the same
|
||||
;; user, the "help" script is run instead. Alternately, a script can be
|
||||
;; specified by giving this function an argument.
|
||||
#-Franz
|
||||
(DEFMSPEC $PRIMER (X) (SETQ X (CDR X))
|
||||
(LET (($LOADPRINT T) ($DYNAMALLOC T))
|
||||
(SETQ X (COND (X (CAR X))
|
||||
((SEENP (STATUS UNAME) '$CONSOLEPRIMER) '$HELP)
|
||||
(T '$CONSOLEPRIMER)))
|
||||
(*CATCH 'PQUIT (SCRIPT X T))
|
||||
'$DONE))
|
||||
|
||||
#+Franz
|
||||
(defmspec $primer (x)
|
||||
(let ((quotsyn (getsyntax '/"))
|
||||
(tildsyn (getsyntax '/~))
|
||||
($loadprint t))
|
||||
(setq x (cdr x)) ; remove (mlist)
|
||||
(unwind-protect
|
||||
(progn (setsyntax #/" 'macro 'readtext)
|
||||
(setsyntax #/~ 'macro 'nofill)
|
||||
(setq x (cond (x (car x))
|
||||
((seenp (sys-user-id) '$franzprimer) '$help)
|
||||
(t '$franzprimer)))
|
||||
(*catch 'pquit (script x t))
|
||||
'$done)
|
||||
(progn (setsyntax #/" quotsyn)
|
||||
(setsyntax #/~ tildsyn)))))
|
||||
|
||||
;; These manipulate the user profile data base.
|
||||
#+Franz
|
||||
(defun seenp (user sc)
|
||||
(let ((in (concat vaxima-main-dir "//aljabr//user.pro")) res u)
|
||||
(if (not (probef in))
|
||||
(merror "user.pro file does not exist. please send a bug
|
||||
note."))
|
||||
(if
|
||||
(null (setq res (errset
|
||||
(progn
|
||||
(setq in (infile in))
|
||||
(setq u (read in nil))
|
||||
(close in)
|
||||
(do ((v u (cdr v)))
|
||||
((null v) nil)
|
||||
(cond ((eq user (caar v))
|
||||
(return (memq sc (cdar v))))))))))
|
||||
(merror "error while processing user.pro file.
|
||||
Please send a bug note."))
|
||||
(car res)))
|
||||
|
||||
#+Franz
|
||||
(defun seen (user sc)
|
||||
(let (in out u
|
||||
(profilefile (concat vaxima-main-dir "//aljabr//user.pro")))
|
||||
(if (not (probef profilefile))
|
||||
(merror "user.pro file does not exist. please send a bug note."))
|
||||
(if
|
||||
(null (errset
|
||||
(progn
|
||||
(setq in (infile profilefile))
|
||||
(setq u (read in nil))
|
||||
(close in)
|
||||
(do ((v u (cdr v)))
|
||||
((null v)
|
||||
(setq u (cons (list user sc) u)))
|
||||
(if (eq user (caar v))
|
||||
(return (rplacd (car v) (cons sc (cdar v))))))
|
||||
(setq out (outfile profilefile))
|
||||
(print u out)
|
||||
(close out))))
|
||||
(merror "error while processing user.pro file.
|
||||
Please send a bug note."))))
|
||||
|
||||
|
||||
#-Franz
|
||||
(DEFUN SEENP (USER SC)
|
||||
(LET ((IN '((DSK MACSYM) USER PROFIL)) RES)
|
||||
(IF (NOT (PROBEF IN))
|
||||
(MERROR "USER PROFIL file does not exist. Please send a bug
|
||||
note."))
|
||||
(IF
|
||||
(NULL (SETQ RES (ERRSET
|
||||
(PROG2
|
||||
(SETQ IN (OPEN IN 'IN))
|
||||
(DO ((U (READ IN 'EOF) (READ IN 'EOF)))
|
||||
((EQ U 'EOF) (CLOSE IN) NIL)
|
||||
(COND ((EQ USER (CAR U))
|
||||
(CLOSE IN) (RETURN (MEMQ SC (CDR U))))))))))
|
||||
(MERROR "Error while processing USER PROFIL file.
|
||||
Please send a bug note."))
|
||||
(CAR RES)))
|
||||
|
||||
#-Franz
|
||||
(DEFUN SEEN (USER SC)
|
||||
(LET (IN OUT)
|
||||
(IF (NOT (PROBEF '(USER PROFIL DSK MACSYM)))
|
||||
(MERROR "USER PROFIL file does not exist. Please send a bug note."))
|
||||
(IF
|
||||
(NULL (ERRSET
|
||||
(PROGN
|
||||
(SETQ IN (OPEN '(USER PROFIL DSK MACSYM) 'IN)
|
||||
OUT (OPEN '(USER PROFIL DSK MACSYM) 'OUT))
|
||||
(DO ((U (READ IN NIL) (READ IN NIL)) (SUCCESS))
|
||||
((NULL U) (IFN SUCCESS (PRINT (LIST USER SC) OUT)))
|
||||
(IFN (EQ USER (CAR U)) T (SETQ SUCCESS T)
|
||||
(RPLACD U (CONS SC (CDR U))))
|
||||
(PRINT U OUT))
|
||||
(CLOSE IN) (CLOSE OUT))))
|
||||
(MERROR "Error while processing USER PROFIL file.
|
||||
Please send a bug note."))))
|
||||
|
||||
;; The script interpreter. The first argument to this function is the
|
||||
;; symbol naming the script.
|
||||
|
||||
(DEFUN SCRIPT (SC TOP)
|
||||
(SETQ SC (GETSCRIPT SC TOP))
|
||||
(*CATCH 'EXIT (DO () ((NULL SC)) (TERPRI) (EVAL (CAR SC))
|
||||
(SETQ SC (CDR SC)))))
|
||||
|
||||
(DEFUN GETSCRIPT (SC TOP)
|
||||
(LET (*)
|
||||
(COND ((GET SC 'SCRIPT))
|
||||
((AND (SETQ * (CDR (ASSQ SC SCRIPTINDEX)))
|
||||
(DO ((L * (CDR L))) ((NULL L) T)
|
||||
#-Franz ($LOAD (NAMESTRING (CAR L)))
|
||||
#+Franz ($load (concat vaxima-scr-dir (car l))))
|
||||
(GET SC 'SCRIPT)))
|
||||
(T (IF TOP
|
||||
(MERROR "No such script.")
|
||||
(MTELL "~%No such script."))
|
||||
))))
|
||||
|
||||
(DEFUN TEXT (L)
|
||||
#-Franz(TERPRI)
|
||||
(TYO #\TAB)
|
||||
(DO ((X) (W) (WD 8)) ((NULL L)) (DECLARE (FIXNUM W WD))
|
||||
(IF (NOT (EQ '/@ (CAR L))) (SETQ X (CAR L) W (FLATC X))
|
||||
(SETQ L (CDR L) X (STRGRIND (EVAL (CAR L))) W (LENGTH X)))
|
||||
(COND ((>= (+ 3 W WD) LINEL) (TERPRI) (SETQ WD 0)))
|
||||
(IF (ATOM X) (PRINC X) (MAPC 'TYO X)) (TYO #\SP)
|
||||
(SETQ L (CDR L) WD (+ 1 W WD))))
|
||||
|
||||
(DEFUN PRIMER-EXIT () (*THROW 'EXIT NIL))
|
||||
(DEFUN PQUIT () (*THROW 'PQUIT NIL))
|
||||
|
||||
|
||||
(DEFUN YESORNO ()
|
||||
(TERPRI)
|
||||
(DO ANS (RETRIEVE NIL NIL) (RETRIEVE NIL NIL) NIL
|
||||
(COND ((MEMQ ANS '($YES $YEP $YEAH $Y $YUP $SURE $OK $T)) (RETURN T))
|
||||
((MEMQ ANS '($NO $N $NOPE $NIL)) (RETURN NIL))
|
||||
(T (PRINC '|Was that a YES or a NO?|)
|
||||
(TERPRI)))))
|
||||
|
||||
(DEFUN MREAD ()
|
||||
(SETQ CLABEL (MAKLABEL $INCHAR $LINENUM)) (ADD2LNC CLABEL $LABELS)
|
||||
(TERPRI) (PRLABEL CLABEL) (SET CLABEL (RETRIEVE NIL NIL)))
|
||||
|
||||
(DEFUN MPRINEVAL ()
|
||||
(LET (TIME)
|
||||
(SETQ TIME (RUNTIME) GCT (SYS-GCTIME) $% (MEVAL (EVAL CLABEL)))
|
||||
(SETQ DLABEL (MAKLABEL $OUTCHAR $LINENUM)) (ADD2LNC DLABEL $LABELS)
|
||||
(DISPLA `((MLABLE) ,DLABEL ,(SET DLABEL $%)))
|
||||
(SETQ $LASTTIME (LIST '(MLIST SIMP)
|
||||
(COMPUTIME (RUNTIME) TIME)
|
||||
(COMPUTIME (SYS-GCTIME) GCT)))
|
||||
(COND ($SHOWTIME (IF (NOT (ZEROP (CHARPOS T))) (TERPRI))
|
||||
(PRINC '|time=|) (PRINC (CADR $LASTTIME)) (PRINC '| msec.|)
|
||||
(TERPRI)))
|
||||
(SETQ $LINENUM (1+ $LINENUM))
|
||||
$%))
|
||||
|
||||
(DEFUN MACSYMA (FORM)
|
||||
(SETQ CLABEL (MAKLABEL $INCHAR $LINENUM)) (ADD2LNC CLABEL $LABELS)
|
||||
(TERPRI) (PRLABEL CLABEL) (MAPC 'PRINC (MAKSTRING FORM)) (TYO #/;)
|
||||
(SET CLABEL FORM)
|
||||
#+Franz (terpri)
|
||||
(MPRINEVAL))
|
||||
|
||||
(DEFUN MAKLABEL (C N) #-LISPM (IMPLODE (NCONC (EXPLODEN C) (EXPLODEN N)))
|
||||
#+LISPM (STRING-APPEND C N))
|
||||
|
||||
(DEFUN PRLABEL (L) (PRINC '|(|) (PRINC (STRIPDOLLAR L)) (PRINC '|) |))
|
||||
|
||||
;; This function is used in scripts. It will have to be changed before this
|
||||
;; function is moved to Multics since it is a system function there.
|
||||
|
||||
(DEFUN PCLINE (X)
|
||||
(TERPRI)
|
||||
(TYO #\TAB)
|
||||
(MGRIND X T)) ;MGRIND take OUTPUT file as 2nd arg -- RWK
|
||||
|
||||
|
||||
(DEFUN CENTER (X) (DISPLA (LIST '(MLABLE) NIL X)))
|
||||
|
||||
;; A script is a list of forms which are kept on the property list of a symbol
|
||||
;; naming the script. The forms are evaluated sequentially and thus dispatch
|
||||
;; on the functions defined in this file.
|
||||
|
||||
(DEFUN DEFSCRIPT FEXPR (F) (PUT (CAR F) (CDR F) 'SCRIPT) (CAR F))
|
||||
|
||||
(DEFUN MACSYM ()
|
||||
(DO ((X)) ((NOT (ATOM X)) (CAR X))
|
||||
(MREAD) (SETQ X (ERRSET (MPRINEVAL)))))
|
||||
|
||||
(DEFUN INCHK (PAT)
|
||||
(DO ((X (MREAD) (MREAD))) (NIL)
|
||||
(COND ((OR (EQ '$EXIT X)(EQ '$QUIT X))
|
||||
(PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., I'll do it for you.|)
|
||||
(RETURN (MACSYMA PAT)))
|
||||
((PALIKE PAT X) (RETURN (MPRINEVAL)))
|
||||
(T (TERPRI) (PRINC '|Try again.|) (TERPRI)))))
|
||||
|
||||
(DEFUN OUTCHK (PAT)
|
||||
(DO X (MACSYM) (MACSYM) (PALIKE PAT X)
|
||||
(TERPRI) (PRINC '|Try again.|) (TERPRI)))
|
||||
|
||||
|
||||
(DEFUN INCHKP (P)
|
||||
(DO ((X (MREAD) (MREAD))(Y)) (NIL)
|
||||
(IF (SETQ Y (FUNCALL P X)) (RETURN (COND ((NOT (EQ Y 'NOLABEL))
|
||||
(MPRINEVAL))))
|
||||
(TERPRI) (PRINC '|Try again.|))))
|
||||
|
||||
(DEFUN OUTCHK2 (PRED)
|
||||
(DO X (MACSYM)(MACSYM)
|
||||
(COND ((OR (EQ '$EXIT X) (EQ '$QUIT X)) (PRIMER-EXIT))
|
||||
((EQ '$NO X))
|
||||
((FUNCALL PRED X)))
|
||||
(TERPRI) (PRINC '|Try again.|) (TERPRI)))
|
||||
|
||||
(DEFUN PALIKE (PAT X)
|
||||
(COND ((EQ PAT X))
|
||||
((EQ 'DLABEL PAT) (PALIKE DLABEL X))
|
||||
((ATOM PAT) (AND (ATOM X) (EQUAL (MEVAL PAT) (MEVAL X))))
|
||||
((ATOM X) NIL)
|
||||
((EQ (CAAR PAT) (CAAR X))
|
||||
(SETQ PAT (CDR PAT) X (CDR X))
|
||||
(DO () ((NOT (PALIKE (CAR PAT) (CAR X))))
|
||||
(COND ((NULL PAT) (IF (NULL X) (RETURN T)))
|
||||
((NULL X) (RETURN NIL))
|
||||
(T (SETQ PAT (CDR PAT) X (CDR X))))))))
|
||||
|
||||
(DEFUN DECODE (X L)
|
||||
(COND ((NOT (EQ (TYPEP X) 'FIXNUM)) (NOR-ERR))
|
||||
((OR (NOT (> X 0)) (> X (LENGTH L))) (NOR-ERR))
|
||||
((SETQ X (NTHCDR (1- X) L)) (CAR X))
|
||||
(T (NOR-ERR))))
|
||||
|
||||
(DEFUN SPELLCHECK (X L)
|
||||
(COND ((NOT (ISITIN X L)) (SPELL-ERR))
|
||||
(T X)))
|
||||
|
||||
(DEFUN MENU (OPTS)
|
||||
(DO ((L OPTS (CDR L)) (I 1 (1+ I))) ((NULL L))
|
||||
(PRINC I) (PRINC '| - |) (PRINC (FULLSTRIP1 (CAR L)))
|
||||
(COND ((GET (CAR L) 'KIND) (TYO #\SP) (PRINC (GET (CAR L) 'KIND))))
|
||||
(TERPRI)))
|
||||
|
||||
(DEFUN SPELL-ERR () (PRINC '|No such script. Try again.|) (TERPRI))
|
||||
(DEFUN OPT-ERR () (PRINC '|Illegal command to OPTIONS|) (TERPRI))
|
||||
(DEFUN NOR-ERR () (PRINC '|Number out of range|) (TERPRI))
|
||||
|
||||
|
||||
(DEFUN PRIMER-SELECT (L)
|
||||
(IF (EQ '$EXIT (SETQ L (SELECT1 L))) (PQUIT) (SCRIPT L NIL)))
|
||||
|
||||
(DEFUN SELECT1 (L)
|
||||
(DO ((ANS)) (NIL)
|
||||
(MENU L)
|
||||
(SETQ ANS (RETRIEVE NIL NIL))
|
||||
(COND ((FIXP ANS) (IF (SETQ ANS (DECODE ANS L)) (RETURN ANS)))
|
||||
((ATOM ANS) (IF (SETQ ANS (SPELLCHECK ANS L))(RETURN ANS))))))
|
||||
|
||||
(DEFUN CMDCHKP (CMD)
|
||||
(DO ((X (MREAD) (MREAD))) (NIL)
|
||||
(COND ((OR (EQ '$EXIT X)(EQ '$QUIT X))
|
||||
(PRIMER-EXIT))
|
||||
((EQ '$NO X)
|
||||
(TERPRI) (PRINC '|O.K., I'll do it for you.|)
|
||||
(RETURN (MACSYMA CMD)))
|
||||
((CMDCHKP2 CMD X)(RETURN (MPRINEVAL)))
|
||||
(T (TERPRI) (PRINC '|Try again.|)))))
|
||||
|
||||
|
||||
(DEFUN CMDCHKP2 (C D)
|
||||
(COND ((ATOM D)
|
||||
(TERPRI) (PRINC '|Oops, you typed the ; too soon.|) NIL)
|
||||
((NOT (EQ (CAAR C)(CAAR D)))
|
||||
(CMDCHKP3 (CAAR D)(CAAR C)) NIL)
|
||||
((EQ '$% (CADR D)))
|
||||
((NOT (EQUAL (CADR C)(CADR D)))
|
||||
(TERPRI) (PRINC '|Use |)
|
||||
(PRINC (FULLSTRIP1 (CADR C))) NIL)
|
||||
((NOT (PALIKE C D)) NIL)
|
||||
(T T)))
|
||||
|
||||
|
||||
(DEFUN CMDCHKP3 (E C)
|
||||
(COND ((MEMQ (CAR (PLIST E)) '(SUBR LSUBR EXPR FEXPR))
|
||||
(TERPRI)(PRINC '|Please use the |)
|
||||
(PRINC (FULLSTRIP1 C))
|
||||
(PRINC '| command.|))
|
||||
(T (TERPRI) (PRINC '|Check your spelling.|))))
|
||||
|
||||
(DEFUN INOUTCHK (CMD PAT)
|
||||
(DO ((X (MREAD) (MREAD))) (NIL)
|
||||
(COND ((ATOM X)
|
||||
(TERPRI) (PRINC '|Aw, come on, this is easy.|) NIL)
|
||||
((NOT (EQ CMD (CAAR X)))
|
||||
(COND ((MEMQ (CAR (PLIST (CAAR X))) '(SUBR LSUBR EXPR FEXPR))
|
||||
(TERPRI)(PRINC '|Please use the |)
|
||||
(PRINC (FULLSTRIP1 CMD))
|
||||
(PRINC '| command.|))
|
||||
(T (TERPRI) (PRINC '|Check your spelling.|))) NIL)
|
||||
((PALIKE PAT (MPRINEVAL))(RETURN T)))
|
||||
(TERPRI) (PRINC '|Try again.|)(TERPRI)))
|
||||
|
||||
(DEFUN ISITIN (A L)
|
||||
(COND ((ATOM L) (EQ A L))
|
||||
(T (DO () ((NULL L) NIL)
|
||||
(COND ((ISITIN A (CAR L)) (RETURN T))
|
||||
(T (SETQ L (CDR L))))))))
|
||||
|
||||
| ||||