(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "LISP") (IL:FILECREATED "16-May-90 14:43:08" IL:|{DSK}local>lde>lispcore>sources>CMLSPECIALFORMS.;2| 20313 IL:|changes| IL:|to:| (IL:VARS IL:CMLSPECIALFORMSCOMS) IL:|previous| IL:|date:| "13-Jun-88 18:25:25" IL:|{DSK}local>lde>lispcore>sources>CMLSPECIALFORMS.;1|) ; Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1990 by Venue & Xerox Corporation. All rights reserved. (IL:PRETTYCOMPRINT IL:CMLSPECIALFORMSCOMS) (IL:RPAQQ IL:CMLSPECIALFORMSCOMS ((IL:COMS (IL:FUNCTIONS LOOP) (IL:COMS (IL:FUNCTIONS IDENTITY) (XCL:OPTIMIZERS IDENTITY)) (IL:FUNCTIONS UNLESS WHEN)) (IL:FUNCTIONS FLET LABELS IL:SELECTQ) (IL:COMS (IL:* IL:|;;| "DO DO* and support.") (IL:FUNCTIONS DO DO*) (IL:FUNCTIONS %DO-TRANSLATE)) (IL:COMS (IL:FUNCTIONS DOLIST DOTIMES) (IL:FUNCTIONS CASE)) (IL:COMS (IL:* IL:|;;| "hacks, These probably shouldn't be here") (IL:COMS (IL:* IL:|;;|  "Hacks for Interlisp NLAMBDAs that should look like functions") (IL:PROP IL:MACRO IL:FRPTQ IL:SETN IL:SUB1VAR IL:*)) (IL:COMS (IL:FNS IL:BQUOTIFY) (IL:USERMACROS . `IL:UNCOMMA) (IL:VARS IL:*BQUOTE-COMMA* IL:*BQUOTE-COMMA-ATSIGN* IL:*BQUOTE-COMMA-DOT*) (IL:GLOBALVARS IL:*BQUOTE-COMMA* IL:*BQUOTE-COMMA-ATSIGN* IL:*BQUOTE-COMMA-DOT*)) (IL:COMS (IL:FNS IL:CLEAR-CLISPARRAY) (IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOCOPY (IL:ADDVARS (IL:MARKASCHANGEDFNS IL:CLEAR-CLISPARRAY))) ) (IL:P (PROCLAIM '(SPECIAL IL:FILEPKGFLG IL:DFNFLG *READTABLE*)) (PROCLAIM (CONS 'SPECIAL IL:SYSSPECVARS)))) (IL:PROP (IL:FILETYPE IL:MAKEFILE-ENVIRONMENT) IL:CMLSPECIALFORMS) (IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS (IL:ADDVARS (IL:NLAMA) (IL:NLAML) (IL:LAMA))))) (DEFMACRO LOOP (&REST FORMS) (LET ((TAG (GENSYM))) `(PROG NIL ,TAG ,@FORMS (GO ,TAG)))) (DEFUN IDENTITY (THING) (IL:* IL:|;;| "Returns what was passed to it. Default for :key options.") THING) (XCL:DEFOPTIMIZER IDENTITY (X) X) (DEFMACRO UNLESS (TEST &BODY BODY) `(COND (,(IL:NEGATE TEST) ,@BODY))) (DEFMACRO WHEN (TEST &BODY BODY) `(COND (,TEST ,@BODY))) (DEFMACRO FLET (FUNCTION-BINDINGS &BODY BODY &ENVIRONMENT ENV) (IL:* IL:|;;;| "This is only used by the old interpreter and compiler. The new ones treat FLET specially.") (LET ((FUNCTIONS (MAPCAR #'(LAMBDA (X) (CONS (GENSYM) X)) FUNCTION-BINDINGS))) `(,'LET ,(MAPCAR #'(LAMBDA (X) (XCL:DESTRUCTURING-BIND (FN-NAME FN-ARGLIST &REST FN-BODY) (CDR X) (MULTIPLE-VALUE-BIND (BODY DECLS) (XCL:PARSE-BODY FN-BODY ENV T) `(,(CAR X) #'(LAMBDA ,FN-ARGLIST ,@DECLS (BLOCK ,FN-NAME ,@BODY)))))) FUNCTIONS) ,(XCL:WALK-FORM `(LOCALLY ,@BODY) :ENVIRONMENT ENV :WALK-FUNCTION #'(LAMBDA (FORM CONTEXT) (IF (OR (ATOM FORM) (NOT (EQ CONTEXT :EVAL))) FORM (COND ((MEMBER (CAR FORM) '(IL:FUNCTION FUNCTION) :TEST #'EQ) (DOLIST (Z FUNCTIONS FORM) (IF (EQ (CADR FORM) (CADR Z)) (RETURN (CAR Z))))) (T (DOLIST (Z FUNCTIONS FORM) (IF (EQ (CAR FORM) (CADR Z)) (RETURN `(FUNCALL ,(CAR Z) ,@(CDR FORM))))))))))))) (DEFMACRO LABELS (FUNCTION-BINDINGS &BODY BODY &ENVIRONMENT ENV) (IL:* IL:|;;;| "This is only used by the old interpreter and compiler. The new ones treat LABELS specially.") (IL:* IL:|;;;| "(Actually, the new compiler still uses this, but it will soon stop doing so.)") (LET ((FUNCTIONS (MAPCAR #'(LAMBDA (X) (CONS (GENSYM) X)) FUNCTION-BINDINGS))) `(,'LET ,(MAPCAR #'CAR FUNCTIONS) ,(XCL:WALK-FORM `(PROGN ,@(MAPCAR #'(LAMBDA (X) (XCL:DESTRUCTURING-BIND (FN-NAME FN-ARGLIST &REST FN-BODY) (CDR X) (MULTIPLE-VALUE-BIND (BODY DECLS) (XCL:PARSE-BODY FN-BODY ENV T) `(SETQ ,(CAR X) #'(LAMBDA ,FN-ARGLIST ,@DECLS (BLOCK ,FN-NAME ,@BODY)))))) FUNCTIONS) (LOCALLY ,@BODY)) :ENVIRONMENT ENV :WALK-FUNCTION #'(LAMBDA (FORM CONTEXT) (IF (OR (ATOM FORM) (NOT (EQ CONTEXT :EVAL))) FORM (COND ((MEMBER (CAR FORM) '(IL:FUNCTION FUNCTION) :TEST #'EQ) (DOLIST (Z FUNCTIONS FORM) (IF (EQ (CADR FORM) (CADR Z)) (RETURN (CAR Z))))) (T (DOLIST (Z FUNCTIONS FORM) (IF (EQ (CAR FORM) (CADR Z)) (RETURN `(FUNCALL ,(CAR Z) ,@(CDR FORM))))))))))))) (DEFMACRO IL:SELECTQ (SELECTOR &REST FORMS) (COND ((EQUAL SELECTOR '(IL:SYSTEMTYPE)) (IL:* IL:|;;| "Special case required by the IRM. (selectq (systemtype) ...) mustn't even look at the untaken arms.") (LET ((TYPE (EVAL SELECTOR)) (TAIL FORMS)) (LOOP (IF (NULL (CDR TAIL)) (IL:* IL:|;;| "No more possibilities, so use the default.") (RETURN (CAR TAIL)) (IL:* IL:|;;| "Normal clause. Is this the one we want?") (WHEN (OR (EQ TYPE (CAAR TAIL)) (AND (CONSP (CAAR TAIL)) (MEMBER TYPE (CAAR TAIL) :TEST #'EQ))) (RETURN `(PROGN ,@(CDAR TAIL))))) (SETQ TAIL (CDR TAIL))))) (T (LET* ((KV (IF (SYMBOLP SELECTOR) SELECTOR (GENSYM))) (CLAUSES (XCL:WITH-COLLECTION (DO ((C FORMS (CDR C))) ((NULL C)) (XCL:COLLECT (COND ((NULL (CDR C)) `(T ,(CAR C))) ((NOT (CONSP (CAAR C))) `((EQ ,KV ',(CAAR C)) ,@(CDAR C))) (T `((OR ,@(MAPCAR #'(LAMBDA (X) `(EQ ,KV ',X)) (CAAR C))) ,@(CDAR C))))))))) (IF (EQ KV SELECTOR) `(COND ,@CLAUSES) `(LET ((,KV ,SELECTOR)) (DECLARE (IL:LOCALVARS ,KV)) (COND ,@CLAUSES))))))) (IL:* IL:|;;| "DO DO* and support.") (DEFMACRO DO (VARS END-TEST &BODY BODY &ENVIRONMENT ENV) (%DO-TRANSLATE VARS END-TEST BODY NIL ENV)) (DEFMACRO DO* (BINDS END-TEST &REST BODY &ENVIRONMENT ENV) (%DO-TRANSLATE BINDS END-TEST BODY T ENV)) (DEFUN %DO-TRANSLATE (VARS END-TEST BODY SEQUENTIALP ENV) (LET ((VARS-AND-INITIAL-VALUES (MAPCAR #'(LAMBDA (X) (IF (CONSP X) (LIST (CAR X) (CADR X)) (LIST X NIL))) VARS)) (SUBSEQUENT-VALUES (MAPCAN #'(LAMBDA (X) (AND (CONSP X) (CDDR X) `((,(CAR X) ,(CADDR X))))) VARS)) (TAG (GENSYM))) (IF SUBSEQUENT-VALUES (SETQ SUBSEQUENT-VALUES (CONS (IF SEQUENTIALP 'SETQ 'PSETQ) (APPLY 'APPEND SUBSEQUENT-VALUES)))) (MULTIPLE-VALUE-BIND (BODY DECLS) (XCL:PARSE-BODY BODY ENV) `(,(IF SEQUENTIALP 'PROG* 'PROG) ,VARS-AND-INITIAL-VALUES ,@DECLS ,TAG (COND (,(CAR END-TEST) (RETURN (PROGN ,@(CDR END-TEST))))) ,@BODY ,SUBSEQUENT-VALUES (GO ,TAG))))) (DEFMACRO DOLIST ((VAR LISTFORM &OPTIONAL RESULTFORM) &BODY BODY &ENVIRONMENT ENV) (LET ((TAIL (GENSYM))) (MULTIPLE-VALUE-BIND (BODY DECL) (XCL:PARSE-BODY BODY ENV) `(,'LET ((,TAIL ,LISTFORM) ,VAR) ,@DECL (LOOP (SETQ ,VAR (CAR (OR ,TAIL ,@(IF RESULTFORM `((SETQ ,VAR NIL))) (RETURN ,RESULTFORM)))) ,@BODY (SETQ ,TAIL (CDR ,TAIL))))))) (DEFMACRO DOTIMES ((VAR COUNTFORM &OPTIONAL RESULTFORM) &BODY BODY &ENVIRONMENT ENV) (LET ((MAX (GENSYM))) (MULTIPLE-VALUE-BIND (BODY DECLS) (XCL:PARSE-BODY BODY ENV) `(LET ((,MAX ,COUNTFORM) (,VAR 0)) ,@DECLS (LOOP (IF (>= ,VAR ,MAX) (RETURN ,RESULTFORM)) ,@BODY (SETQ ,VAR (1+ ,VAR))))))) (DEFMACRO CASE (SELECTOR &REST CASES) (LET* ((KV (IF (SYMBOLP SELECTOR) SELECTOR (GENSYM))) (CLAUSES (MAPCAR #'(LAMBDA (CASE) (LET ((KEY-LIST (CAR CASE)) (CONSEQUENTS (OR (CDR CASE) (LIST NIL)))) (COND ((MEMBER KEY-LIST '(T OTHERWISE) :TEST #'EQ) `(T ,@CONSEQUENTS)) ((NULL KEY-LIST) (WARN "~S used as a singleton key in ~S. You probably meant to use (~S)." NIL 'CASE NIL) '(NIL)) ((ATOM KEY-LIST) `((EQL ,KV ',KEY-LIST) ,@CONSEQUENTS)) (T `((OR ,@(MAPCAR #'(LAMBDA (X) `(EQL ,KV ',X)) KEY-LIST)) ,@CONSEQUENTS))))) CASES))) (IF (EQ KV SELECTOR) `(COND ,@CLAUSES) `(LET ((,KV ,SELECTOR)) (COND ,@CLAUSES))))) (IL:* IL:|;;| "hacks, These probably shouldn't be here") (IL:* IL:|;;| "Hacks for Interlisp NLAMBDAs that should look like functions") (IL:PUTPROPS IL:FRPTQ IL:MACRO (= . IL:RPTQ)) (IL:PUTPROPS IL:SETN IL:MACRO (= . IL:SETQ)) (IL:PUTPROPS IL:SUB1VAR IL:MACRO ((IL:X) (IL:SETQ IL:X (IL:SUB1 IL:X)))) (IL:PUTPROPS IL:* IL:MACRO ((IL:X . IL:Y) 'IL:X)) (IL:DEFINEQ (il:bquotify (il:lambda (il:form) (il:* il:|bvm:| "10-Jun-86 17:07") (il:* il:|turn| il:form il:|into| il:\a il:bquote il:|if| il:|it| il:|can.|  il:i\f il:|so,| il:|return| il:|it| il:|as| il:\a il:|list,| il:|otherwise,|  il:|return| nil) (cond ((il:listp il:form) (let ((il:fn (car il:form)) (il:tail (cdr il:form))) (and (il:listp il:tail) (or (null (cdr il:tail)) (and (il:listp (cdr il:tail)) (or (null (cddr il:tail)) (il:selectq il:fn ((cons il:nconc1) (il:*  "These take exactly two args, so if there are more, it's an error") nil) t)))) (il:selectq il:fn ('il:bquote (and (null (cdr il:tail)) (list (car il:tail)))) (list (list (il:|for| il:x il:|in| il:tail il:|join| (or (il:bquotify il:x) (list (list il:*bquote-comma* il:x)))))) ((cons list*) (list (il:append (or (il:bquotify (car il:tail)) (list (list il:*bquote-comma* (car il:tail)))) (or (car (il:bquotify (il:setq il:tail (cond ((and (eq il:fn 'list*) (cddr il:tail)) (cons 'list* (cdr il:tail))) (t (cadr il:tail)))))) (list (list il:*bquote-comma-atsign* il:tail)))))) ((il:append nconc il:nconc1) (let ((il:default (cond ((eq il:fn 'il:append) il:*bquote-comma-atsign*) (t il:*bquote-comma-dot*))) (il:bqcar (il:bquotify (car il:tail)))) (list (il:append (cond ((and il:bqcar (il:|for| (il:tl il:_ (il:setq il:bqcar (car il:bqcar))) il:|by| (cdr il:tl) il:|while| il:tl il:|never| (il:nlistp il:tl))) (il:* "Second condition catches (APPEND (CONS A 0) --), where the (CONS A 0) turns into (,A . 0) and then the APPEND would lose it. It will lose it at runtime, too, of course, but let's not remove mistakes from the source.") il:bqcar) (t (list (list il:default (car il:tail))))) (cond ((eq il:fn 'il:nconc1) (il:*  "Second arg is an element, not a segment") (or (il:bquotify (il:setq il:tail (cadr il:tail))) (list (list il:*bquote-comma* il:tail)))) (t (or (car (il:bquotify (il:setq il:tail (cond ((cddr il:tail) (cons il:fn (cdr il:tail))) (t (cadr il:tail)))))) (list (list il:default il:tail))))))))) nil)))) ((or (il:numberp il:form) (il:stringp il:form) (eq il:form t) (null il:form)) (list il:form)) (t nil)))) ) (IL:ADDTOVAR IL:USERMACROS (IL:UNCOMMA NIL (IL:IF (EQ (IL:\## 1) 'IL:BQUOTE) NIL ((IL:IF (EQ (IL:\## IL:!0 1) 'IL:BQUOTE) (IL:!0)))) (IL:I 2 (IL:\\UNCOMMA (IL:\## 2))))) (IL:ADDTOVAR IL:EDITMACROS (IL:BQUOTE NIL IL:UP (IL:ORR ((IL:I 1 (OR (CONS 'IL:BQUOTE (OR (IL:BQUOTIFY (IL:\## 1)) (IL:ERROR!))) (IL:ERROR!)))) ((IL:E 'IL:BQUOTE?))) 1)) (IL:ADDTOVAR IL:EDITCOMSA IL:BQUOTE IL:UNCOMMA) (IL:RPAQQ IL:*BQUOTE-COMMA* IL:\\\,) (IL:RPAQQ IL:*BQUOTE-COMMA-ATSIGN* IL:\\\,@) (IL:RPAQQ IL:*BQUOTE-COMMA-DOT* IL:\\\,.) (IL:DECLARE\: IL:DOEVAL@COMPILE IL:DONTCOPY (IL:GLOBALVARS IL:*BQUOTE-COMMA* IL:*BQUOTE-COMMA-ATSIGN* IL:*BQUOTE-COMMA-DOT*) ) (IL:DEFINEQ (il:clear-clisparray (il:lambda (il:name type il:reason) (il:* il:|bvm:| "25-Jun-86 12:59") (il:selectq il:reason ((t il:clisp) (il:*  "New definition or changed only by CLISP translation") nil) (clrhash il:clisparray)))) ) (IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOCOPY (IL:ADDTOVAR IL:MARKASCHANGEDFNS IL:CLEAR-CLISPARRAY) ) (PROCLAIM '(SPECIAL IL:FILEPKGFLG IL:DFNFLG *READTABLE*)) (PROCLAIM (CONS 'SPECIAL IL:SYSSPECVARS)) (IL:PUTPROPS IL:CMLSPECIALFORMS IL:FILETYPE COMPILE-FILE) (IL:PUTPROPS IL:CMLSPECIALFORMS IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "LISP")) (IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS (IL:ADDTOVAR IL:NLAMA ) (IL:ADDTOVAR IL:NLAML ) (IL:ADDTOVAR IL:LAMA ) ) (IL:PUTPROPS IL:CMLSPECIALFORMS IL:COPYRIGHT ("Venue & Xerox Corporation" 1983 1984 1985 1986 1987 1988 1990)) (IL:DECLARE\: IL:DONTCOPY (IL:FILEMAP (NIL (13354 18024 (IL:BQUOTIFY 13367 . 18022)) (19227 19633 (IL:CLEAR-CLISPARRAY 19240 . 19631))))) IL:STOP