(DEFINE-FILE-INFO §READTABLE "INTERLISP" §PACKAGE "INTERLISP")
(FILECREATED "19-Feb-87 10:40:43" {QV}<LFG>PARSER>NEXT>LAMBDATRAN.;2 9556   

      changes to%:  (FNS FNTYP1 LTDWIMUSERFN LTSTKNAME NARGS)

      previous date%: "19-Feb-87 09:56:18" {QV}<LFG>PARSER>NEXT>LAMBDATRAN.;1)


(* "
Copyright (c) 1984, 1987 by Xerox Corporation.  All rights reserved.
")

(PRETTYCOMPRINT LAMBDATRANCOMS)

(RPAQQ LAMBDATRANCOMS [(* Translation machinery for new LAMBDA words)
                       (LOCALVARS . T)
                       [DECLARE%: FIRST (P (VIRGINFN 'ARGLIST T)
                                           (MOVD? 'ARGLIST 'OLDARGLIST)
                                           (VIRGINFN 'NARGS T)
                                           (MOVD? 'NARGS 'OLDNARGS)
                                           (VIRGINFN 'ARGTYPE T)
                                           (MOVD? 'ARGTYPE 'OLDARGTYPE)
                                           (MOVD? 'NILL 'LTDWIMUSERFN]
                       (FNS ARGLIST ARGTYPE FNTYP1 LTDWIMUSERFN LTSTKNAME NARGS)
                       (ADDVARS (DWIMUSERFORMS (LTDWIMUSERFN)))
                       (PROP VARTYPE LAMBDATRANFNS)
                       (ALISTS (LAMBDATRANFNS))
                       (PROP MACRO LTSTKNAME)
                       (P (PUTHASH 'LTSTKNAME '(NIL) MSTEMPLATES))
                       (P (RELINK 'WORLD))
                       (DECLARE%: EVAL@COMPILE DONTCOPY (P (RESETSAVE DWIMIFYCOMPFLG T))
                              (GLOBALVARS CLISPARRAY COMMENTFLG LAMBDASPLST LAMBDATRANFNS BOUNDPDUMMY
                                     ))
                       (DECLARE%: DONTCOPY (RECORDS LAMBDAWORD))
                       (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
                              (ADDVARS (NLAMA)
                                     (NLAML LTSTKNAME)
                                     (LAMA])



(* Translation machinery for new LAMBDA words)

(DECLARE%: DOEVAL@COMPILE DONTCOPY

(LOCALVARS . T)
)
(DECLARE%: FIRST 
(VIRGINFN 'ARGLIST T)
(MOVD? 'ARGLIST 'OLDARGLIST)
(VIRGINFN 'NARGS T)
(MOVD? 'NARGS 'OLDNARGS)
(VIRGINFN 'ARGTYPE T)
(MOVD? 'ARGTYPE 'OLDARGTYPE)
(MOVD? 'NILL 'LTDWIMUSERFN)
)
(DEFINEQ

(ARGLIST
  [LAMBDA (FN)                                               (* rmk%: " 6-AUG-79 22:41")
    (PROG (TEMP (DEF (CGETD FN)))
          (DECLARE (LOCALVARS . T))
          (RETURN (if (OR (SUBRP DEF)
                          (NLISTP DEF)
                          (SELECTQ (CAR DEF)
                              ([LAMBDA NLAMBDA FUNARG] 
                                   T)
                              NIL))
                      then (OLDARGLIST FN)
                    elseif (AND CLISPARRAY (SETQ TEMP (GETHASH DEF CLISPARRAY)))
                      then (ARGLIST TEMP)
                    elseif [AND [SETQ TEMP (fetch ARGLIST of (CDR (ASSOC (CAR DEF)
                                                                         LAMBDATRANFNS]
                                (NEQ T (SETQ TEMP (APPLY* TEMP DEF]
                      then TEMP
                    else (OLDARGLIST FN])

(ARGTYPE
  [LAMBDA (FN)                                               (* rmk%: " 9-APR-78 12:55")
          
          (* Note%: We don't have to worry about SUBR's or CCODE here)

    (OR (OLDARGTYPE FN)
        (SELECTQ (FNTYP FN)
            (EXPR 0)
            (FEXPR 1)
            (EXPR* 2)
            (FEXPR* 3)
            NIL])

(FNTYP1
  [LAMBDA (X)                                                (* rmk%: " 6-AUG-79 22:43")
          
          (* Called by FNTYP when it can't interpret the CAR of a list definition.
          Doesn't call dwimify, because it might not know what FAULTN really is.
          Therefore, examines the FNTYP field of the LAMBDATRAN entry)

    (PROG (TEMP)
          (RETURN (if (AND CLISPARRAY (SETQ TEMP (GETHASH X CLISPARRAY)))
                      then (FNTYP TEMP)
                    elseif (SETQ TEMP (CDR (ASSOC (CAR X)
                                                  LAMBDATRANFNS)))
                      then (SELECTQ (SETQ TEMP (fetch FNTYP of TEMP))
                               ((EXPR EXPR* FEXPR FEXPR*) 
                                    TEMP)
                               (NIL 'EXPR)
                               (APPLY* TEMP X])

(LTDWIMUSERFN
  [LAMBDA NIL                                                (* rmk%: " 6-AUG-79 22:49")
                                                             (* NOTE%: dwimuserfn HAS to be 
                                                             compiled for proper action!!)
          
          (* LAMBDA-words can be added by making entries on LAMBDATRANFNS, e.g.
          (FOOLAMBDA FOOTRAN EXPR FOOARGLIST))

    (DECLARE (USEDFREE EXPR FAULTFN FAULTAPPLYFLG FAULTX FAULTARGS LAMBDASPLST LAMBDATRANFNS 
                    COMMENTFLG CLISPCHANGE))
    (PROG (FORM TRAN TRANFN (EXPR EXPR)
                (FAULTFN FAULTFN))
          (DECLARE (SPECVARS FAULTFN EXPR))                  (* Rebind FAULTFN to guarantee 
                                                             function name instead of TYPE-IN)
          [SETQ FORM (if (LISTP FAULTX)
                         then (if (FMEMB (CAR FAULTX)
                                         LAMBDASPLST)
                                  then FAULTX
                                elseif (LITATOM (CAR FAULTX))
                                  then [SETQ EXPR (GETD (SETQ FAULTFN (CAR FAULTX]
                                else (LISTP (CAR FAULTX)))
                       elseif (AND FAULTAPPLYFLG (LITATOM FAULTX))
                         then (SETQ EXPR (GETD (SETQ FAULTFN FAULTX]
          (RETURN
           (if [SETQ TRANFN (fetch TRANFN of (CDR (ASSOC (CAR FORM)
                                                         LAMBDATRANFNS]
               then (SETQ CLISPCHANGE T) 
          
          (* Tell dwim not to try again if the translation doesn't make it)

                    (if (LISTP (SETQ TRAN (APPLY* TRANFN FORM)))
                        then (if [OR (EQ FORM (GETD FAULTFN))
                                     (EQ FORM (GETP FAULTFN 'EXPR]
                                 then 
          
          (* Insert the form that will establish the right function name on the stack)

                                      (for X TEMP on (CDR (LISTP (CDR TRAN)))
                                         unless (SELECTQ [SETQ TEMP (CAR (LISTP (CAR X]
                                                    ((DECLARE CLISP%:) 
                                                         T)
                                                    (EQ TEMP COMMENTFLG))
                                         do (ATTACH (LIST 'LTSTKNAME FAULTFN)
                                                   X)
                                            (RETURN)))
                             (CLISPTRAN FORM TRAN)
                             (if FAULTAPPLYFLG
                                 then (RETAPPLY 'FAULTAPPLY TRAN FAULTARGS)
                               else (SELECTQ (CAR TRAN)
                                        ([LAMBDA NLAMBDA] 
                                             (if (EQ FORM (CAR FAULTX))
                                                 then (DWIMIFY0? (CDR FAULTX)
                                                             FAULTX NIL NIL NIL FAULTFN))
                                                             (* Dwimify the arguments of an open 
                                                             LAMBDA)
                                             FAULTX)
                                        TRAN])

(LTSTKNAME
  [NLAMBDA (NAME)                                            (* rmk%: " 6-JUN-79 10:54")
          
          (* Smashes the correct stack-name on the frame for the LAMBDA-translation.
          The call goes away at compile. If BOUNDPDUMMY is bound to a stackframe, avoids 
          allocation on each call.)

    (DECLARE (USEDFREE BOUNDPDUMMY))
    (PROG (POS)
          (SETSTKNAME (SETQ POS (REALSTKNTH -1 'LTSTKNAME T BOUNDPDUMMY))
                 NAME)
          (RELSTK POS])

(NARGS
  [LAMBDA (X)                                                (* rmk%: "29-APR-78 14:10")
    (OR (OLDNARGS X)
        (AND (NLSETQ (SETQ X (ARGLIST X)))
             (if (NULL X)
                 then 0
               elseif (LISTP X)
                 then (LENGTH X)
               else 1])
)

(ADDTOVAR DWIMUSERFORMS (LTDWIMUSERFN))

(PUTPROPS LAMBDATRANFNS VARTYPE ALIST)

(ADDTOVAR LAMBDATRANFNS )

(PUTPROPS LTSTKNAME MACRO (X (CONS COMMENTFLG X)))
(PUTHASH 'LTSTKNAME '(NIL) MSTEMPLATES)
(RELINK 'WORLD)
(DECLARE%: EVAL@COMPILE DONTCOPY 
(RESETSAVE DWIMIFYCOMPFLG T)

(DECLARE%: DOEVAL@COMPILE DONTCOPY

(GLOBALVARS CLISPARRAY COMMENTFLG LAMBDASPLST LAMBDATRANFNS BOUNDPDUMMY)
)
)
(DECLARE%: DONTCOPY 
(DECLARE%: EVAL@COMPILE

(RECORD LAMBDAWORD (TRANFN FNTYP ARGLIST))
)
)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS 

(ADDTOVAR NLAMA )

(ADDTOVAR NLAML LTSTKNAME)

(ADDTOVAR LAMA )
)
(PUTPROPS LAMBDATRAN COPYRIGHT ("Xerox Corporation" 1984 1987))
(DECLARE%: DONTCOPY
  (FILEMAP (NIL (2224 8821 (ARGLIST 2234 . 3188) (ARGTYPE 3190 . 3544) (FNTYP1 3546 . 4455) (
LTDWIMUSERFN 4457 . 7957) (LTSTKNAME 7959 . 8483) (NARGS 8485 . 8819)))))
STOP
