;; Function To Be Tested: DWIM (Program Support Tools) ;; ;; Source: IRM VOLUME 2 , Section 20 ;; Section 20. DWIM,Lyric Release Notes ;; ;; Section: Program Support ;; ;; Created By: John Park ;; ;; Creation Date: April 6, 1987 ;; ;; Last Update: April 7, 1987 ;; ;; Filed As: {ERIS}test>program-support>clisp.u ;; ;; ;; Syntax: SEE IRM Volume 2, Section 20 ;; ;; Function Description: To correct misspellings, parentheses errors, and other ;; syntactical errors in interlisp programming, the DWIM facility (Do-What-I-Mean) is ;; implemented. DWIM is called automatically whenever an error occurs in the evaluation ;; of an Interlisp expression. DWIM then proceeds to try to correct the mistake using ;; the current context of computation plus information about what the user had ;; previously been doing, (what mistakes he had been making) as guides to the remedy ;; of the error. If DWIM is able to make the correction, the computation continues ;; as though DWIM had not intervened: a break occurs, or an unwind to the last ERRORSET ;; (page 14.21). ;; ;; Argument(s): SEE IRM Volume 2, Section 20 ;; ;; Returns: SEE IRM Volume 2, Section 20 ;; ;; Constraints/Limitations: Testing for DWIM requires the old interlisp executive, which ;; the user will be prompted to create during the couse of testing. ;; Instructions will be given in the prompt window for the user actions to be taken ;; during testing and appropriate messages will be displayed to explain each test ;; process. Test result is logged on {eris}test>program-support>clisp.report. ;; ;; ;; (DO-TEST "DWIM-TEST-SETUP" (PROGN (IL:PAGEHEIGHT 0) (SETQ TEST-START (GET-INTERNAL-RUN-TIME)) (SETQ TEST-RESULT "{ERIS}TEST>PROGRAM-SUPPORT>DWIM.REPORT") (DEFUN T-FORMAT (TIME) (FORMAT *OUTPUT* "~2%TOTAL TEST RUN TIME FOR DWIM: ~F MINUTES ~%" TIME)) (DEFUN ITEM-FORMAT-S (COMMAND-LANGUAGE) (FORMAT *OUTPUT* "~%COMMAND: DWIMIFIED OPERATOR: ~A~%LISP VERSION: ~A ~%STATUS: ~A DATE: ~A TESTER: ~A~%" COMMAND-LANGUAGE (LISP-IMPLEMENTATION-VERSION) 'SUCCESS (IL:DATE) IL:USERNAME)) (DEFUN ITEM-FORMAT-F (COMMAND-LANGUAGE) (FORMAT *OUTPUT* "~%COMMAND: DWIMIFIED OPERATOR: ~A~%LISP VERSION: ~A ~%STATUS: ~A DATE: ~A TESTER: ~A~%" COMMAND-LANGUAGE (LISP-IMPLEMENTATION-VERSION) 'FAIL (IL:DATE) IL:USERNAME)) (DEFUN PASS-FAIL (COMMAND-LANGUAGE TEST-ITEM) (IF (EQ TEST-ITEM T) (ITEM-FORMAT-S COMMAND-LANGUAGE) (ITEM-FORMAT-F COMMAND-LANGUAGE))) (DEFUN PAUSE NIL (PROGN (IL:PLAYTUNE '((262 . 15000) (440 . 15000) (349 . 15000))) (SLEEP 2))) (SETQ DWIM-MESS1 "Shortly, you will be prompted to create an old interlisp exec window.After specifying a region, click the new exec and enter (DWIM-TEST)") (SETQ DWIM-MESS2 "Please answer y when the test is finished... ") (SETQ DWIM-MESS3 "DWIM test is now finished; please answer Y to continue") ; Defining DWIM-TEST for tesing clisp operators... (IL:DEFINEQ (IL:FOO (X Y) (IL:PLUS X Y))) (IL:DEFINEQ (IL:DWIM-TEST NIL (IL:PROGN (IL:PAGEHEIGHT 0) (IL:SETQ IL:DWIM-MESS " DWIM TEST IS FINISHED PLEASE CLICK THE XCL EXEC WINDOW AND ANSWER YES") (IL:SETQ IL:OPS-LIST '(IL:+OPERATOR IL:-OPERATOR IL:*OPERATOR IL:/OPERATOR IL:^OPERATOR IL:=OPERATOR IL:GT-OPERATOR IL:LT-OPERATOR IL:GE-OPERATOR IL:LE-OPERATOR IL:NTH-OPERATOR-1 IL:NTH-OPERATOR-2 IL:RECORD-OPERATOR IL:NTH-TAIL-OPERATOR IL:SETQ-OPERATOR IL:SETQ-OPERATOR-1 IL:SETQ-OPERATOR-2 IL:LIST-OPERATOR IL:LIST-OPERATOR-1 IL:LIST-OPERATOR-2 IL:LIST-OPERATOR-3 IL:QUOTE-OPERATOR-1 IL:QUOTE-OPERATOR-2 IL:NOT-OPERATOR IL:PRECEDENCE-1 IL:PRECEDENCE-2 IL:PRECEDENCE-3 IL:PRECEDENCE-4 IL:PRECEDENCE-5 IL:PRECEDENCE-6 IL:PRECEDENCE-7)) (IL:SETQ IL:DWIM-TEST-STRING "(DRIBBLE '{CORE}SPELL) (SETQ FOO (PLUSS 1 2)) (DRIBBLE) (DRIBBLE '{CORE}PAREN) 9IPLUS 1 2] (DRIBBLE) (DRIBBLE '{CORE}ATOM) (SETQ BAR 'YES) BARR (DRIBBLE) (DRIBBLE '{CORE}FNS) (FOOS 1 2) (DRIBBLE) (SETQ OPEN-SPELL (OPEN '{CORE}SPELL 'INPUT)) (SETQ SPELL-LST (FOR X TO 10 COLLECT (READ OPEN-SPELL))) (CLOSEF OPEN-SPELL) (IF (AND (MEMBER '=IPLUS SPELL-LST) (MEMBER 3 SPELL-LST)) THEN (SETQ DWIM-SPELL T) ELSE (SETQ DWIM-SPELL NIL)) (SETQ OPEN-PAREN (OPEN '{CORE}PAREN 'INPUT)) (SETQ PAREN-LST (FOR X TO 12 COLLECT (READ OPEN-PAREN))) (CLOSEF OPEN-PAREN) (IF (AND (MEMBER '=IPLUS PAREN-LST) (MEMBER 3 PAREN-LST)) THEN (SETQ DWIM-PAREN T) ELSE (SETQ DWIM-PAREN NIL)) (SETQ OPEN-ATOM (OPEN '{CORE}ATOM 'INPUT)) (SETQ ATOM-LST (FOR X TO 12 COLLECT (READ OPEN-ATOM))) (CLOSEF OPEN-ATOM) (IF (AND (MEMBER '=BAR ATOM-LST) (MEMBER 'YES ATOM-LST)) THEN (SETQ DWIM-ATOM T) ELSE (SETQ DWIM-ATOM NIL)) (SETQ OPEN-FNS (OPEN '{CORE}FNS 'INPUT)) (SETQ FNS-LST (FOR X TO 10 COLLECT (READ OPEN-FNS))) (CLOSEF OPEN-FNS) (IF (AND (MEMBER '=FOO FNS-LST) (MEMBER 3 FNS-LST)) THEN (SETQ DWIM-FNS T) ELSE (SETQ DWIM-FNS NIL)) (PROMPTPRINT DWIM-MESS3) (PLAYTUNE '((262 . 15000) (440 . 15000) (349 . 15000))) ") (IL:BKSYSBUF IL:DWIM-TEST-STRING) ) )) ; Test Result Analysis ; The following will compare the actural results of DWIM forms with ; the expected results... (PAUSE) (SETQ DWIM-STRING "; Creating an old interlisp executive (IL:PROMPTPRINT DWIM-MESS1) (PAUSE) (ADD-EXEC :PROFILE 'OLD-INTERLISP-T :EXEC (QUOTE IL:EVALQT)) (IL:ASKUSER 10 'Y DWIM-MESS2) (SETQ OPERATOR-LIST '(+OPERATOR -OPERATOR *OPERATOR /OPERATOR ^OPERATOR =OPERATOR GT-OPERATOR LT-OPERATOR GE-OPERATOR LE-OPERATOR NTH-OPERATOR-1 NTH-OPERATOR-2 RECORD-OPERATOR NTH-TAIL-OPERATOR SETQ-OPERATOR SETQ-OPERATOR-1 SETQ-OPERATOR-2 LIST-OPERATOR LIST-OPERATOR-1 LIST-OPERATOR-2 LIST-OPERATOR-3 QUOTE-OPERATOR-1 QUOTE-OPERATOR-2 NOT-OPERATOR PRECEDENCE-1 PRECEDENCE-2 PRECEDENCE-3 PRECEDENCE-4 PRECEDENCE-5 PRECEDENCE-6 PRECEDENCE-7)) ; Test Result Analysis ; The following will compare the actural results of DWIM forms with (CL:IN-PACKAGE 'INTERLISP) (SETQ EXPECTED-DWIM-FORMS '((PLUS A B) (DIFFERENCE A B) (TIMES A B) (QUOTIENT A B) (EXPT A B) (EQ A A) (GREATERP A B) (LESSP A B) (AND (GEQ A B) (GEQ A C)) (AND (LEQ B A) (LEQ B D)) (CADR FOO) (CAR (LAST (CAR (LAST FOO)))) (|fetch| (B B1) |of| RECORD-1) (CDDDR FOO) (SETQ SETQ-OP 7) (RPLACA (CDR FOO-SETQ) 90) (RPLACD FOO-SETQ 0) (LIST A B (LIST C D)) (CONS A (CONS B C)) (APPEND A B (LIST C)) (NCONC1 A B) (EQ X (QUOTE Y)) (EQ Z (QUOTE DON'T)) (AND (EQ (NOT NIL) T) (NOT (GEQ A B))) (PLUS 1 (TIMES 3 2)) (DIFFERENCE 10 (EXPT 4 2)) (NEQ (PLUS 1 3) 5) (TIMES 2 (EXPT 3 3)) (EQ (TIMES 2 2) 4) (GREATERP (DIFFERENCE 4 1) (PLUS 1 (TIMES 2 3))) (AND (NOT NIL) T))) (SETQ ACTUAL-CLISP '((A + B) (A - B) (A * B) (A / B) (A ^ B) (A = A) (A GT B) (A LT B) (AND (A GE B) (A GE C)) (AND (B LE A) (B LE D)) (|FOO:2|) (|FOO:-1:-1|) (|RECORD-1-1:B.B1|) (|FOO::3|) (SETQ-OP_7) (|FOO-SETQ:2_90|)(|FOO-SETQ::1_0|) (>) () () () (X = (QUOTE Y)) (Z = (QUOTE DON'T)) (AND ~NIL = T ~ (A GE B)) (1 + 3 * 2) (10 - 4 ^ 2) (1 + 3 ~= 5)(2 * 3 ^ 3) (2 * 2 = 4) (4 - 1 GT 1 + 2 * 3) (~NIL AND T))) (SETQ ACTUAL-DWIMIFIED-CLISP (MAPCAR ACTUAL-CLISP 'DWIMIFY)) (CL:IN-PACKAGE 'XCL-TEST) (SETQ PAIRED-DWIM (PAIRLIS IL:EXPECTED-DWIM-FORMS IL:ACTUAL-DWIMIFIED-CLISP)) ; Test to see if the following DWIM functions defineds and variables bound... (SETQ DWIM-FNS-BOUND NIL) (SETQ DWIM-FLIST '(IL:ADDSPELL IL:MISSPELLED? IL:FIXSPELL IL:FNCHECK)) (DOLIST (Y DWIM-FLIST) (IF (FBOUNDP Y) (PUSH T DWIM-FNS-BOUND ) (PROGN (PUSH NIL DWIM-FNS-BOUND) (IL:PROMPTPRINT Y '|: FUNCTION NOT BOUND|)))) (SETQ DWIM-VAR-BOUND NIL) (SETQ DWIM-VLIST '(IL:DWIMWAIT IL:FIXSPELLDEFAULT IL:ADDSPELLFLG IL:NOSPELLFLG IL:RUNONFLG IL:DWIMLOADFNSFLG IL:LPARKEY IL:RPARKEY IL:OKREEVALST IL:DWIMFLG IL:APPROVEFLG IL:LAMBDASPLST IL:SPELLINGS1 IL:SPELLINGS2 IL:SPELLINGS3 IL:USERWORDS IL:\#SPELLINGS1 IL:\#SPELLINGS2 IL:\#SPELLINGS3 IL:\#USERWORDS)) (DOLIST (Y DWIM-VLIST) (IF (BOUNDP Y) (PUSH T DWIM-VAR-BOUND ) (PROGN (PUSH NIL DWIM-VAR-BOUND) (IL:PROMPTPRINT Y '|: VARIABLE NOT BOUND|)))) (IL:CLRPROMPT) (SETQ TEST-END (GET-INTERNAL-RUN-TIME)) (SETQ TOTAL-TEST-TIME (FLOAT (/ (ABS(- TEST-END TEST-START)) 60000))) ; Wrinting the test results to ; {eris}test>program-support>clisp.u.... (DO-TEST 'DWIM-TEST-RESULT (PROGN (SETQ *OUTPUT* (OPEN TEST-RESULT :DIRECTION :OUTPUT :IF-EXISTS :APPEND)) (DOLIST (Y PAIRED-DWIM) (IF (EQUAL (CAR Y) (CDR Y)) (PROGN (SETQ OPERATOR (POP IL:OPS-LIST)) (PASS-FAIL OPERATOR T)) (PROGN (SETQ OPERATOR (POP IL:OPS-LIST)) (PASS-FAIL OPERATOR NIL)))) (PASS-FAIL 'DWIM-SPELLING IL:DWIM-SPELL) (PASS-FAIL 'DWIM-PARENTHESES IL:DWIM-PAREN) (PASS-FAIL 'DWIM-UNBOUND-ATOM IL:DWIM-ATOM) (PASS-FAIL 'DWIM-UNDEFINED-FN IL:DWIM-FNS) (PASS-FAIL 'DWIM-FUNCTIONS (NOTANY #'NULL DWIM-FNS-BOUND)) (PASS-FAIL 'DWIM-VARIABLES (NOTANY #'NULL DWIM-VAR-BOUND)) (T-FORMAT TOTAL-TEST-TIME) (CLOSE *OUTPUT*) (IDENTITY T) ) ) ") (IL:BKSYSBUF DWIM-STRING) ) ) STOP