[comp.sys.xerox] Interlisp to Commonlisp conversion package

darrelj@SM.UNISYS.COM (01/06/88)

Interlisp-D into Xerox Commonlisp, we developed a collection of tools
to automate the conversion as much as possible.
These have been placed in {parcvax.xerox.com}/lisp/exchange.
While we at Unisys have reasonable confidence in these tools, they are
being made available with no promises of accuracy, completeness or
support (though we would appreciate feedback).

The tools run in Xerox Lyric Common Lisp.  The following files are parts of it:

TRANSOR -- A slightly modified version of Transor, to fix a few
Lyric-related problems and provide the ability to emit a
DEFINE-FILE-INFO expression and to use the value of TRANSOUTREADTABLE
as the output readtable.  We used TRANSOR because we were familiar
with it, and it handles a lot of details needed to safely and surely
traverse the code to be translated.  The biggest impediment to adding
to the transforms is that they are specified as teletype editor
commands, and only old-time Interlispers have much experience with those. 
TSET  --  The same version dating back to 1979.  This is the part of
transor used for interactively developing and testing translation rules.
TRANSOR.LCOM  -- contains the compilation of BOTH the above files.
TO-COMMONLISP.XFORMS  -- translation rules for 428 functions, 98
remarks and 4 auxiliary functions.  It covers are large portion of
Interlisp, including most Clisp constructs, and specifically handles
any function with the same name in both Interlisp and Commonlisp, so
that holes in a translation should result in calls to undefined
functions.  In many cases, nice transformations are used for easy
cases, and ugly ones only for hard cases.  This file sets
TRANSOUTREADTABLE to be a copy of the XCL readtable which is case
SENSITIVE, MYLOAD below reads it case INsensitive, so the resulting
file will ultimately lose most case distinctions on reloading into
Xerox Lisp (or other common lisps).  This was a much debated point
internally, but this seemed the best of three bad possibilities (e.g.
print one of
Cased AS ORIGinal     which becomes CASED AS ORIGINAL on load,
|Cased| AS |ORIGinal|, or
CASED AS ORIGINAL

INTERLISP-COMMONLISP.TEDIT  --  A document describing the
transformations and formacro.

LOADTRAN  -- contains a few functions which prevent many breaks on
loading the translated file.  The function MYLOAD is intended to load
a translated file.
LOADTRAN.DFASL -- compiled version

FORMACRO and FORMACRO.DFASL --  Still another portable iteration macro
for commonlisp.  Its main claims are almost 100% compatibility with
the semantics of the Interlisp-Clisp FOR (especially when used the the
XFORMS which fix a few incompatibilities); and user extensibility
(unfortunately not compatible with IL:I.S.OPR).  Embedded keywords
(e.g. IN, COLLECT) may be in any package.

COMMON-MAKE and COMMON-MAKE.LCOM  -- still another version of code to
generate a more "common" source file.  It handles more filepkg command
types than most.  Also, when used with COMMENTHACKS will successfully
print ALL comments in semicolon format.  Call
IL:COMMON-MAKEFILE(file).  It checks the MAKEFILE-ENVIRONMENT property
to select a package and base.

COMMENTHACKS and COMMENTHACKS.LCOM -- patches to the prettyprinter and
to the DEFUN editor.  The prettyprinter patches will print Interlisp
(* --) comments as semicolon comments when *PRINT-SEMICOLON-COMMENTS*
is 'IL:ALL.
This file also redefines the ED method for DEFUNs so that the initials
and date of editing get updated for DEFUNs just as Interlisp has
always done for FNS.

Because of the way things developed, these tools are not as fully
integrated as they could have been.  If we were doing it over, the
TRANSOR step could have more carefully coordinated the new COMS so
that COMMON-MAKE would be able to do the right thing.  As it stands,
the COMS generally have to be edited to change FNS to FUNCTIONS, etc,
but you tend to need a few iterations of editing things before the
compiler is completely happy anyway.


The steps needed to do translations are roughly as follows:
(LOAD 'TRANSOR.LCOM)
(LOAD 'TO-COMMONLISP.XFORMS)
(SETQ FIXSPELLDEFAULT 'N)  ;; Otherwise DWIM gets too clever
(SETQ XlatedRecords NIL)   ;; This is currently set to records
specific to the system we translated.
TRANSOR files containing record declarations.  The records MUST be
translated before any code containing create/fetch/replace since the
translation depends on the type of records.  Also, the record
declarations should be LOADED.  In a large translation effort, save a
file containing all needed declarations and the value of XlatedRecords
computed by translating them.
(TRANSOR 'file1) ...  ;; results in file1.TRAN and file1.LSTRAN, see
TRANSOR documentation.

To load translated files into a fresh xerox lisp system:
>From an XCL exec:
(IL:SETPROPLIST '*COMMENT* (IL:GETPROPLIST 'IL:*)) 
(IL:PUTASSOC '*COMMENT* 'IL:* IL:PRETTYEQUIVLST)
(LOAD 'LOADTRAN)
(SETQ IL:*DEFUALT-MAKEFILE-ENVIRONMENT* '(:READTABLE "XCL" :PACKAGE ???))
(SETQ IL:CMLRDTBL (IL:FIND-READTABLE "XCL"))
(LOAD 'FORMACRO.DFASL) if used interlisp for's
  ;; may need to import USER:FOR depending on packages you've set up.
(MYLOAD 'translated-records)
(MYLOAD 'file1.tran) ...

A little work with ED and FILES? and you should be able to save a
commonlisp version of your files (well, OK, a lot of work).

Suggestions and questions to one of:
darrelj@RDCF.SM.UNISYS.COM  or darrel@CAM.UNISYS.COM,
or fritzson@bigburd.prc.UNISYS.COM


     ----- End Forwarded Messages -----