1
0
mirror of synced 2026-03-15 14:47:09 +00:00

Compare commits

..

922 Commits

Author SHA1 Message Date
Larry Masinter
90c81b6f60 reduce changes: no separate MAKEFILE-NEW but fix so it will not copy from previous version if you do MAKEFILE(something NEW). 2024-04-18 12:57:42 -07:00
Larry Masinter
929690c6a3 fix FILEPKG so that MAKEFILE(NEW) never references the 'previous version' and recompiles the whole file 2024-01-30 15:09:30 -08:00
Matt Heffron
39ee2ecb5d Merge pull request #1518 from Interlisp/mth1--a-few-UNICODE-cleanups
A few fixes to UNICODE that I stumbled across.
2024-01-26 16:12:25 -08:00
Matt Heffron
a90b7ed73d A few fixes to UNICODE that I stumbled across.
READ-UNICODE-MAPPING-FILENAMES returned a bare string if FILESPEC matched 1 file (first clause of the (OR...) in join), this caused READ-UNICODE-MAPPING to fail.
SHOWCHARS referenced variable CODE that should have been C
Added FILETYPE property to UNICODE to specify TCOMPL compiler.
(Other changes are formatting by pretty printer, not mine.)
2024-01-26 14:38:04 -08:00
rmkaplan
54b2607070 Removed STORAGE.LCOM (#1511) 2024-01-19 23:53:12 -08:00
rmkaplan
971e8936b6 Replace \TEDIT.FORMATTED1 with TEDIT.FORMATTEDFILEP (#1508)
Internal \TEDIT.FORMATTED1 is being decommissioned
2024-01-19 21:49:45 -08:00
rmkaplan
e276460836 HRULE: More informative error messages (#1501) 2024-01-14 17:46:24 -08:00
Frank Halasz
ab818ff335 Merge pull request #1500 from Interlisp/repair-cpv
oops missing edit cpv
2024-01-12 17:23:16 -08:00
Larry Masinter
47d77542be oops missing edit cpv 2024-01-12 11:59:32 -08:00
rmkaplan
934d0fb7a4 Move charset management to externalformat (addresses #1454) (#1455)
* Move charset management to externalformat (addresses #1454)

Removed IMCHARSET from IMAGEOPS declaration, added FORMATCHARSETFN to EXTERNALFORMAT, put XCCS charset handling in the XCCS externalformat.

* XCCS, fixed a glitch

* UNICODE: Remove merge conflict

* Fix typo CLFUNCALL, MAKEFILE NEW and BCOMPL (versions didn't match)

---------

Co-authored-by: Larry Masinter <lmm@acm.org>
2024-01-12 11:42:22 -08:00
Frank Halasz
6420bdcf27 Fix for Issue #1472 (loadup failure on btrfs): update how cpv scripts handles hardlink versus copy (#1497) 2024-01-12 05:34:57 -08:00
rmkaplan
1d6e43e1ea Minor fixups (typos, formatting) to a few existing documentation files (#1470)
* Mostly minor fixups (typos, formatting) to a few existing documentation files

Plus converting the Unicode documentation from TXT to formatted

* Update UNICODE.TEDIT

Previous version did not have page-looks (heading location etc.)

* UNICODE.TEDIT:  write unbreakable charlook property

* Delete UNICODE.TEDIT

Master has a newer version, trying to eliminate conflict
2024-01-10 12:31:28 -08:00
rmkaplan
8837c61f85 SKETCHOPS (unhyphenated) should have been included (#1464) 2024-01-10 10:49:04 -08:00
rmkaplan
18aae01362 Suppresses size coercion for Titan 12 (#1476)
* Suppresses size coercion for Titan 12

* Typo
2024-01-10 10:48:03 -08:00
rmkaplan
a84242561a Rmk100 unicode utf 8 update (#1489)
* UNICODE:  a few additional Tedit helpers, revised documentation

* New JIS files (courtesy of Peter)

* Updated mapping files (courtesy of Peter Craven)

* UNICODE:  changed SHOULDNT to ERROR
2024-01-10 10:47:16 -08:00
Matt Heffron
70885c5a19 Merge pull request #1487 from Interlisp/mth-LockXorShift-issue-1486
change for CapsLock & Shift to be XOR vs OR.
2024-01-10 10:02:50 -08:00
Matt Heffron
57de705f39 Fix error in flag testing logic.
(No more midnight coding!)
2024-01-03 16:12:23 -08:00
Matt Heffron
7c3fa261c7 Rename KEYBOARD.SHIFTXORLOCK to SHIFTXORLOCKFLG.
(More inline with Medley/Interlisp convention.)
2024-01-03 12:37:30 -08:00
Matt Heffron
7fe4d2dcca Merge branch 'mth-LockXorShift-issue-1486' of https://github.com/Interlisp/medley into mth-LockXorShift-issue-1486
# Includes changes to make Shift XOR Lock behavior be conditional on GLOBALVAR KEYBOARD.SHIFTXORLOCK:
#	sources/LLKEY
#	sources/LLKEY.LCOM
The changes were made before the merge, and then Stashed.
2024-01-03 00:41:28 -08:00
Matt Heffron
30a4697d75 On Branch_medley-231217-3727653e: LLKEY 2024-01-03 00:22:14 -08:00
Matt Heffron
60a766574d index on Branch_medley-231217-3727653e: 3727653e Rmk96 move sketch files to library/sketch (#1446) 2024-01-03 00:22:14 -08:00
Matt Heffron
25a18f6bc0 Merge branch 'master' into mth-LockXorShift-issue-1486 2024-01-02 22:59:03 -08:00
Matt Heffron
6558a49adb change for CapsLock & Shift to be XOR vs OR. 2024-01-02 19:46:15 -08:00
Larry Masinter
4b30aa1640 update medley README to match new build instructions (#1458)
* update medley README to match new build instructions

* Remove NUL character

* Fix grammatical and typographic errors reported by Matt

* Fixed a few typos, some punctuation, a bit of wording, and removed the Docker references (Docker related files aren't in the repo anymore).

* A few more fixes

---------

Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
Co-authored-by: Matt Heffron <heffron@alumni.caltech.edu>
2024-01-01 21:35:58 -08:00
rmkaplan
3727653e23 Rmk96 move sketch files to library/sketch (#1446)
* Move all SKETCH files from library/ to library/sketch/

and rename subsidiary files SKETCHXXX to SKETCH-XXX, according to our hyphen convention.  This will allow SKETCH and all its subsidiary files to be loaded automatically when the sketch GETFN is required to display an image object.

* New files again

Somehow GITFNS produced smashed copies on the first attempt.  May have to do with the fact that Medley doesn't always report that it couldn't create a new directory, or otherwise behaves badly in that situation.
2023-12-17 16:42:59 -08:00
rmkaplan
b1294ea5e9 Rmk94 fix checkeolc macro (#1435)
* EXTERNALFORMAT: \CHECKECOLC macro confusedf ANY vs CR EOL convention

* Recompile callers of \CHECKEOLC macro

* If ANY and no CR after LF, return EOL instead of CR
2023-12-09 22:50:39 -08:00
Matt Heffron
2a9076bede Change files DEFINE-FILE-INFO (i.e., the IL:MAKEFILE-ENVIRONMENT) to fix issue #1447 (#1448) 2023-12-09 22:42:28 -08:00
rmkaplan
72456ce4ec WINDOWOBJ: READIMAGEOBJ doesn't ask for permission (#1449)
If the image object is on a hyphenated file and it can find a nonhyphenated sister, it loads that.  If that doesn't provide the getfn, it tries the original file.
2023-12-09 22:41:43 -08:00
rmkaplan
c8c4768315 WINDOWOBJ: Better handling of unknown image objects (#1436)
* WINDOWOBJ: Better handling of unknown image objects

2 changes:   If WHEREIS says that an unknown getfn is on FOO-FIE and FOO>FOO exists, then offer FOO in the mouseconfirm.  This should get all the support code (e.g. TMAX is offered instead of TMAX-NUMBER).  Issue #748.  Separately, if the getfn is not found when the file is opened (so the image object is encapsulated), the encapsulated imagebox fn will upgrade the image if the getfn exists when the object is redisplayed.

* Glitch
2023-12-02 15:51:20 -08:00
Larry Masinter
735108ecb7 Pull in newer or missing library/*.tedit files (#1398) 2023-11-29 14:05:09 -08:00
rmkaplan
f735fca83e POSTSCRIPTSTREAM: POSTSCRIPTFILEP applies also to closed files (#1434) 2023-11-29 07:14:00 -08:00
rmkaplan
560def37bc PSEUDHOSTS and .TEDIT: Apply TRUEFILENAME on PREFIX, update documenta… (#1385)
* PSEUDHOSTS and .TEDIT: Apply TRUEFILENAME on PREFIX, update documentation

Documentation addresses #1303 .  Using TRUEFILENAME makes sure it always goes to a ground instance in e.g.  (PSEUDOHOST 'MEDLEY '{MEDLEY}).

* PSEUDOHOSTS.LCOM and .TEDIT

Appear to have gotten out of step
2023-11-29 07:11:37 -08:00
rmkaplan
41f32b7db5 INTERPRESS fixes some of the Asciifont-to-NS character mappings, MATHTONS is obsolete (#1413)
* Fixes some of the character mappings from Ascii fonts into NS, moves Math mappings into Interpress

The separate lispusers/MATHTONS is now obsolete.

* INTERPRESS:  Add back empty ASCIITONSTRANSLATIONS

Turns out they were intended, not a mistake.  But that was just a shorthand for saying MODERN, as a fall back.  I made that explicit.
2023-11-29 07:09:38 -08:00
rmkaplan
ab831a46ba Add a hook to extend FILEBROWSER SEE, PDFSTREAM uses it (#1414)
So SEE of a PDF file should open up a desktop window in a pdf viewer.  (This uses PDFILEP, which looks inside the file, not at the extension.  So it might try to open a file with a wrong extension, and the viewer might fail.)
2023-11-29 07:04:58 -08:00
rmkaplan
f1cf759098 LLSYMBOL's FILEMAP was also incomplete (#1381)
This update hopefully won't reveal any other problems
2023-11-29 06:58:58 -08:00
rmkaplan
017bf88a3a FILEIO: OPENSTREAM parameters default to STREAMPROP (#1335)
also add LINELENGTH
2023-11-29 06:47:14 -08:00
Nick Briggs
b2f750e549 Restore NSPROTECTION files to lispusers (#1430) 2023-11-22 22:05:26 -08:00
Frank Halasz
8cf17ce950 Fix loadup-apps-from-full.sh so that it fails gracefully when a notecards directory cannot be found (#1428) 2023-11-21 21:40:19 -08:00
Larry Masinter
008aff1d25 EDITBMPATCHES already in EDITBM; NEW-SKETCH-COLOR saved but in Obsolete (#1379) 2023-11-20 22:58:06 -08:00
Larry Masinter
214cfb8674 Add some files to set analyzed in fuller.database (#1425) 2023-11-20 22:56:11 -08:00
Larry Masinter
2e7b88d0cc Recompile files that seemed to have \IS.NO.RANDACCESSP in compiled code (#1417) 2023-11-20 22:48:37 -08:00
Frank Halasz
14fbff63cf Merge pull request #1419 from Interlisp/fgh_LDEKBDTYPE
Set LDEKBDTYPE to X in run-medley - if not already set.  Works around issue with loading VIRTUALKEYBOARDS
2023-11-17 23:20:26 -08:00
Frank Halasz
bec32f475a Merge pull request #1420 from Interlisp/fgh_ShellBrowserGit
Fix minor issue in ShellBrowser - when using the git path was missing the web--browse subcommand.
2023-11-17 23:19:31 -08:00
rmkaplan
6e845d747f ADIR fix UNPACKFILENAME.STRING address #1416 (#1421)
The early . was seen as starting an extension, the ! then was seen as starting a version.  When the other marks caused those hypotheses to be revised, the extension's end wasn't being revised
2023-11-14 07:11:58 -08:00
Frank Halasz
459aeef74a Merge branch 'master' into fgh_LDEKBDTYPE 2023-11-13 13:07:55 -08:00
Frank Halasz
19ceac6515 Fix the git case in ShellBrowser. Was missing the web--browse argument. 2023-11-13 13:04:16 -08:00
Frank Halasz
914604a6eb Set LDEKBDTYPE to X in run-medley - if not already set. Fixes issue with loading VIRTUALKEYBOARDS 2023-11-13 12:42:34 -08:00
Larry Masinter
05f3ad19eb Update CLHS reference to use Interlisp CHLS instead; use UNIXUTILS ShellBrowser (#1412) 2023-11-13 12:12:56 -08:00
Frank Halasz
c62c183ae4 Update ShellOpen to handle versioned files; add ShellOpen into SEE-PDF in place of MacOS-specific open. (#1410)
* Update PDFSTREAM: integrate ShellOpen into PDF-SEE in place of MacOS specific calls; update how PDFCONVERTER is set to fix bug whereby it was always ps2pdf

* Fix ShellOpen so that if a file to open is versioned then that file is copied to tmp and its filename is changed from foo.pdf;25 to foo~25~.pdf and this tmp is passed to the opener instead of the original file.  This is so that the extension is preserved as the last thing when there are versions.  The extension as the last thing is used by most openers to determine the file type.

* Oops. Checked in the wriong versions of UNIXUTILS(.DFASL) last commit.  Correcting that here.
2023-11-11 11:05:24 -08:00
rmkaplan
328d3f53cd NEARESTCORNER must be onscreen (addresses #1294 (#1295)
* NEARESTCORNER must be onscreen  (addresses #1294

Mouse jumps to the nearest onscreen corner of the ghost region

* MODERNIZE:  Fixed off by one bug in NEARESTCORNER
2023-11-03 17:45:49 -07:00
rmkaplan
5b90251210 Patch to REGIONMANAGER and ADISPLAY for SCREENREGIONS (#1387)
For ADISPLAY, just added SCREENREGIONP.  Fixed typos in REGIONMANAGER.TEDIT
2023-11-03 17:39:33 -07:00
rmkaplan
713f2388c7 COMPAREDIRECTORIES, COMPARESOURCES, COMPARETEXT, EXAMINEDEFS (#1329)
* COMPAREDIRECTORIES, COMPARESOURCES, COMPARETEXT, EXAMINEDEFS

Relatively minor cleanups, little or no functionality improvements

* COMPAREDIRECTORIES:  Get AUTHOR only if selected

This may provide a little speed up.  But of more importance, almost all the array crashes I am seeing are underneath (GETFILEINFO xxx 'AUTHOR).  The UFS implementation may be smashing array space, or maybe it is just detecting the corruption.  For now, I'm eliminating this potential source of bad behavior.

* EXAMINEDEFS: Better interpretation of TYPE NIL = (FNS FUNCTIONS) with better formatting

* COMPARETEXT: fixed to avoid EOF error if EOL gets confused
2023-11-02 19:23:38 -07:00
rmkaplan
f49729cbd3 COLOROBJ never worked, move to obsolete (#1374) 2023-10-30 21:37:59 -07:00
Matt Heffron
bdf03e08a1 Modify CL:CHAR-NAME always to return string from lookup in IL:CHARACTERNAMES. (#1377)
This *seems* to fix the issue with printing "control characters" in #\Name format.
2023-10-30 19:43:13 -07:00
Frank Halasz
b19cfd5bbb Revert "Merge pull request #1331 from Interlisp/Remake-CMLARITH-filemap" (#1376)
This reverts commit e2d8c9e5ad, reversing
changes made to 9054814ef7.
2023-10-30 13:21:24 -07:00
Matt Heffron
e2d8c9e5ad Merge pull request #1331 from Interlisp/Remake-CMLARITH-filemap
CMLARAITH:  Makefile new to get fns/functions in filemap
2023-10-29 22:51:41 -07:00
Matt Heffron
2ea1321d81 Merge branch 'master' into Remake-CMLARITH-filemap
Signed-off-by: Matt Heffron <mattheffron475@gmail.com>
2023-10-29 22:38:03 -07:00
Frank Halasz
9054814ef7 Add dribble file to app-from-full loadup (#1371) 2023-10-29 10:00:59 -07:00
rmkaplan
84dead86af Patch TEDIT.DEACTIVATE.WINDOW in old Tedit (#1361) 2023-10-28 14:34:25 -07:00
rmkaplan
5e83d63567 VIRTUALKEYBOARD: fix loadup (#1262)
* VIRTUALKEYBOARD:  fix loadup

* Reorganizing VIRTUALKEYBOARDS as described in #1267

* KEYBOARDEDITOR:  fixed one bug, still is out of step

* Move KEYBOARDCONFIGS KEYBOARDEDIT to library/virtualkeyboards

This collects all files relevant to VIRTUALKEYBOARDS into the same subdirectory
2023-10-28 14:21:32 -07:00
rmkaplan
bcfeda62e1 EQUALALL tests equivalence of bitmaps and big bitmaps (#1302)
* EQUALALL tests equivalence of bitmaps and big bitmaps

* Oops, off by one

---------

Co-authored-by: Larry Masinter <lmm@acm.org>
2023-10-23 21:18:57 -07:00
Frank Halasz
45513f563b Extend changes made in PR#1356 to medley/sh et al to handle -title arguments with space; extend to handle vnc case and well as without vnc case. (#1358) 2023-10-19 17:04:40 -07:00
Frank Halasz
db084c6281 Add copy-full.sh to loadup-full.sh script to copy loadup products from the tmp directory into MEDLEYDIR/loadups - make loadup-full akin to loadup-all (#1359) 2023-10-18 20:53:24 -07:00
Matt Heffron
6c53acaca8 Merge pull request #1356 from Interlisp/EnableMedleyWindowTitleWithSpaces
Modify launcher to enable --title STRING option to work when STRING has embedded spaces (multiple words).
2023-10-18 14:01:19 -07:00
rmkaplan
fbb5a8f6f5 Expose useful subfunctions in REGIONMANAGER (#1336)
* Expose useful subfunctions

* REGISTER-TYPED-REGION creates a new TYPED-REGIONS entry

If a window is closed whose region is of an as-yet-unknown type, a new entry will be added implicitly to TYPED-REGIONS to that that region and future regions of that type can be recycled.

* If a window with a typed-region is reshaped and then closed, the typed-region is also reshaped for reuse

Also, the typed-region of a window is pushed on the front of the TYPED-REGIONS list when the window is closed, so the most recent region of that type will be used the next time.  Recency seems more intuitive than primacy
2023-10-18 07:38:27 -07:00
Matt Heffron
cb8eab788a Modify launcher to enable --title STRING option to work when STRING has embedded spaces (multiple words). 2023-10-17 23:40:26 -07:00
rmkaplan
50dc0a9269 Remove calls to openfile (#1333)
* Remove calls to OPENFILE

OPENFILE is a residual Interlisp function that returns a litatom instead of a stream.  In almost all cases, this immediate causes an error that litatom files are no longer supported.  I have found (FINDCALLERS) all the examples in lispusers/sources/library/ and replaced OPENFILE with OPENSTREAM (except for the calls from \PEEKPUP and \PEEKNS, that I didn't track down).  There was a trivai call in COMPILE.FILECHECK in COMPILE, but that function is not called anywhere.  So I removed it.

* ADIR:  remove OPENFILE calls, also another stab at \COPYSYS

With respect to \COPYSYS, this replaces the draft PR #1263.  This applies TRUEFILENAME at the start, but remembers whether it was in fact a pseudohost and restores that for the return value.  So if you start in a pseudo world you end up there.

---------

Co-authored-by: Larry Masinter <lmm@acm.org>
2023-10-17 21:54:17 -07:00
Larry Masinter
9273cffce2 pull (non-working) TCP files to obsolete (#1283) 2023-10-17 21:34:17 -07:00
rmkaplan
df8c5a52f1 Also remade filemap for CMLCHARACTER (and changed from LCOM to DFASL)
CLEANUP is confused about how to compile.  This had FILETYPE = CL-COMPILE-TYPE, with an existing LCOM.  It produced a new DFASL, but the LCOM was still hanging around.  I'm deleting the LCOM here, pushing the new DFASL.
2023-10-17 13:33:18 -07:00
rmkaplan
a219ea03e5 Improve check for closed stream in \UFSCloseFile. (#1334)
Check if the (STREAM ACCESS) bits are NIL, indicating a closed stream, and
if so do not attempt to close the file again

Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
Co-authored-by: Larry Masinter <lmm@acm.org>
2023-10-16 15:54:34 -07:00
rmkaplan
2072deb6ae GITFNS: preserves casing of pseudohost prefix-paths of medley projects (#1344)
Also, minor edit to GITFNS.TEDIT, but now also includes a Tedit timestamp.
2023-10-16 15:37:09 -07:00
rmkaplan
f6c91ee11c FONTPROFILE: specvars declaration for cleanliness (#1351) 2023-10-16 15:35:17 -07:00
rmkaplan
adc27d9684 MEDLEYDIR: Pack DSK as the default HOST on the value of (UNIX-GETENV "MEDLEYDIR") (#1282)
Co-authored-by: Larry Masinter <lmm@acm.org>
2023-10-16 14:45:29 -07:00
Matt Heffron
d92aa6395a Manager (Lispusers) grow anchor, icon, and fix typo. (#1346)
* File See operations use full path to loaded file.
Add Manager.WINDOW-ANCHOR to fix corner from which MANAGER-MAIN-WINDOW grows, and (attempt) to keep it on-screen.

* Improved handling of the ICONW for MANAGER-MAIN-WINDOW.

* Fix typo in MasterScope functions (multiple occurrences: LOADBFLG should be LOADDBFLG).
Changed to CL compiler by default (not need to go to submenu). This is my preference, so I should remove it before setting pull request.

* Manual cleanup of multiple "Edited" comments in 4 FNS.
Reverted: Changed to CL compiler by default (not need to go to submenu). (From commit f60c6362)

* Update MANAGER.TEDIT documentation file.
Fix error in previous commit. (Changes that I thought were there, were not.)
Cleanup COMMON-MAKE COMS so it can be handled by the file package, and add .LCOM file to the repo.
2023-10-14 06:39:13 -07:00
Matt Heffron
f1833861cc Merge pull request #1348 from Interlisp/medley-issue-1347
Fix for typo; issue #1347
2023-10-13 10:41:05 -07:00
Matt Heffron
270fee89e3 Fix for typo; issue #1347 2023-10-12 13:19:59 -07:00
Frank Halasz
cba04e168c Merge pull request #1342 from Interlisp/PDFSTREAM
Pdfstream
2023-10-08 23:30:02 -07:00
Frank Halasz
1e847ec274 Add ShellOpen (and ShellOpener) to UNIXUTILS; fix small bug in UNIX-FILE-NAME (#1341)
* Add ShellOpener and ShellOpen to UNIXUTILS - used to open a file using the generic opener on this machine.  Adapted ShellBrowse and ShellBrowser accordingly; fixed bug in UNIX-FILE-NAME where it fails if file does not exist and COPY is non-NIL and access is INPUT

* Add return of error strings to ShellOpen
2023-10-08 19:34:43 -07:00
rmkaplan
f765676ec4 UNIXUTILS: Add UNIX-FILE-NAME etc on top of previous ShellWhich update--should resynch 2023-10-02 12:56:57 -07:00
rmkaplan
17c72a1f2f Merge branch 'master' into PDFSTREAM 2023-10-02 12:47:02 -07:00
rmkaplan
995c6de04e PDFSTREAM: First implementation (#1260)
* PDFSTREAM:  first implementation

Makes PS file, then applies separate utility (if available) to convert PS to PDF

* POSTSCRIPTSTREAM:  Adds extra field to postscript data for PDFSTREAM filename

* HARDCOPY:  fixes printer menu

* PDFSTREAM: define PDF fonts as POSTSCRIPT fonts

* PDFSTREAM: fix convert template

* PDFSTREAM:  Fix logic around closing the postscript sub-stream

* PDF Stream:  slight generalization

* PDFSTREAM uses AFTERCLOSE streamprop so doesn't require change to POSTSCRIPTSTREAM

* UNIXUTILS: moved PROCESS-COMMAND and SLASHIT from GITFNS and PSEUDOHOST resp.

PROCESS-COMMAND executes a command in process-stream, like ShellCommand, but returns a completion code and not what happens in the shell.  SLASHIT is an approximation (doesn't deal with versions) of converting a Medley file name to its Unix equivalent, to use in commands

* GITFNS:  PROCESS-COMMAND moved to UNIXUTILS, cleanups from previous (unexamined) PR

The other PR will be cleaned out

* PSEUDOHOSTS: Moved SLASHIT to UNIXUTILS, also includes minor change in previous (unexamined) PR, to be removed

* PDFSTREAM:  wrapped FULLNAME around TRUEFILENAME

* Restore POSTSCRIPTSTREAM

* UNIXUTILS:  Added UNIX-FILE-NAME

Produces a Unix filename corresponding to a Medley file name (slashes, version number).  For use in ShellCommand an PROCESS-COMMAND.

* PDF-STREAM:  added SEE-PDF

A little stub that (on a mac) does a shell command to open Preview on the Unix-named file corresponding to a medley name

(Also added back some key functions that got lost in a bad edit)

* Pick up master changes

---------

Co-authored-by: Larry Masinter <lmm@acm.org>
2023-10-02 12:39:25 -07:00
Larry Masinter
877c6fbf17 Pick up master changes 2023-10-02 12:36:39 -07:00
rmkaplan
97b19f1b96 PDF-STREAM: added SEE-PDF
A little stub that (on a mac) does a shell command to open Preview on the Unix-named file corresponding to a medley name

(Also added back some key functions that got lost in a bad edit)
2023-10-01 23:54:23 -07:00
rmkaplan
948b0e09d1 UNIXUTILS: Added UNIX-FILE-NAME
Produces a Unix filename corresponding to a Medley file name (slashes, version number).  For use in ShellCommand an PROCESS-COMMAND.
2023-10-01 23:52:40 -07:00
Frank Halasz
de4e5f5ca4 Add cygwin build & install script to buildRealease action; remove old Windows docker build / install (#1337)
* Add cygwin-sdl build to buildLoadup workflow; add installer for cygwin-sdl on windows

* Change how buildLoadup computes latest maiko release to accomodate draft releases

* Fix call to gh release list for maiko

* Debugging call to gh release list for maiko

* Debugging call to gh release list for maiko #2

* Debugging call to gh release list for maiko #3

* Debugging call to gh release list for maiko #4

* Debugging call to gh release list for maiko #5

* Debugging call to gh release list for maiko #6

* Change maiko downloads to accoiunt for draft releases

* Change maiko downloads to account for draft releases #2

* Specify shell (powershell) for Download cygwin installler

* Few cleanup items on cygwin-install

* Update ShellWhich to use command -v instead of which because which returns to much crap on cygwin and command -v is more portable overall

* Switch from using medley-loadup & -runtime tars to medley-full-*.tgz so we get full release incl notecards; delete maiko on install and replace with cygwin maiko

* Make sure Notecards doesn't try to load its HASH fileon PostGreet - for apps.sysout

* Add xdg-utils to cygwin install to support ShellBrowser

* Odds and ends on cygwin build

* Redo medley.iss install script to use tar from Windows rather than cygwin tar because cygwin tar was messing up ACLs in windows.  Needed to change creation of medley.bat accordingly.

* Remove junk lines from buildLoadup.yml

* Restore accidently deleted line to buildLoadup.yml

* Fix multiple issues with cygwin_installer filename; arrange to remove placeholder.txt from the release assets at the end of cygwin installer

* Change name of job from windows_installer to cygwin_installer

* Fix missing GH_TOKEN is removal of placeholder.txt; fix naming of output file in medley.iss

* Fiddling with getting cygwin-installer name right

* Redoing merge of medley.sh/medley.command to handle the Darwin plus Cygwin cases; is medley.iss recreate symbolic links surrounding the medley.sh script

* Fix typos/syntrax errors in medley.sh/medley.command
2023-09-27 10:41:01 -07:00
rmkaplan
af912247b3 Restore POSTSCRIPTSTREAM 2023-09-25 20:32:17 -07:00
Frank Halasz
ebb5c739ea Fix latest issues with docker build (and Release+Docker builds) for Medley (#1326)
* fix buildRealeaseInclDocker.yml to pass secrets via inherits rather than explicitly.  Attempt to fix issue with GITHUB_TOEN not being passed to buildRelease.yml

* In buildDocker.yml, fix up calculation of medley and maiko release to accomodate new naming scheme for medley deb files

* Update Dockerfile_medley with new deb file naming convention
2023-09-25 11:34:51 -07:00
rmkaplan
1bed018db8 CMLARITH: The compiled file was bad in the previous commit
This has a FILESLOAD for lispusers/UNBOXEDOPS that somehow didn't get executed by the previous cleanup.  (That may be a separate issue with the compiler interface, not clear that it always makes the right choices even when the FILETYPE property is set.)

But this also begs the question, why is UNBOXEDOPS on lispusers?
2023-09-24 16:41:52 -07:00
rmkaplan
8a8e6fa4dc CMLARAITH: Makefile new to get fns/functions in filemap 2023-09-23 23:30:25 -07:00
rmkaplan
bf2e34841b PDFSTREAM: wrapped FULLNAME around TRUEFILENAME 2023-09-23 22:56:54 -07:00
rmkaplan
9ed6448591 PSEUDOHOSTS: Moved SLASHIT to UNIXUTILS, also includes minor change in previous (unexamined) PR, to be removed 2023-09-23 16:32:03 -07:00
rmkaplan
445de6745d GITFNS: PROCESS-COMMAND moved to UNIXUTILS, cleanups from previous (unexamined) PR
The other PR will be cleaned out
2023-09-23 16:30:47 -07:00
rmkaplan
68ed78a9f9 UNIXUTILS: moved PROCESS-COMMAND and SLASHIT from GITFNS and PSEUDOHOST resp.
PROCESS-COMMAND executes a command in process-stream, like ShellCommand, but returns a completion code and not what happens in the shell.  SLASHIT is an approximation (doesn't deal with versions) of converting a Medley file name to its Unix equivalent, to use in commands
2023-09-23 16:23:46 -07:00
rmkaplan
1ae08139c9 PDFSTREAM uses AFTERCLOSE streamprop so doesn't require change to POSTSCRIPTSTREAM 2023-09-23 16:20:30 -07:00
rmkaplan
bb4e230df4 Merge branch 'master' into PDFSTREAM 2023-09-23 15:57:53 -07:00
Frank Halasz
02665ca91b Change github workflows to provide MacOs full release zip file (#1290) 2023-09-17 23:03:18 -07:00
Frank Halasz
b819e18c64 Fix Issue#1323: buildDocker.yml Github Action is failing due to Ubuntu 22.10 being deprecated (#1324)
* Remove trailing whitespaces in buildDocker.yml; move Dockerfile_medley base back to 20.04 since 22.10 deprecated.

* In Dockerfile_medley load tzdata early so as to avaoid problems later on.

* In Dockerfile_medley do an apt update before tzdata

* Changing dockerfile_medley to be based on 22.04 to take care on glibc problems in online_medley docker
2023-09-16 18:09:34 -07:00
rmkaplan
781709e4e1 PDF Stream: slight generalization 2023-09-12 13:49:56 -07:00
Frank Halasz
b772b8383c Moving vncviewer to online.interlisp.org/downloads to bypass issues with sourceforge in buildLoadup.yml (#1319) 2023-09-04 10:39:52 -07:00
Frank Halasz
701a642fb4 Merge pull request #1308 from Interlisp/fgh_loadups3
Fix issue with tmp/logindir remaining after loadup-all and loadup-db scripts
2023-08-15 15:31:33 -07:00
Frank Halasz
7f99792afe In loadup- scripts, at end remove the tmp and tmp/logindir directories if they don't exist before the script runs 2023-08-14 23:29:38 -07:00
Frank Halasz
6a147af97f Merge pull request #1304 from Interlisp/fgh_loadups2
Revamp loadup scripts and release-medley script; sync with github workflow buildLoadup.yml
2023-08-14 10:56:57 -07:00
Frank Halasz
41b5870164 Switch comparison of timestamp tocraeted file to ensure that when the times are equal it is counted as success and not failure. Remove two second wait from loadup-mid-from-init, which was a previous attempt to solve same issue. 2023-08-13 21:13:48 -07:00
Frank Halasz
3ed4d52f53 Remove junk accidently added to loadup-db.sh. Fix CM file in loadup-db-from-full.sh to add internal/loadups to DIRECTORIES so files in this subdir can be analyzed. Add delay into loadup-mid-from-init.sh to make sure timestamp race conditions are avoided. 2023-08-07 22:30:12 -07:00
Frank Halasz
3aa01c7a38 Making @nbrigg's check for existance of LOADUP_OUTDIR and LOADUP_WORKDIR a bit fancier 2023-08-07 18:00:53 -07:00
Nick Briggs
3cefaf338c Ensure that the LOADUP_OUTDIR directory exists as part of the loadup-setup.sh 2023-08-07 17:24:38 -07:00
Frank Halasz
204605268e Remove venuesysouts from release tars 2023-08-07 14:53:33 -07:00
Frank Halasz
62422cd4ce Add changes from PR#1307 (@masinter). Can't easily merge PR#1307 in directly because MAKEINIT has moved. These changes set OK.TO.MODIFYFNS to T for all loadups to prevent loadups asking if its OK to modify system functions 2023-08-07 13:35:25 -07:00
Frank Halasz
ed6a6e4e04 move all loadups-related source files into internal/loadups; adjust scripts accordingly; move venuesysouts from loadups into internal/venuesysouts; fix issues in .CM files to allow starting loadups-all from any lisp/full.sysout 2023-08-07 12:34:11 -07:00
Frank Halasz
dbf6808bcb Merge remote-tracking branch 'origin/fgh_loadups2' into fgh_loadups2 2023-08-04 15:19:56 -07:00
Frank Halasz
126a8cfb37 Remove references to LOADUP_WORKDIR from all lisp code and instead pass the file references down from the callinf .CM files (which are now embedded in the loadup- scripts; also add /unicode subdir to the release tars. 2023-08-04 15:07:43 -07:00
Frank Halasz
1ff71ea15d update buildLOadup.yml to use new scripts/release-make-tars.sh instead of its almost but not quite equivalent make tars code 2023-08-04 12:29:40 -07:00
Frank Halasz
dfce541a18 Fix scripts/README.md 2023-08-04 12:29:40 -07:00
Frank Halasz
84391b367b First pass a complete new make-release.sh 2023-08-04 12:29:40 -07:00
Frank Halasz
346c11b0ad WIP fixing up scripts/release_medley.sh and syncing with buildLoadup.yml 2023-08-04 12:29:40 -07:00
Frank Halasz
ae2633591e Remove now obsolete sources/*.CM files; update README a bit 2023-08-04 12:29:40 -07:00
Frank Halasz
b0ec2476d5 Handle case where files already exist in LOADUP_WORKDIR - show only the newly created files - not the old ones 2023-08-04 12:29:40 -07:00
Frank Halasz
1c077d1b3d First full pass at loadups revamp. 2023-08-04 12:29:40 -07:00
Frank Halasz
ca3280f894 WIP updating loadups scripts 2023-08-04 12:29:40 -07:00
Frank Halasz
5b3cf9b7d5 Add new files left out from last commit; add RDSYS to library as part of loadups-all 2023-08-04 12:29:40 -07:00
Frank Halasz
e4c3a16ce4 Remake loadup scripts to not use MEDLEYDIR/tmp as a working dir AND cleanly separate loadup-all from loadup-db; adjust buildLoadup.yml accordingly 2023-08-04 12:29:40 -07:00
rmkaplan
41f4489e9f LLREAD uses \INCCODE.EOLC instead of \INCCODE to coerce LF and CRLF to EOL(=CR) (#1300) 2023-08-03 14:15:16 -07:00
Frank Halasz
51ef95d30f update buildLOadup.yml to use new scripts/release-make-tars.sh instead of its almost but not quite equivalent make tars code 2023-08-02 22:03:38 -07:00
Frank Halasz
0c9744455c Fix scripts/README.md 2023-08-02 16:47:04 -07:00
Frank Halasz
41608a1b27 First pass a complete new make-release.sh 2023-08-02 16:43:35 -07:00
Frank Halasz
9d26047d8c WIP fixing up scripts/release_medley.sh and syncing with buildLoadup.yml 2023-08-02 13:41:36 -07:00
Frank Halasz
48c9a82a1c Remove now obsolete sources/*.CM files; update README a bit 2023-08-02 01:02:12 -07:00
Frank Halasz
f9838ac631 Handle case where files already exist in LOADUP_WORKDIR - show only the newly created files - not the old ones 2023-08-01 23:41:39 -07:00
Frank Halasz
f514dd04c2 First full pass at loadups revamp. 2023-08-01 22:59:01 -07:00
Frank Halasz
656bb53ef6 WIP updating loadups scripts 2023-08-01 12:08:55 -07:00
Frank Halasz
c105799096 Merge pull request #1298 from Interlisp/fgh_medley.sh-sysout
Fix bug in medley.sh wherein it was ignoring sysout argument
2023-07-31 12:11:14 -07:00
Frank Halasz
d2102bfe9b Add new files left out from last commit; add RDSYS to library as part of loadups-all 2023-07-31 01:07:39 -07:00
Frank Halasz
b59e37b703 Remake loadup scripts to not use MEDLEYDIR/tmp as a working dir AND cleanly separate loadup-all from loadup-db; adjust buildLoadup.yml accordingly 2023-07-31 00:42:23 -07:00
Frank Halasz
71a2d7aac7 Fix bug in medley.sh wherein it was ignoring sysout argument 2023-07-30 13:01:17 -07:00
Larry Masinter
94269303d0 SPY.POINTERS is always T (no 2-byte atoms) (#1293)
* SPY.POINTERS is always T (no 2-byte atoms)

* Set SPY to not record entries when in \BACKGROUND-YIELD or (conditionally) backgroudn process

* Use \IGNORE.BACKGROUND as global variable, initially T; clean up declarations

* changes used DECLARE%%: incorrectly, now fixed
2023-07-30 11:35:23 -07:00
Frank Halasz
91305cc2c9 Fix whitespace typo in buildLoadup.yml (#1287) 2023-07-22 18:21:52 -07:00
rmkaplan
9b4c4a3bf7 Merge branch 'PDFSTREAM' of https://github.com/interlisp/medley into PDFSTREAM 2023-07-20 22:26:48 -07:00
rmkaplan
51d554c67e Merge branch 'master' into PDFSTREAM 2023-07-20 22:26:41 -07:00
rmkaplan
b513bb44a3 Simplify EXPORTS.ALL loading commands (#1281)
Standard FILES commands now do the right thing, no need for extra junk
2023-07-20 22:24:18 -07:00
Larry Masinter
652a9dc320 release dribbles and msfuller (#1280)
* ignore loadups/exports.all (moved)

* add fuller.database and dribble files to release
2023-07-20 21:39:15 -07:00
Larry Masinter
a678515a35 ignore loadups/exports.all (moved) (#1279) 2023-07-20 21:38:20 -07:00
rmkaplan
ca39ccf27b Merge branch 'master' into PDFSTREAM 2023-07-20 21:01:13 -07:00
Arun Welch
11ac5b7ec7 add rooms manual (scanned, no tedit found) (#1100)
* Lafite and Rooms Manuals

Add Lafite and Rooms Manuals

* Only rooms-manual, Lafite has .tedit files

---------

Co-authored-by: Larry Masinter <LMM@acm.org>
2023-07-20 20:19:23 -07:00
rmkaplan
e1cd9260b4 Merge branch 'master' into PDFSTREAM 2023-07-19 20:29:48 -07:00
Larry Masinter
9e433314d8 don't declare most interpress constants (#1193)
* rewrite INTERPRESS to not pollute pool of CL:CONSTANTP variables in common use

* update some functions that are (inappropriately) tied to INTERPRESS

* no change to SKETCHOPS needed

* still need one \IPC 'constant' from INTERPRESS

* changes to WINDOW GLOBALVARS another time

* recompile XXFILL

* fix a few other messes exposed
2023-07-19 19:11:17 -07:00
rmkaplan
b0aa518a41 Merge branch 'master' into PDFSTREAM 2023-07-19 14:57:50 -07:00
rmkaplan
9e0bfabc52 Merge branch 'master' into PDFSTREAM 2023-07-19 12:58:02 -07:00
rmkaplan
feff0cefc0 SEDIT-WINDOW: Shift-title selection conforms to standard mouse conventions (#1272)
In previous commit/PR #1256 the bksysbuf wasn't waiting for the copy/shift key to come up.
2023-07-19 12:53:46 -07:00
rmkaplan
a258a5e9f0 FILEWATCH: Shift select names, plus show PSEUDOFILENAMES (#1276)
* FILEWATCH: Shift select names, plus show PSEUDOFILENAMES

* FILEWATCH:  Copied file is a string, not an atom

Modern systems tend to allow spaces and other funky characters in filenames.  COPYINSERT doesn't automatically escape.  But generally we are moving towards strings.  (Shift-select from FILEBROWSER has the same problem)
2023-07-19 12:53:04 -07:00
rmkaplan
9529c35631 FILEBROWSER: FB.COPYFN uses COPYINSERT instead of BKSYSBUF (#1277)
So shift-selecting produces strings for file names with funky characters
2023-07-19 12:52:43 -07:00
rmkaplan
a111907bf4 GATHEREXPORTS uses standard MAKEFILE machinery (#1278)
* GATHEREXPORTS uses standard MAKEFILE machinery

So that it gets all the normal file properties (FILE, FILEDATES) when it is LOADed.  Also nothing special about setting up its reader environment

* GATHEREXPORTS again:  PRETTYDEF likes only litatom filenames

(which probably should be fixed)
2023-07-19 12:01:38 -07:00
Larry Masinter
c797d919f1 Merge pull request #1274 from Interlisp/fgh_loadups
Move exports.all to the loadups directory; add a LOADUPSDIRECTORIES to MEDLEY-INIT-VARS
2023-07-19 05:37:48 -07:00
Frank Halasz
03e59d15c8 Adding (FROM LOADUPS) whereever EXPORTS.ALL is loaded - changing from LOAD to FILESLOAD where necessary. 2023-07-18 13:39:49 -07:00
rmkaplan
ebff4f7268 PDFSTREAM: Fix logic around closing the postscript sub-stream 2023-07-17 23:04:38 -07:00
Frank Halasz
08880d550e Move exports.all to the loadups directory; add a LOADUPSDIRECTORIES to MEDLEY-INIT-VARS 2023-07-17 16:38:10 -07:00
Frank Halasz
e4b6f69e8e Merge pull request #1269 from Interlisp/fgh_ipfonts
Add ipfonts to release tars
2023-07-10 10:42:07 -07:00
Frank Halasz
52499052e8 Add ipfonts to release tars 2023-07-08 22:29:49 -07:00
Larry Masinter
b5f71670cb Merge branch 'add-bigbitmaps' 2023-07-08 13:17:18 -07:00
Larry Masinter
d21dfe1061 Merge pull request #1256 from Interlisp/Minor-updates-to-LLREAD-and-SEDIT
Minor updates to llread and sedit
2023-07-07 12:30:52 -07:00
Bill Stumbo
efae6d2911 Template for capturing 'What People are Saying' suggestions. (#1261) 2023-07-07 12:27:42 -07:00
Larry Masinter
2aae0e7bb6 put back in IRM.SMART.LOOKUP needed for helpsys from menu (#1251) 2023-07-07 12:27:06 -07:00
rmkaplan
02a6d7ad1b Updated Tedit files for a few Lispusers packages--formatting and typos (#1246)
* Updated Tedit files for a few Lispusers packages--formatting and typos

* Format OBJECTWINDOW.TEDIT, delete WHEELSCROLL.TXT

* Create CLIPBOARD.TEDIT

Small (formatted) documentation file
2023-07-07 12:25:18 -07:00
rmkaplan
4826035054 CALENDAR, AOFD: Calendar had a Y2K problem, AOFD did not allow string-streams to reopen (#1204)
* CALENDAR, AOFD:  Calendar had a Y2K problem, AOFD did not allow string-streams to reopen

There still may be some Y2K issues, I fixed the obvious ones, including how it interacted with Tedit

* try recompiling

---------

Co-authored-by: Larry Masinter <LMM@acm.org>
2023-07-07 12:18:46 -07:00
Larry Masinter
6c6856efb9 (PATHNAME NIL) now errors; don't try to add it to whereis list (#1188) 2023-07-07 11:41:56 -07:00
Larry Masinter
871bbb735f Add a few inits to SYSEDIT, obsoleting ABC (#1184) 2023-07-07 11:30:42 -07:00
Larry Masinter
08852f7b55 Add TEDIT files for many Library packages (#1181)
* WHERE-IS library doc

* Gather keyboard files, add VIRTUAL.TEDIT

* add UNIXCOMM.TEDIT

* rest of TEdit library files

* save table of contents index for reworking

* Don't move around VIRTUALKEYBOARDS files; will move in separate commit

* Add MATMULT from Envos/Medley
2023-07-07 11:25:17 -07:00
Bill Stumbo
4362618ea0 Add documentation template (#1257)
Copied from Interlisp .github repo.
2023-07-06 08:27:05 -07:00
Larry Masinter
1659c452b5 remove POSTLOADUP from fileset... was removed (#1218) 2023-07-03 16:37:59 -07:00
Larry Masinter
f5a8888aff Add .tedit files which correspond to Medley release notes (#1124) 2023-07-03 12:43:19 -07:00
rmkaplan
c281728c65 PDFSTREAM: fix convert template 2023-07-02 18:25:41 -07:00
Larry Masinter
4fed40bb85 Add BROWSERMAX to limit depth of paths graph (#1158)
* Add BROWSERMAX to limit depth of paths graph

* Update Browser to use left-button menu popup to select action
2023-06-30 16:56:54 -07:00
Larry Masinter
3cca8c4940 Fix places where rename of record LINE to XXLINE was incomplete (#1212) 2023-06-30 16:42:07 -07:00
rmkaplan
c4554894b3 PDFSTREAM: define PDF fonts as POSTSCRIPT fonts 2023-06-25 17:16:27 -07:00
rmkaplan
58196b4011 HARDCOPY: fixes printer menu 2023-06-24 15:49:31 -07:00
rmkaplan
f6a9b88b34 POSTSCRIPTSTREAM: Adds extra field to postscript data for PDFSTREAM filename 2023-06-24 15:49:18 -07:00
rmkaplan
bad19ab45f PDFSTREAM: first implementation
Makes PS file, then applies separate utility (if available) to convert PS to PDF
2023-06-24 15:48:21 -07:00
rmkaplan
d6a4b3bf88 SEDIT-WINDOW: use COPYINSERT instead of BKSYSBUF for shift-selection from titlebar
Gets the package
2023-06-20 21:12:13 -07:00
Larry Masinter
b493d98aeb fix GATHER-INFO for compiled code -- globalvars vs.bounc (#1219) 2023-06-18 21:24:23 -07:00
Larry Masinter
beb4a77195 Recompile PRETTY (#1220) 2023-06-17 21:40:34 -07:00
rmkaplan
d43846b4f4 SEDIT: SELECTC formatted like SELECTQ, copy-select from the titlebar
Fixes long-standing irritants (for me at least).  SELECTC is highlighted and format like SELECTQ and SELCHARQ.  And left-button in the title bar with the copy (shift) key down does a bksysbuf of the thing being edited.  The menu is available under the middle button, moving and reshaping still provided by modernize with the shift not down.
2023-06-17 20:18:17 -07:00
rmkaplan
28c673f296 LLREAD: CHARACTERNAMES saved with ALISTS instead of VARS commands
Also CHARACTERSETNAMES.  So that initial values don't smash or pick up the values that might otherwise be active in a development environment.
2023-06-17 20:14:00 -07:00
Frank Halasz
e067e02dde Add on:schedule to buildRelease workflow so that Medley builds happen automatically on Mondays at 1am (#1225)
* Add an On:schedule to the build release and docker workflow to build a new release every Monday at 1am

* Add an On:schedule to the build release and docker workflow to build a new release every Monday at 9am UTC (1am or 2am Pacfic time, depending on daylight savings
2023-06-11 13:40:38 -07:00
Larry Masinter
1af56ddaa2 Add .tedit files for Lafite manual and release notes -- PDFs on Google Drive (#1209)
* Add .tedit files for Lafite manual and release notes -- PDFs on Google Drive

* use 'docs' for subfolder name; wliminate dup

* Remove duplicate LAFITEMANUAL-GLOSSARY-CUSTOMER.TEDIT

---------

Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
2023-05-16 19:30:15 -07:00
Nick Briggs
16dd66a016 Pass --display/-d argument as -display not by setting DISPLAY env variable. (#1213) 2023-05-16 19:28:21 -07:00
Larry Masinter
81b74be043 Another pass on CLOSEALL simplify by calling (OPENP) (#1182)
* Another pass on CLOSEALL simplify by calling (OPENP)

* Put back in checks for CLOSEALL IOMODE USERVISIBLE

* \TERM.OFD and \LINEBUF.OFD are bound, no global

* getting rid of \OPENFILES everywhere

* one more \OPENFILES
2023-05-16 19:02:43 -07:00
Larry Masinter
f8a5d0fbe5 Rewrite code for deciding 'Good morning', 'Good evening' 'You're working late' Y2K (#1208) 2023-05-16 19:00:49 -07:00
Larry Masinter
3e0ec62d27 Prettyfileindex knows about :EDIT-BY (#1205) 2023-05-16 10:06:03 -07:00
Larry Masinter
654675661f Do not set keyboard type without knowing better (#1211) 2023-05-16 10:05:31 -07:00
Larry Masinter
3cb051ea7b Allow (CLOSALL) to work after all (#1164) 2023-04-19 19:47:11 -07:00
Frank Halasz
8bb283e0c4 Merge pull request #1154 from Interlisp/tweak-init2
Tweak INIT: HELPTIME 1 for more break windows; extend font profile
2023-04-19 18:03:08 -07:00
Frank Halasz
6fae5c14e9 Merge branch 'master' into tweak-init2 2023-04-19 17:54:43 -07:00
Frank Halasz
c58ef4ee56 Merge pull request #1161 from Interlisp/minor-usage-tweaks
minor usage tweaks
2023-04-19 17:53:57 -07:00
Frank Halasz
730fc5b678 Merge pull request #1153 from Interlisp/who-line-only
tweak WHO-LINE
2023-04-19 17:46:25 -07:00
Frank Halasz
8d54603329 Merge branch 'master' into who-line-only 2023-04-19 17:45:29 -07:00
Larry Masinter
21ceff5ad9 add internal/MAINTAIN.TXT to explain what MAINTAIN is 2023-04-18 15:21:35 -07:00
Larry Masinter
5a07e6c266 SYSEDIT also sets copyright flag 2023-04-18 15:16:07 -07:00
Larry Masinter
4a09d3a027 Init file set HELPTIME to 1 more break windows; copyright NEVER 2023-04-18 15:15:00 -07:00
Larry Masinter
691563024b Yet another Logo with parameters for substrings. WINDOW.BITMAP move to Window (#1151)
* Yet another Logo with parameters for substrings. WINDOW.BITMAP move to Window

* Added LOGOW.DFASL, so rm LOGOW.LCOM

* LOGOW: Add local variables for most of the hard-coded constants to make it easier to experiment with adjusting said constants.  Adding kerning for substring1.

* LOGOW: Add more kerning options.  Cretaed separate kerned.prin3 function.

* Set default params to Option 8.  Added some top and right margins when placing LOGOW in screen so it doesn't look so squished into the corner.

---------

Co-authored-by: Frank Halasz <frank@halasz.org>
2023-04-18 14:57:41 -07:00
Larry Masinter
0f49e248d3 Tweak INIT: HELPTIME 1 for more break windows; extend font profile 2023-04-13 09:56:16 -07:00
Larry Masinter
54782f5b21 tweak to WHO-LINE: hostname (don't use pup), change dir (don't offer directories that don't exist), package (sort so likely choices are at top) 2023-04-12 22:26:23 -07:00
rmkaplan
d34522d769 GITNFS: Doesn't error if clonepath defaults but is not required (#1123)
If CLONEPATH is NIL, no error if the clone can't be found, just prints a note.  If CLONEPATH is T, will error.
2023-03-30 09:59:27 -07:00
Larry Masinter
c501dc82fb add :EDIT-BY initials to FILECREATED (#1074) 2023-03-24 21:52:44 -07:00
Bill Stumbo
c256a8f411 Merge pull request #1110 from neauoire/patch-1
Changed wiki link to new docs url
2023-03-19 20:44:31 -04:00
Devine Lu Linvega
69dbe43d87 Update README.md 2023-03-19 16:45:17 -07:00
Devine Lu Linvega
989ec5b0b5 Changed wiki link to new docs url 2023-03-19 09:40:25 -07:00
Larry Masinter
fb1d14dfeb once more 2023-03-01 07:53:44 -08:00
Larry Masinter
6d86932d35 remake ADISPLY 2023-02-28 06:50:17 -08:00
Larry Masinter
9ada6de6b9 Revert changes in \DRAWLINE.DISPLAY and add BIGBITMAPS to loadup & exports 2023-02-28 05:48:41 -08:00
rmkaplan
12b5e90727 GITFNS: Better default directory-finding, better pseudohosts (#1064) (#1065)
* GITFNS:  Better default directory-finding, better pseudohosts  (addresses #1064)

Also updated documentation

* GITFNS:  better error message in GIT-MAKE-PROJECT
2023-02-18 17:19:29 -08:00
Frank Halasz
4b95a8b5d3 Windows installer and medley script for running Medley in Docker on Windows (#1077)
* Update docker file build to use new deb linux installers;  move Dockefile to .github/workflows since its really only useable from the buildDocker.yml workflow

* Fix typo in dockerfile location

* remove extraneous " in >>GITHUB_ENV statements

* Fix handling of TARGETPLATFORM in Dockerfile

* Trying with just one platform

* Fix issues with missing man-db in docker build workflow; added man-db to depends in deb builds for linux

* Sicthed docker from tightvnc to tigervnc to match oio.  This getting the apt package name right.

* Going back to single platform to debug this thing

* Trying with just arm64

* Removing arm/v7 from docker images.  Takes too long to build and just wastes our github actions minutes.  This is assuming its a never used feature since docker is not big on raspberry pis and their ilk.

* Fix typo in control-linux; update build_deb so that files in /usr/local installed by deb are owned by root; add ubuntu user and nano in docker file for dbebugging;  when in draft only create for x86_64 platform

* Fix typo in buildDocker.yml

* Add sudo to docker image; in docker image ensure that all /usr/local/interlisp files are owned by root

* Add securityTypes none to docker entrypoint

* Updated docker base to Ubuntu 22.10 to get fixed xrdp; add xrdp to the docker image; updated user permission in docker image;

* In Dockerfile make xrdp install noninteractive

* Update medley.sh scripts to handle docker case

* Fix a couple of typos

* BuildDcoker: added pulling latest draft release (if any) when this is a draft docker build; removed checkout of medley code cause its not used

* BuildDocker: added medley checkout backin - turns pout its needed by a bunch of actions even though I dont really think they use it

* BuildDocker: moved download assets to use gh instaed of a marketplace action becauase that action could not handle draft releases.

* Tweaking medley.sh and associated tweaks to work Windows via wsl medley and docker

* adding first pass at powershell script for windows docker and wsl

* Tuning how Xvnc, medley, and vncviewer handle the various ways of exiting - eg logout vs closing viewer window.

* Tuning vncviewer launch to make sure that tty works as expected when medley.sh runs in background

* Minor typo fixes and added extra check to use of /run/shm in medley_vnc.sh

* Added SSH_KEY secret to buildReleaseIncDocker workflow

* Gertting the add SSH_KEY secret into orkflows right this time, hopefully

* Adding TERM env variable and setting USER to medley in docker image

* Debugging medley.ps1 and adding a couple of arguments

* Typo in Dockerfile medley

* Synchronizing flag processing and usage for medley.ps1 and medley.sh; refactored medley_args.sh and medley_usage.sh code.

* Adding first pass at windows installer

* Adding first pass an inno setup script for Windows installation

* Update buildLoadup workflow and downloads page for windows installer

* Fix typo in buildLoadup

* BuildLoadup make sure windows runner uses powershell

* Another typo in buildLoadup

* Another typo in buildLoadup; damn those double quotes

* Updating handling of windows installer in buildLoadup, added vncviewer to medley.iss install

* Unknown syntax error in buildLoadup

* Another damn typo from double quotes

* buildLoadup: fixed loadup job outputs

* buidLoadup: fixed bug with COMBINED_RELEASE_TAG; fixed Upload script in windows job to be compatible with actions.script v6.

* buidLoadup: upload win installer adapted to find draft releases as well as full releases

* BuildLoadup: fixing up javascript in actions in windows job to use / instead of \ in pathname

* BuildLoadup: changing win installer update to same action used for other release assets

* Fix windows installer file name; in BuildLoadup move update downl;oad page to the Windows runner because uploading the window-installer changes the release download url, so updating the downloads page must be done after the windows installer upload.; General buildLoadup cleanup

* Run md2html to update downloads page

* Fix typo in build_deb.sh

* Removing some leftover crud in medley_usage.sh

* Fixing up windows installer a bit, mostly cosmetic

* Adding support for WSL1; mostly forcing --vnc and changing how to find open ports and displays since WSL1 networking is different tha WSL2

* Update manual page for new Windows Medley script

* First pass done for man page that incorporates new Windows medley script.  Add Xvnc wait before calling run-medley in case of docker to prevent occasonal missing X windows server error.

* Change buildLoadup to update man page to a draft if this is a draft run.
2023-02-18 06:19:57 -08:00
Frank Halasz
3fa571f798 Fix buildLoadup.yml to craete TARBALL directory if it doesn't exist (#1060) 2023-01-31 00:37:23 -08:00
Frank Halasz
10a598865f Create UNIXUTILS in library to go along with UNIXPRINTER, et al (#1051)
* Create UNIXUTILS file in library with ShellWhich function - linux which command equivalent.  Also move ShellCommand from UNIXPRINT to UNIXUTILS.

* Adding UNIXUTILS to LOADUP-FULL so it gets included in full.sysout

* Change of names from open(er) to browse(r). Refine the browse(r) functions a bit

* Minor bug fixes

* Add (FILES UNIXUTILS) to UNIXPRINTCOMS so that ShellCommand is loaded in case only UNIXPRINT is loaded.  For backward compatibility.
2023-01-30 23:43:10 -08:00
Frank Halasz
f2ef7cc8f6 Installers for Linux: workflow changes and more to support standard Linux installations (#1058)
* Adding LANG environment variable to docker image; adding MAIKO_ and MEDLEY_INSTALLDIR environment variables; Changing /usr/local/bin/run-medley to a symbolic link instead of a shell script

* Added draft input to all workflows, so that can create draft releases as well as regular releases

* Update buildDocker.yml to handle deprecation of set-output and to update versions of actions to handle node 12 to node 16 transition.

* Added scripts and updated github workflows to support creation of deb installers for Linux and WSL

* Fix minor bug in buildLoadup.yml

* First pass implementation of deb installer

* Fixing wget of vncviewer in build_deb.sh

* Fix typo in buildLoadup.yml in call to build_deb.sh

* Multiple small fixes to medley.sh from debugging.  Change postinst script and how its created in build_deb.  Add postrm script in build_deb.

* Reworking vnc portion of Medley.sh - including removing dependency on startx and xinit

* Misc fixes to medley_vnc.sh script; fix creation of postinst and postrm in build_deb.sh

* Cleaning up window geometry amd screen size in medley.sh

* Created apps.sysout loadup with rooms, notecards, clos on top of full.sysout; added plumbing for -apps flag to run-medley to run this syout; created a new init file for this sysout that calls MEDLEYDIR-INIT;  all of this is based on online.sysout

* Create UNIXUTILS file in library with ShellWhich function - linux which command equivalent.  Also move ShellCommand from UNIXPRINT to UNIXUTILS.

* Adding UNIXUTILS to LOADUP-FULL so it gets included in full.sysout

* Change of names from open(er) to browse(r). Refine the browse(r) functions a bit

* Minor bug fixes

* Update Apps.ShowDoc to new ShellBrowsefunction

* Adding apps support into the .github builds;  adding xdg-utils as dependecy in debs

* fixing bug as to where notecards is checked out in BuildLoadup.  Needs to be before loadups so app.sysout can be built

* Added defaulting to Interlisp exec tomedley.sh and APPS-INIT.  Works only in apps.sysout.  Added wlsu package to wsl debs since wlsview is not always installed by defailt.  Fixed Notefiles directories issues in Apps.Init.   Made medley.sh compute medleydir based on where the script is located. Can now work for /usr/lcal/interlisp as well as local directories.

* Added -id - feature to medley.sh so id can be directory mae.  Removed extraneous set -x commands in medley.sh from debugging.  In build_deb.sh changed compression to xz for deb files since debian does not support the zstd compression that ubuntu uses.

* For wsl deb files, make sure wslu package is not 4.0 - which is bad.  Change how we choose an open port and open display in medley_vnc.sh.  Add notecards download to build_deb.sh.  Fix type in medley.sh

* Add (FILES UNIXUTILS) to UNIXPRINTCOMS so that ShellCommand is loaded in case only UNIXPRINT is loaded.  For backward compatibility.

* Moved medley.sh and associates to script/medley dir; fixed up args to medley.sh;  added usage and --help to medley.sh

* Add comprehensive tar files to releases to match deb files for local installs; add --id -- arg to medley.sh

* Remove remaining reference to usr/local/interlisp to ensure local install works

* Fix bug in buildLoadup - couldn't file install tars

* Add medley symbolic linkto loadups, so it comes thru to local install tars

* Fix up error messaging in medley.sh scripts

* Created man page for medley and added it throughout build up, installers, etc.

* Add support for a downloads page on OIO, including creating said page while building a release

* Fix full_release_tag in downloads section of buildLoadup.yml

* Misc fixups on downloads page

* Adding online man page stored on oio static server.

* Fix minor bug in man installation in deb file
2023-01-30 22:19:07 -08:00
Larry Masinter
0c9b539bc4 masterscope extensions doc (internal) + tweak helpsys (#1048) 2023-01-17 22:23:06 -08:00
rmkaplan
b53b6c4ba7 Rmk74 run with pseudohosts (#1017)
* FILEPKG: EDITCALLERS now notices possible new stream after getting filemap

* GITFNS: cdw and cdg commands preserve pseudohost

* SAMEDIR:  match all combinations of truefilename and pseudofilename

* PSEUDOHOSTS:  Bug fix--openstream failure goes thru normal error machinery

* ADIR: Put in stubs for TRUEFILENAME, PSEUDOFILENAME, PSEUDOHOSTP

Also, fix \COPYSYS so it works with pseudhosts
2023-01-16 00:36:39 -08:00
Larry Masinter
e5593ba0dc notify \IDLING.OVER in \IDLE.OUT (#973)
\IDLE.OUT is a backgrround function. For reasons not well understood, sometimes after returning from LOGOUT, the RESETSAVED notify to \IDLING.OVER doesn't happen.
This change insures that it does.
(found during testing of LOGOUT/return from LOGOUT with changing ethernet enalbing)
2022-12-31 08:44:22 -08:00
Larry Masinter
5fea4e6666 loadup-db.sh fix -- don't rely on loadups (#1035) 2022-12-29 19:11:19 -08:00
Larry Masinter
306af20e91 The macroexpansion of UNDOABLY shouldn't depend on runtime rebinding of LISPXHIST (#1023)
The history and undo code was written before the record package; but someone introduced a DEFMACRO UNDOABLY macro to do the work. But cached macroexpansions shouldn't depend on load/run/compile time values.
2022-12-29 18:48:12 -08:00
rmkaplan
bb637c5b73 UNIXCOMM: Eliminated the new shell device in favor of a single shell device (#1034)
Also removed unused functions labeled as "obsolete" after Medley 2
2022-12-23 11:37:23 -08:00
Larry Masinter
7eb12ee68b Revert "Lmm cleanup new shell device (#1006)" (#1033)
This reverts commit 97cb04be46.
2022-12-17 17:22:41 -08:00
Larry Masinter
97cb04be46 Lmm cleanup new shell device (#1006)
* reset defaultexternalformat when returning

* Replace so *SHELL-DEVICE* is default
2022-12-02 20:48:48 -08:00
Frank Halasz
62754015b0 Update Medley build workflow to add clos to release tars and to update various actions to latest versions (#1025)
* Add clos to release tars for Medley.  To ease adding clos to Medley Online.

* Fix buildLoadup.yml to account for the fact that scripts/loadup-all.sh now automatically includes scripts/copy-all.sh.  Was failing due to redundant copying of loadup files.

* Get rid of ::set-output:: in buildLoadup.yml and replace with echo >> .  This is due to that fact that ::set-output:: has been deprecated by Github and will soon cause an error if used in a workflow.

* Update actions/checkout and robinraju/release-downloader to latest versions because versions currently being used relied on Node 12, which has been deprecated.  Newer versions of these actions use Node 16, which is still supported.

* Fix typo in actions/checkout new version number

* Oops.  Node 16 is supported by actions/checkout@v3 not by ...@v2.5.0

* Update AButler/upload-release-assets fron @v2.0 to @v2.0.2 to take care of Node 12 versus Node16 issues caused by Node 12 actions being deprecated by github.

* Fix quoting bugs on conversions from ::set-output:: to

* Try switching to the ncipollo/release-action acgtion in place of using the api to create the release and then the AButler/upload-release-assets action to upload the assets.  This is to solve the failures when try to update a release using the force input parameter.

* Adding step to delete existing release with given tag, if any.  Needed when force parameter is true.

* Fixing typo?

* Typos again?

* Start changing how RELEASE_TAG environment variable is used throughout build_loadup

* Finish changing how RELEASE_TAG environment variable is used throughout build_loadup

* Update abatilo/release-info-action to v1.3.2 to take care of ::set-output:: deprecation

* Add commit to allow testing of release builds

* Fix to Issue#1022 Error during greet

* More fix to Issue#1022.  Turns out need to reset MEDLEYDIR for AFTERMAKESYS as well as at greet time.  Discovered during loadup-online.sh with no greet file.

* Removing AFTERMAKESYS event action from (MEDLEY-INIT-VARS).  Cleaning up a bit the GREET event action in (MEDLEY-INIT-VARS).  Remove issue with MEDLEY-INIT-VARS being called after the user greet file in the AFTERMAKESYS case.
2022-11-26 15:05:45 -08:00
Frank Halasz
9d09033cc4 Fix to Issue#1022 "Error during greet" (#1027)
* Fix to Issue#1022 Error during greet

* More fix to Issue#1022.  Turns out need to reset MEDLEYDIR for AFTERMAKESYS as well as at greet time.  Discovered during loadup-online.sh with no greet file.

* Removing AFTERMAKESYS event action from (MEDLEY-INIT-VARS).  Cleaning up a bit the GREET event action in (MEDLEY-INIT-VARS).  Remove issue with MEDLEY-INIT-VARS being called after the user greet file in the AFTERMAKESYS case.
2022-11-26 11:46:41 -08:00
Nick Briggs
d9c144d966 Allow user override of -title option (#1026) 2022-11-21 13:04:07 -08:00
Nick Briggs
17dd03a358 Use -title rather than -t to specify window title (#1020) 2022-11-14 09:48:21 -08:00
Larry Masinter
382881a068 fix typos EFECT vs EFFECT in templates for CL:WHEN and CL:UNLESS (#1015) 2022-11-02 11:59:39 -07:00
Larry Masinter
d0d952a10d make SETQ and typed in calls undoable (first steps) (#996)
* First steps to make UNDO to work again

* make sure the right SETQ (CL vs IL) is used

* The change surfaced a irritating warning about the variable presumed to be SPECIAL
2022-10-25 15:40:41 -07:00
Larry Masinter
d5d21397d4 another pass at variable initialization after logout savevm sysout makesys (#1003)
This corrects some errors in the handling of initializing variables across SAVEVM, LOGOUT, SYSOUT and MAKESYS.
This is all now handled by MEDLEY-INIT-VARS (function and variable) which is called as an EVENTFN.
BEFOREMAKESYS (invoked by ENDLOADUP) clears the variables to a default setting (all directories are just {DSK}).
The other "BEFORE" events save away the current values of the variables in MEDLEY-INIT-VARS.

In order to get this to work it was necessary to change a hack for deciding where to find EXPORTS.ALL and WHEREIS.HASH. Now  if you do `./scripts/loadup-all.sh` to make a full, lisp sysouts, exports.all and whereis.hash it will still build the sysouts in tmp/ but will also "link" new versions in loadups (and library for exports.all). This replaces the previous hack scanning the sysout name for "tmp/".
MEDLEY-INIT-VARS had been called both by the AROUNDEXITFN and AFTER*FORMS.
2022-10-25 14:43:57 -07:00
Larry Masinter
7a4470ce8b Rework MEDLEYDIR before/after logout to substitute instead of reset (#998)
* Rework MEDLEYDIR before/after logout to substitute instead of reset

* debugging

* working when changing home directory

* fix bug and removed redundtant declarations
2022-10-24 07:10:45 -07:00
Larry Masinter
32ff7b7649 DEFAULTPRINTINGHOST can have list members as per comments (#999) 2022-10-23 23:35:50 -07:00
Nick Briggs
096d860ac8 Update \SENDMESSAGE.RESTARTABLE usage of OPENSTRINGSTREAM (#997)
\SENDMESSAGE.RESTARTABLE unconditionally used OPENSTRINGSTREAM on its
argument, which is not usually a string. Now, only use OPENSTRINGSTREAM
if the argument is a string, otherwise pass it unchanged to TEDIT.
2022-10-16 17:31:14 -07:00
Larry Masinter
418b1df00d run-medley has a -NF option in caps used by loadup, means no fork (#978) 2022-10-13 20:35:37 -07:00
rmkaplan
ba90344080 MODERNIZE: Fix bug in MODERNWINDOW (Issue #972 ) (#976) 2022-10-13 16:08:28 -07:00
Frank Halasz
0eac6efb61 Fix Issue#985 HELPSYS/CLHS.LOOKUP fails when MEDLEYDIR not writeable. (#994) 2022-10-13 10:48:42 -07:00
Larry Masinter
540aff091c When restarting after logout, don't print warning on closed stream (#990) 2022-10-12 12:00:43 -07:00
Larry Masinter
3f244f6cd3 Change SYSTEM-EXTERNALFORMAT to more accurately guess the external format (#987) 2022-10-10 22:29:21 -07:00
Larry Masinter
58557d383a Fix simple typo in UNIXCOMM (#979) 2022-10-10 18:57:26 -07:00
Larry Masinter
882fbacf59 when constructing a stream, it might not have a FDEV -- allow it to print (#984)
* when constructing a stream, it might not have a FDEV -- alow it to print

* Stream with no FDEV just prints as Stream
2022-10-10 18:56:43 -07:00
Frank Halasz
70ce516e0c Merge pull request #983 from Interlisp/save-clhs-index
the hyperspec is static -- don't need to read the index
2022-10-10 00:03:57 -07:00
Larry Masinter
fdb573c761 the hyperspec is static -- don't need to read the index 2022-10-09 16:43:34 -07:00
Larry Masinter
06368f95eb run-medley should not quote patterns in 'case' command, either useless or broken (#977) 2022-10-08 10:04:46 -07:00
Larry Masinter
654ebc359c Temporary workaround until larger fix is done (see issue #768 (#971) 2022-10-07 15:06:32 -07:00
Frank Halasz
4e38802325 Merge pull request #965 from Interlisp/rmk71--upper-case-file-names
COMPAREDIRECTORIES:  upper-case-file-names
2022-10-04 11:32:01 -07:00
rmkaplan
b43b63b287 COMPAREDIRECTORIES: Oops 2022-10-03 12:06:38 -07:00
rmkaplan
016097e8bf COMPAREDIRECTORIES: upper-case-file-names
Plus typo fixes in the TEDIT file.

Note that the MATCHNAME has always been uppercase, and that the directory matching has been filtered using the FILEDIRCASEARRAY
2022-10-03 12:01:16 -07:00
Matt Heffron
99321e7951 Add .gitattributes so *.TEDIT, *.LCOM, *.DFASL, and *.SKETCH are always treated as binary (and the lowercase versions). (#957) 2022-10-03 08:02:30 -07:00
Frank Halasz
8e4fc4ab74 Fix Issue#961: GITFNS - {GMEDLEY} changed by LOGOUT/return from LOGOUT (#962)
* TEDIT-PF-SEE:  typo

* GITFNS:  Typo and better behavior on gwc delete

Message instead of trying to delete NIL

* GITFNS: Fix merge-base in PRC #958

* Fix Medley Issue #961 - {GMEDLEY} changed by LOGOUT/return

Co-authored-by: rmkaplan <ron.kaplan@post.harvard.edu>
2022-10-03 07:59:22 -07:00
rmkaplan
c005cf86bf Rmk70: minor fixups for GITFNS and TEDIT-PF-SEE (#956)
* TEDIT-PF-SEE:  typo

* GITFNS:  Typo and better behavior on gwc delete

Message instead of trying to delete NIL

* GITFNS: Fix merge-base in PRC #958
2022-10-01 13:54:40 -07:00
Larry Masinter
ecc2b22207 IDLE.PROFILE has LOGOUT and SAVEVM options; add some delays in IDLE hacks (#948)
* IFLE.PROFILE has LOGOUT and SAVEVM options; add some delays in IDLE hacks

* add extra delays so the demos work more like intended

* IDLEDEMO loads lispusers with idle hacks

* make sure NOTIFY.EVENT \IDLING.OVER is called

* clean up resetsave

* slow down KINETIC

* Redo logic to minimize diffs with 1992 version

* minor tweaks to \IDLER for making sure mouse doesn't hang
2022-09-28 22:39:31 -07:00
Larry Masinter
d0945f7a5f Update HELPSYS to find CLHS (Common Lisp HyperSpec) and lispusers/library docs (#917)
* Update HELPSYS to find CLHS (Common Lisp HyperSpec) and lispusers/library docs

* restore lost edits; fix package inclusion for XCL and LISP

* mere with previous commit

* try again
2022-09-22 09:01:40 -07:00
Larry Masinter
add65a9397 MANAGER.DFASL errored when loading -- cl:compile-file(manager) now (#945) 2022-09-21 18:03:08 -07:00
Matt Heffron
0474f924a4 This is the Histmenu+Manager+Clipboard branch WITHOUT the changes to Clipboard (since there were issues with conflicting key bindings) (#944) 2022-09-20 07:49:23 -07:00
rmkaplan
a387094eab Rmk68: Fix GITFNS PRC file lists, plus a few minor fixups (#937)
* INSPECT:  Allow optional user-specified tags in window titles to help keep track of multiple instances of the same datatype

* DWIM:  Remove warning about order of evaluation change that happened in 1980

* BREAK-AND-TRACE:  remake to get functions in filemap

* GITFNS, COMPAREDIRECTORIES:  prc file list correlates with github PR web page

* DWIM, DWIMIFY:  Removed WARNUSER and its calls

* INSPECT:  Value of INSPECT is the inspect window
(as IRM says it should be)
2022-09-18 08:10:15 -07:00
Larry Masinter
541a07e09b XORCursorPatch is 1186 only (#938) 2022-09-15 12:56:39 -07:00
Larry Masinter
5ee5482dd2 GETDEF binds variable when getting for edit -- needed by loops rather than a unreliable STKPOS (#926) 2022-09-13 13:22:06 -07:00
Larry Masinter
095beef454 misc lispusers changes -- UNIXYCD, lsee (#889)
* Move cd, ls, pwd to it's own little lispusers (needs documentation)

* add .TXT documentation, also patch lsee script to translate ^ and _ to up and left arrow

* Add document for CONDITIONGRAPH
2022-09-13 12:04:23 -07:00
Larry Masinter
06a7356b00 add IOCHAR to exportfiles and export \CATRANSLATE (#933) 2022-09-11 21:31:58 -07:00
Larry Masinter
147abac04c CL:ROOM no longer errors (#890)
With 4-byte atoms it no longer makes sense to report atom-space separately.
2022-09-05 20:27:08 -07:00
Larry Masinter
56a52af6b9 Revert "IDLE will LOGOUT instead of SAVEVM if ONLINEP (#904)" (#922)
This reverts commit fad70d4947.
2022-08-29 14:53:15 -07:00
Larry Masinter
fad70d4947 IDLE will LOGOUT instead of SAVEVM if ONLINEP (#904)
* IDLE will LOGOUT instead of SAVEVM if ONLINEP
* patched some idle hacks fora  better show
* idle.random chooses an idle program at random among those loaded
2022-08-26 11:27:48 -07:00
Larry Masinter
f4c91ec419 LispUsers art (#914) 2022-08-25 09:02:04 -07:00
Larry Masinter
f5e48847c9 thie problem only shows when you switch EDITMODE but have some SEDIT windows open (#912) 2022-08-24 07:24:08 -07:00
Larry Masinter
b90bf65be9 Move pick to lispusers (#881)
* Make PICK a Lispusers module

* PICK moved to lispusers, HCFILES moved to test repo (currently new/printing)

* redo PICK documentation

* Update documents and projects choices

* more testing and restore lost edits to TEDIT

* fix some typos
2022-08-14 13:25:17 -07:00
Larry Masinter
d379bcc102 Files have been commited to test repo, remove from medley (#878) 2022-08-14 12:14:54 -07:00
rmkaplan
39a7512458 Rmk66: 2 little glitches, plus GITFNS prc dealing better with forking (#887)
* VTCHAT:  Changed name of CHARSET field to avoid ambiguity

Even though field was never referenced

* INSPECT: WHERE argument was passed incorrectly to datatype subfunction

* GITFNS: Better recognition of funny cases (colon) etc

Reconciled with Larry's previous commit

* COMPAREDIRECTORIES:  Bug fix in separate-panel display
2022-08-12 22:01:04 -07:00
Larry Masinter
431d80fb3c Eliminate duplicate declarations for TABLEBROWSER record, remove TABLEBROWSERDECLS file (#877)
* Eliminate duplicate declarations for TABLEBROWSER record, remove TABLEBROWSERDECLS file

* change packages that used to load TABEBROWSERDECLS SOURCE to just LOADCOMP TABLEBROWSER

* make sure full RECORD is saved

* ARCHIVETOOL update of ARCHIVEBROWSER but no docs and looks like PARC-only
2022-08-12 11:23:40 -07:00
Larry Masinter
78b76f6801 GIT-INIT called after return to LOGOUT or SYSOUT etc; add option of making subdirectory to repo (#883) 2022-08-11 10:56:27 -07:00
Larry Masinter
16517cdfc5 Remove bignum test from \INSERTTREE -- was just a debugging aid (#863) 2022-08-10 21:09:12 -07:00
Nick Briggs
902d542121 IBM EGA fonts renamed (#882)
* Added IBM-EGA fixed pitch font files

* move IBM-EGA fonts to file names that will be recognized

Co-authored-by: Matt Heffron <heffron@alumni.caltech.edu>
2022-08-10 20:22:54 -07:00
Tim Bradshaw
c708f2ac55 make /usr/local/bin/medley run the right medley (#885)
welcome @tfeb
2022-08-10 11:12:28 -07:00
Larry Masinter
43e6801341 copying format info to match the ultimate destination doesn't work for displaystreams (#875) 2022-08-09 12:44:35 -07:00
Larry Masinter
27a6063ce9 \RPLPTR when run interpreted doesn't work with large vmem pointers (#866)
* \RPLPTR when run interpreted doesn't work with large vmem pointers

* oops, misread maiko N_OP_rplptr; this is closer

* Make LLNEW UFNs and functions run renamed match maiko interp wrt high 4 bits
2022-07-30 19:22:37 -07:00
Larry Masinter
cd6b64efa2 unsafe.to.modify only warns if redefining compiled with interpreted (or in original UNSAFE.TO.MODIFY.FNS (#852)
* unsafe.to.modify only warns if redefining compiled with interpreted (or in original UNSAFE.TO.MODIFY.FNS

* Add list of functions you said OK to modify
2022-07-26 23:15:27 -07:00
Larry Masinter
222da55f69 Compile color files to allow color imageobj -- even though color doesn't work yet (#864) 2022-07-26 23:12:42 -07:00
rmkaplan
92f85c5957 Rmk64: mainly separate panels for GITFNS display, FILEPOS speed up (#862)
* HRULE:  Add a PREPRINTFN for horizontal rules

Looks better in plaintext files

* GITFNS, COMPAREDIRECTORIES:  Group earler/later in separate segments

GIT-CDBROWSER-SEPARATE-DIRECTIONS defaults to T

* FILEIO: INITVARS rather than VARS for FILING.TYPES

To avoid contamination with values from other files (like LAFITE)

* FILEPKG: SEPRCASE in EDITCALLERS includes comma and quote even if no DWIMIFYCOMPLFG

Also seprate the caseinsensitive UPPERCASEARRAY from the SEPRCASE array

* IOCHAR: Open code the call to \INCCODE.EOLC

About a 30% speed up in the slow (casearray/skip) case.  Eventually macros should be defined for the externalformat interface functions, for now it is nice to be able to trace/break them.

* EXTERNALFORMAT: a little bit of cleanup

particularly around EOLC
2022-07-25 19:12:52 -07:00
rmkaplan
6376579b1c Rmk63 backccode peekccode eolc (#853)
* EXTERNALFORMAT,UNICODE,XCCS: Consistent naming of \PEEKCCODE(.EOL), \BACKCCODE returns the code

It was confusing that the naming of the peek functions was inconsistent with the inccode and backccode functions with respect to the EOLC qualifier.  Now uniformaly, the unqualified names (\PEEKCCODE, \BACKCCODE, \INCCODE) do not do any EOL interpretation.  The qualified-name functions (\PEEKCCODE.EOLC, \INCCODE.EOLC, \BACKCCODE.EOLC) do EOL interpretation.

Also, the \BACKCCODE interface is changed so that it returns the code corresponding to the bytes that it passed over.  This simplifies some of the callers.

* Clients of \PEEKCCODE \BACKCCODE and .EOL

Small changes either to fix inconsistencies (backing, reading, peeking with inconsistent EOL interpretation), updating the names in a few other cases, a few simplifications.

* glitches in ATERM, HARDCOPY updates
2022-07-21 10:36:19 -07:00
Larry Masinter
5db76b4998 compile COLOROBJ for image object getfn (#854) 2022-07-21 10:18:24 -07:00
rmkaplan
2b1d39b544 MAIKOCOLOR: Newer version than the one in master? (#846)
I have this one in my working directory, and it seems to be bigger than the one in the repo and its previous version is later than the version in the repo.  Maybe this is better?  I putting this out as a draft for people to look at.
2022-07-20 23:36:32 -07:00
rmkaplan
a23ce42726 Rmk62 old tedit formats and nits (#851)
* TEDIT-FIND, TEDIT-OFD: Read old-format TEDIT files

TEDIT-OFD also traps non-stream TEXT arguments that should no longer propagate

* EDITKEYS: Only BKSYSBUF when TEDIT has the TTY

Also, changed the name from Function Keys to Tedit Keys, made the shrunk window open on left-click

* COMPAREDIRECTORIES: better format when one of the columns is empty

* GITFNS: "cob next" asks to confirm the parent branch

* TEDIT-FILE:  Pass TEXTSTREAM to TEDIT.GET.OBJECT

* TEDIT-FILE again:  same problem in readers for old formats

* Eliminate (OPENTEXTSTREAM "")
2022-07-20 22:52:25 -07:00
Larry Masinter
3c26eeb964 remove .IMPTR files (byproduct of hardcopy of tedit Interlisp Manual) (#849) 2022-07-20 20:21:42 -07:00
rmkaplan
e5961cde2c Merge pull request #850 from Interlisp/loadup-passthru-NF
Use -NF (no fork) on ldinit during loadup
2022-07-20 12:01:04 -07:00
Larry Masinter
8441c257d5 Use -NF (no fork) on ldinit during loadup 2022-07-20 08:04:38 -07:00
Larry Masinter
96b5a70b90 make tmp dir if not there; add README for scripts (#844) 2022-07-18 16:22:14 -07:00
rmkaplan
0d13ed6a9d Merge pull request #847 from Interlisp/tmp-without-slash
run-medley tmp/full.sysout add tmp
2022-07-18 12:14:37 -07:00
Larry Masinter
f3b73a5756 run-medley tmp/full.sysout add tmp 2022-07-18 12:13:22 -07:00
rmkaplan
a54888734e FONT, EDITFONT: Cleanup strike font reading and writing (#845)
EDITFONThad its own slightly different version.  Now centralized in FONT with slight adjustments to internal interfaces.
Note that we don't have a way of writing AC font files, as near as I can tell
2022-07-17 21:22:56 -07:00
rmkaplan
06664219ca Rmk57 mostly gitfns improvements, other minor cleanups (#843)
* MAKEINIT:  Remove bogus non-ascii character from comments

* UPCSTATS: move to obsolete

* GITFNS: better interface to process stream

Now only looks at the process return code, gets all output only from redirected streams.  Also offers to increase the diff.renameLimit if it is too small for the branch comparison.

* COMPAREDIRECTORIES:  reformat browser output

The lengths are now in their own column.  Also, the < and > are in different columns, to make it easier to pick out which side is newer.

* CLIPBOARD.TXT: documented that it uses (SYSTEM-EXTERNALFORMAT)

* GITFNS:  Fixed a glitch in the renameLimit

* GITFNS: Test for gh

* COMPAREDIRECTORIES:  Fix loadup record sequence

* Don't overwrite fixed NCFILES in MEDLEY-UTILS

* SKETCHOBJ and TEDIT-FILE already merged

Co-authored-by: Larry Masinter <LMM@acm.org>
2022-07-17 19:13:25 -07:00
rmkaplan
331f748652 Merge pull request #837 from Interlisp/TEDIT3-Refactor-TEDIT.BUILD.PCTB
Tedit3 refactor tedit.build.pctb
2022-07-17 16:09:02 -07:00
Nick Briggs
e2748dc556 Merge branch 'master' into TEDIT3-Refactor-TEDIT.BUILD.PCTB 2022-07-17 15:51:41 -07:00
Larry Masinter
c1fb892333 fix to HCFILES to pick up sketch files; bug fix sketch (#840)
* fix to HCFILES to pick up sketch files; bug fix sketch

* redo HCFILES patch to pick up .SKETCH and .TXT files
2022-07-17 13:04:43 -07:00
Larry Masinter
c437b6c3bb fix oklibrary and use to not fail when file has been renamed (#842) 2022-07-17 05:55:03 -07:00
Frank Halasz
6ff047828e Part of fix to Issue #795. buildLoadup.yml workflow now auto-generates release notes, allowing for release to be created in non-draft status. (#841) 2022-07-16 21:38:47 -07:00
rmkaplan
4238dc3888 Rmk56 filepos with external formats #3 (#827)
* TESTUPF:  Move from internal/ to internal/test/unpackfilename

to be parallel with filepos

* IOCHAR:  FILEPOS respects external format (#3)

* FILEPKG: EDITCALLERS speed up with new FILEPOS

* internal/test/filepos:  Testing jig and cases for new FILEPOS

* EXTERNALFORMAT, IOCHAR: fix external-format glitches
2022-07-16 21:30:54 -07:00
rmkaplan
7a220ddcba Tedit2 move tedit files to separate tedit subdirectory attempt 2 (#836)
* TEDIT files: deleted from library/, renamed to library>tedit.TEDIT-xxx

* PSEUDOHOSTS:  Error if file won't open

* LOADUP-*, MEDLEYDIR, UNICODE

Adjustment for TEDIT-xxx, plus moving UNICODE to the beginning of LOADUP-LISP, with UNICODEDIRECTORIES creating in MEDLEYDIR
2022-07-16 21:24:32 -07:00
rmkaplan
41bb28f01e Merge pull request #839 from Interlisp/loadup-fixes
loadup and run-medley script bug fixes
2022-07-16 16:58:26 -07:00
Larry Masinter
2728839bc7 fix typo 2022-07-16 16:04:33 -07:00
Larry Masinter
2120f5f458 loadup and run-medley script bug fixes 2022-07-16 11:51:58 -07:00
rmkaplan
8ee32f6243 Rmk55 gitfns with redirect (#826)
* CLIPBOARD, FILEIO: external format

CLIPBOARD uses SYSTEM-EXTERNALFORMAT.
FILEIO:  added sourceparameters argument to COPYFILE, so format can be specified.

* GITFNS:  rework to avoid hanging process stream

Redirects command output to tmp output and error streams, at most only looks for a COMPLETED signal in the process stream (which still sometimes hangs)

* EXAMINEDEFS:  Asks for a menu position on a keyboard call

(Otherwise, the chunk menu may be buried under the TTY window)
2022-07-15 18:01:30 -07:00
rmkaplan
efa4ae1019 TEDIT-FILE: Split up TEDIT.BUILD.PCTB into separate subfunctions
Should be easier to update and extend.  Not clear that the code for making a string piece is still needed here, since we interpret strings as file names.  So this may be further simplified.  I hope this also will give us a better handle on some of the file inconsistencies, by isolating the readers for formatted and unformatted files.
2022-07-14 22:09:10 -07:00
rmkaplan
8c75696e65 LOADUP-*, MEDLEYDIR, UNICODE
Adjustment for TEDIT-xxx, plus moving UNICODE to the beginning of LOADUP-LISP, with UNICODEDIRECTORIES creating in MEDLEYDIR
2022-07-14 18:49:58 -07:00
rmkaplan
17792da409 PSEUDOHOSTS: Error if file won't open 2022-07-14 18:48:54 -07:00
rmkaplan
f721045f7c TEDIT files: deleted from library/, renamed to library>tedit.TEDIT-xxx 2022-07-14 18:46:04 -07:00
rmkaplan
de3185002c LLDISPLAY, WINDOW, BIGBITMAPS: share common DSPCREATE, ensure formats (#824) 2022-07-09 17:14:34 -07:00
rmkaplan
c93e620624 Rmk53 added system externalformat (#823)
* CLSTREAMS: Fix EOL/external format on error stream (synonym and 2-way) #815

* CMLFORMAT: makefile NEW to get functions in filemap

* CLSTREAMS: cleanup formats for more types

* FILEIO:  Add readonly bit in streams for external-format

* UNIXCOMM, EXTERNALFORMAT: Introduce STREAM-EXTERNALFORMAT
2022-07-09 17:12:27 -07:00
rmkaplan
718d9f988c Rmk52 fix external format for error stream (#817)
* CLSTREAMS: Fix EOL/external format on error stream (synonym and 2-way) #815

* CMLFORMAT: makefile NEW to get functions in filemap

* CLSTREAMS: cleanup formats for more types

* FILEIO:  Add readonly bit in streams for external-format
2022-07-09 17:08:16 -07:00
Larry Masinter
06953f408a fix #411 scanfilehelp suggested 1100support (#766) 2022-07-08 12:23:00 -07:00
rmkaplan
32e8f44d9a Merge pull request #804 from Interlisp/more-unsafe
mark \ fns and SI fns as potentially unsafe to run interpreted
2022-07-04 12:37:35 -07:00
Larry Masinter
25e791de4f pull more newer library lispusers internal(/library) files from envos (#813) 2022-07-03 21:24:36 -07:00
rmkaplan
d7ca40ebeb Rmk51 end game of external format integration (#814)
* Compile device-creation functions for new default interface

* UNICODE:  minor bug

* LLINTERP: MOVD? APPLY* to SPREADAPPLY*

* External format interface: a few more adjustments

* CLSTREAMS: Recompile, no source change

* PRETTYFILEINDEX: suppress when printing gitmaps to a non-display stream

* UNIXCOMM: Default format comes from device

Also, I seemed to have reverted back to LCOM with FAKE-COMPILE-FILE
2022-07-03 18:49:04 -07:00
Larry Masinter
f86be45834 Add documents from envos/LISPCORE/internal/docs (#812) 2022-07-02 22:08:47 -07:00
Larry Masinter
32128f5e19 MEDLEY-UILS loadup-db run-medley fixes (#808)
* MEDLEY-UILS loadup-db run-medley fixes

* UNIXCOMM compile to DFASL; only set UTF-8 if getenv(LANG). loadup-db no lisp.virtualmem
2022-06-28 11:45:59 -07:00
Frank Halasz
0d07ed6379 Remove Draft status from Medley release in buildoadup.yml to fix Issue #795. (#796) 2022-06-27 12:44:48 -07:00
rmkaplan
9660232d6e Rmk50: TERMINAL fonts plus fixed masterscope conflicts (#806)
* EDITFONT:  CHARSET in  interface

* IDLEHAX, LIFE, TMAX-ENDNOTE:  Clean up conflicts in making full masterscope DB

* FONT:  Add charset coercion for TERMINAL

* TERMINAL fonts:  Remove bogus character set files

so that better coercions can take place
2022-06-27 11:49:36 -07:00
rmkaplan
13e2b5cda6 Merge pull request #805 from Interlisp/process-utf8
assume process streams are UTF-8
2022-06-26 18:43:07 -07:00
rmkaplan
648335bfec Rmk49: responds to #800 (#803)
* TEDIT, TEXTOFD:  Pass FORMAT in PROPS to OPENSTREAM

In TEDIT and OPENTEXTSTREAM.  I don't think TEDIT interprets the external format, but at least the info is there

* WINDOW: CREATEW prompts on one line

It was calling PROMPTPRINT twice, which resulted in orphan-looking lines

* EXAMINEDEFS: Propagate textwidth to COMPARETEXT

* COMPARETEXT: propagate height/width of text windows, for linelength

#800

* GREP:  Will work with external formats, after FILEPOS update

Line printout could be better, if e.g. it is a Lisp source file, but...

* EXAMINEDEFS:  Propagate window width to COMPARETEXT, for LINELENGTH

* GITFNS: added fetch before git log

* PSEUDOHOSTS: Pseudohost-streams are now registered on the PH device, not the target device

* EXTERNALFORMAT, XCCS:  Globalvar declaration in wrong place

Also updated \CHECKEOLC macro

* GITFNS:  moved git fetch to beginning of prc

* GREP:  Propagated OUTSTREAM
2022-06-26 18:18:44 -07:00
Larry Masinter
8c7f42e595 assume process streams are UTF-8 2022-06-26 17:46:19 -07:00
Larry Masinter
e64a02dcfb try SYSEDIT without DFNFLG PROP 2022-06-25 18:23:01 -07:00
Larry Masinter
ae07d213f0 mark \ fns and SI fns as potentially unsafe to run interpreted 2022-06-25 18:03:00 -07:00
rmkaplan
c92622e09e Merge pull request #799 from Interlisp/rmk48
Rmk48: Miscellaneous minor updates: TEDITFILE, GITFNS, EXTERNALFORMAT, EDITINTERFACE
2022-06-22 22:52:10 -07:00
rmkaplan
90c38de8db GITFNS: If test is cloned under git-test, makes a gitfns project by default 2022-06-22 16:39:01 -07:00
rmkaplan
0ebec570e6 TEDITFILE: added TEDIT.GET.PASSWORD
Returns the password (= format version indicator) of a TEDIT formatted file, NIL if not a tedit file
2022-06-22 16:30:35 -07:00
rmkaplan
217938c104 EXTERNALFORMAT: Add \FORMATBYTESTRING, EOLC arg to \INCCODE.EOLC
Also, STREAM can be given as the format argument to \EXTERNALFORMAT, gets the stream's format.

Atoms (LF, CR, CRLF, ANY) allowed for EOL specs (caller won't need exports.all)
2022-06-22 16:28:03 -07:00
rmkaplan
5e629cebc9 EDITINTERFACE: Case-independent match of leading initials on a change-comment
Also, matching initials are recognized with or without a colon
2022-06-22 16:25:50 -07:00
rmkaplan
b320333ac1 PRINTFN: rename variabl
to clarify that it counts byte, not characters
2022-06-22 16:24:16 -07:00
Frank Halasz
16d5779db4 Fix inputs: clause in buildDocker.yml (#794) 2022-06-21 16:54:58 -07:00
rmkaplan
c5eb54a3dc Rmk46: Minor changes to comparison functions (#789)
* COMPARETEXT: Inverted nodes stay inverted when scrolled

* COMPARESOURCES: Remove unused stub for browsing in TEDIT window

* COMPAREDIRECTORIES: Upgrade to new LISPFILETYPE, add CD-COMPARE-FILES

CD-COMPARE-FILES interface to compare 2 given files, not whole directory
2022-06-13 17:07:56 -07:00
rmkaplan
3c7fb08932 Rmk47: TEDIT, GITFNS, COREIO (#791)
* COMPARETEXT: Inverted nodes stay inverted when scrolled

* COMPARESOURCES: Remove unused stub for browsing in TEDIT window

* COMPAREDIRECTORIES: Upgrade to new LISPFILETYPE, add CD-COMPARE-FILES

CD-COMPARE-FILES interface to compare 2 given files, not whole directory

* TEDIT:  Show only file name, not stream address

* COREIO: preserve STREAMPROPS on stream reopen

* GITFNS:  Various project and git-interface cleanups
2022-06-13 15:20:41 -07:00
Nick Briggs
f262c98f53 Fixes test in run-medley for inferred medley directory (#793) 2022-06-12 08:35:54 -07:00
rmkaplan
9c8d9df1ac Rmk45 testupf to internal, tedit pathnames, minor doc changes (#787)
* TESTUPF:  Moved to internal

* CLIPBOARD.TXT, MODERNIZE.TEDIT, WHEELSCROLL.TXT: Minor edits

* TEDIT, TEXTOFD:  CL:PATHNAMES are recognized as file names for opening
2022-06-04 18:32:56 -07:00
rmkaplan
894ecd6d0c Merge pull request #777 from Interlisp/rmk42--ADIR-has-new-UNPACKFILENAME.STRING
ADIR, TESTUPF:  New version of UNPACKFILENAME.STRING with test tool
2022-06-04 15:24:27 -07:00
rmkaplan
7eb0f28db4 Merge pull request #775 from Interlisp/rmk41--TEDIT-interprets-strings-as-filename
Rmk41  tedit interprets strings as filename
2022-06-04 15:23:14 -07:00
Larry Masinter
d3d2534eb1 Fixes to HCFILES from MEDLEY-UTILS to convert TEdit files to postscript 2022-06-02 17:18:29 -07:00
rmkaplan
b9994581d4 Merge pull request #780 from Interlisp/rmk44--Lispusers-to-obsolete
Rmk44  lispusers to obsolete
2022-05-24 17:36:01 -07:00
rmkaplan
ff29872150 Merge pull request #778 from Interlisp/rmk43--Move-lispusers-spline-and-c150-fonts-to-subdirectories
Move lispusers> strike and c150 fonts to subdirectories
2022-05-24 17:35:22 -07:00
rmkaplan
cb122f4c58 Move lispusers c150 and strikefont directories to obsolete/lispusers/ 2022-05-24 16:15:46 -07:00
rmkaplan
205de6fd1b ENDNOTE to obsolete (newer version in TMAX>TMAX-ENDNODE 2022-05-24 16:15:13 -07:00
rmkaplan
45b4edf040 Move lispusers> strike and c150 fonts to subdirectories
Next step will be to move the subdirectories to obsolete/
2022-05-23 22:23:06 -07:00
rmkaplan
51d9e995e1 ADIR, TESTUPF: New version of UNPACKFILENAME.STRING with test tool
See TESTUPF.TXT for testing information
2022-05-23 12:48:41 -07:00
rmkaplan
4910ea5660 MODERNIZE.TEDIT: documentation migrated from .TXT 2022-05-22 19:15:38 -07:00
rmkaplan
59f71f04c2 MACHINEINDEPENDENT: Added LISPFILETYPE
Returns type and dates in a single call
2022-05-22 14:56:47 -07:00
rmkaplan
107ea72a67 TEDIT, TEXTOFD: String TEXT is filename
Adds TEXTSTRING as a separate entry to be used when strings are not names but characters to be edited
2022-05-21 23:56:03 -07:00
rmkaplan
48ebc675a7 Rmk40 shakedown gitfns projects (#774)
* GITFNS:  smoothed out some project glitches

Also added "titlestring" to cob command when creating a new branch.
cob next "fixed a bug" will create the next branch for the current initials with the title string appended.

* MACHINEINDEPENDENT:  DOFILESLOAD tries packing on DIRECTORY as well as DIRECTORIES
2022-05-21 19:55:00 -07:00
Larry Masinter
d2ce98d131 restore-versions now sets date of version to date of commit (#624) 2022-05-16 16:49:22 -07:00
rmkaplan
8bfbe99367 Rmk38: Added git "projects" to GITFNS, plus minor updates to directory/source comparisons (#771)
* SETSTRINGLENGTH.TEDIT: Orphan TEDIT file, no code in lispusers

It will be restored when the code it goes with is moved over from LFG

* COMPAREDIRECTORIES: minor fix

* COMPARESOURCES:  Add IGNORECOMMENTS flag

* GITFNS: Add new "project" capability for multiple clones

The TEDIT file got smashed, so new features are not yet documented.  Should work as before for the Medley project.  If you set up unix variables LOOPS or NOTECARDS to point to their local clones (or just name the clones git-loops or git-notecards as sisters to your MEDLEYDIR), you should be able to do prc loops or prc notecards.

* Update GITFNS.TEDIT

Repaired the Tedit smash

* EDITINTERFACE:  All date comments at the same comment level

* EDITINTERFACE:  Improved date alignment

* GITFNS again:  added cdg and cdw commands
2022-05-13 12:50:16 -07:00
rmkaplan
d28bcf19fe Rmk36: A single commit added to rmk35 so I can test pr inclusion marking (#762)
* PSEUDOHOSTS: GETHOSTINFO of pseudohost goes to true host

* CMLPATHNAME:  Remove unused PARSE-NAMESTRING1

Avoid stumbling on it in future maintenance.  Also, remake filemap for functions and defmacros

* SAMEDIR, COMPAREDIRECTORIES: FILENAMEFIELD → FILENAMEFIELD.STRING

in a few places.  No need to hash atoms

* LLCHAR:  expose $$READONLY in inpname I.s.opr
2022-05-11 18:52:01 -07:00
rmkaplan
e0ec580fd5 Rmk35: A little FILENAMEFIELD cleanup (#763)
* PSEUDOHOSTS: GETHOSTINFO of pseudohost goes to true host

* CMLPATHNAME:  Remove unused PARSE-NAMESTRING1

Avoid stumbling on it in future maintenance.  Also, remake filemap for functions and defmacros

* SAMEDIR, COMPAREDIRECTORIES: FILENAMEFIELD → FILENAMEFIELD.STRING

in a few places.  No need to hash atoms
2022-05-11 18:48:44 -07:00
rmkaplan
b796727165 Rmk37 prc menu shows superset relations (#764)
* PSEUDOHOSTS: GETHOSTINFO of pseudohost goes to true host

* CMLPATHNAME:  Remove unused PARSE-NAMESTRING1

Avoid stumbling on it in future maintenance.  Also, remake filemap for functions and defmacros

* SAMEDIR, COMPAREDIRECTORIES: FILENAMEFIELD → FILENAMEFIELD.STRING

in a few places.  No need to hash atoms

* LLCHAR:  expose $$READONLY in inpname I.s.opr

* GITFNS: prc menu shows superset relations

* GITFNS:  Sort the prc menu

* EDITINTERFACE:  Better edit-date management

* PRETTYFILEINDEX: Destination can be any imagestream, not just display

* TEDIT-PF-SEE:  Use SEE instead of COPYTO IMAGESTREAM

to get better formatting of PRETTYFILEINDEX
2022-05-11 18:40:13 -07:00
rmkaplan
dcba1a2d60 Merge pull request #747 from Interlisp/git-release
update README and release-notes
2022-05-01 12:23:25 -07:00
rmkaplan
3f401c52a3 Merge pull request #758 from Interlisp/rmk33
Rmk33: file-system interactions:  (sub) directory enumeration (#648 #741 #752) etc.
2022-04-26 22:21:36 -07:00
rmkaplan
3de8a6d028 GITFNS: Doesn't hang on pagefull, cob improved 2022-04-24 13:53:31 -07:00
rmkaplan
d5a7d144bd COMPAREDIRECTORIES: A little bit better on DEPTH 2022-04-24 13:51:26 -07:00
rmkaplan
3364a4af07 COPYFILES: respects DEFAULTEXT/VERS in single no-stars case 2022-04-24 13:48:23 -07:00
rmkaplan
74a43b9dea LLCHAR: Expose interation variables fo I.S.OPRS instring inpname...
So can be used (carefully) in more, trickier situations.  $$OFFSET also now is the index of the current character
2022-04-24 13:46:57 -07:00
rmkaplan
3a4852cf8b UFS: Reworked directory enumeration
Eliminated dependence on DEFAULTEXT and DEFAULTVERS, better job at subdirectories
2022-04-24 13:44:39 -07:00
rmkaplan
79fd39f15c FILEPKG: Added DEPTH=2 to EDITCALLERS, reopen stream after LOADFILEMAP 2022-04-24 13:39:44 -07:00
rmkaplan
3b9a825482 ADIR: added FILENAMEFIELD.STRING 2022-04-24 13:37:49 -07:00
rmkaplan
9f5a43abd1 DIRECTORY: minor cleanup, comments 2022-04-24 13:36:50 -07:00
rmkaplan
eb33dcc7eb FILEIO: Added DEPTh parameter to \GENERATEFILES
Binds FILING.ENUMERATION.DEPTH, uses free value of DEPTH not specified
2022-04-24 13:36:31 -07:00
rmkaplan
26308b385c Rmk29: FINDFILE-WITH-EXTENSIONS, DOFILESLOAD, WHEREIS #741 (#745)
* MACHINEINDEPENDENT: better searching for foo-fie

FINDFILE-WITH-EXTENSIONS, DOFILESLOAD

* MEDLEY-UTILS, PRINTFN:  WHEREIS/PF know about foo>foo-fie

* WHERE-IS:  Just MAKEFILE-NEW to get FUNCTIONS into the filemap

* ACE does LOADCOMP itself

* MACHINEINDEPENDENT:  FINDFILE-WITH-EXTENSIONS recognized SUBDIRECTORY

* SPELLFILE:  Calls FINDFILE-WITH-EXTENSIONS at the top

So FINDFILE and FILE-NOT-FOUND will consider FOO>FOO-FIE for file FOO-FIE
2022-04-24 11:34:15 -07:00
rmkaplan
e22f10b19a Rmk30 WHEREIS for missing GETFN, TMAX fixed (#749)
* MACHINEINDEPENDENT: better searching for foo-fie

FINDFILE-WITH-EXTENSIONS, DOFILESLOAD

* MEDLEY-UTILS, PRINTFN:  WHEREIS/PF know about foo>foo-fie

* WHERE-IS:  Just MAKEFILE-NEW to get FUNCTIONS into the filemap

* ACE does LOADCOMP itself

* MACHINEINDEPENDENT:  FINDFILE-WITH-EXTENSIONS recognized SUBDIRECTORY

* SPELLFILE:  Calls FINDFILE-WITH-EXTENSIONS at the top

So FINDFILE and FILE-NOT-FOUND will consider FOO>FOO-FIE for file FOO-FIE

* WINDOWOBJ:  Missing GETFN does WHEREIS #748

* TMAX*:  Localize IMAGEFNS

The various IMAGEFNS were defined on TMAX itself, not on the file where the functions were (esp GETFN).

Also fixed some dependencies.  With new WINDOWOBJ, TMAX.TEDIT finds its image objects.

* WINDOWOBJ again:  SYSLOAD the GETFN file

Co-authored-by: Larry Masinter <LMM@acm.org>
2022-04-24 11:32:59 -07:00
rmkaplan
1eccc2e59b Rmk31 Move all TMAX* files to TMAX>TMAX* (#750)
* MACHINEINDEPENDENT: better searching for foo-fie

FINDFILE-WITH-EXTENSIONS, DOFILESLOAD

* MEDLEY-UTILS, PRINTFN:  WHEREIS/PF know about foo>foo-fie

* WHERE-IS:  Just MAKEFILE-NEW to get FUNCTIONS into the filemap

* ACE does LOADCOMP itself

* MACHINEINDEPENDENT:  FINDFILE-WITH-EXTENSIONS recognized SUBDIRECTORY

* SPELLFILE:  Calls FINDFILE-WITH-EXTENSIONS at the top

So FINDFILE and FILE-NOT-FOUND will consider FOO>FOO-FIE for file FOO-FIE

* WINDOWOBJ:  Missing GETFN does WHEREIS #748

* TMAX*:  Localize IMAGEFNS

The various IMAGEFNS were defined on TMAX itself, not on the file where the functions were (esp GETFN).

Also fixed some dependencies.  With new WINDOWOBJ, TMAX.TEDIT finds its image objects.

* Move TMAX files to TMAX>

Given the WHEREIS change for GETFN and the FINDFILE-WITH-EXTENSIONS in SPELLFILE, TEDIT(TMAX.TEDIT) opens and all of its imageobjects are found and loaded from the TMAX> files.

* Push relocated files again:  (COPYFILES screwed up)

* Delete TMAX.INDEX   garbage file
2022-04-23 21:36:23 -07:00
Fulton Browne
f9f1038efb Fixed some bad doc's (#751)
* Fixed some bad doc's

* Minor change
2022-03-22 21:56:51 -07:00
Larry Masinter
196f771c41 update README and release-notes 2022-03-16 18:06:12 -07:00
Larry Masinter
8400f7bee8 rename migration for new conventions; restore smashed IDLEHAX.TEDIT & sh permissions (#740) 2022-03-09 22:59:25 -08:00
Larry Masinter
a14d1ef405 remove controversial lispusers PAGEHOLD VTCHAT from MEDLEYDIR-INIT (#739) 2022-03-09 22:58:33 -08:00
Frank Halasz
ba8dc92045 Adding xclip into Medley docker image to support CLIPBOARD library package (#738) 2022-03-09 12:36:38 -08:00
Larry Masinter
6ec792510f simplify DEFAULTFILETYPELIST initialization (#735) 2022-03-08 09:41:50 -08:00
Larry Masinter
5e6a035614 remove fonts/xerox already in displayfonts (#734) 2022-03-07 22:06:12 -08:00
rmkaplan
43b0120f2a DIRECTORY: Added DEPTH parameter for FILEING.ENUMERATION.DEPTH (#720)
* DIRECTORY:  Added DEPTH parameter for FILEING.ENUMERATION.DEPTH

* DIRECTORY:  Added DEPTH parameter to FILDIR
2022-03-07 16:58:47 -08:00
rmkaplan
157b98fa9b Merge pull request #731 from Interlisp/rmk28
Rmk28 A few more file cleanups
2022-03-07 16:30:11 -08:00
Larry Masinter
b859649f00 moving obsolete lispusers; delete some junk files (#730)
* lispusers [HIJK]* sort out

* lispusers [LM]* sort out

* more cleanup
2022-03-07 16:19:27 -08:00
rmkaplan
3af82b4aff Create TIMESROMAN08-MIR-C0.DISPLAYFONT
For some reason, I had this but it wasn't in the master.  Don't know why.
2022-03-07 15:17:13 -08:00
rmkaplan
0f36b20f7f DocumentationTemplate.TEDIT TEDITDORADOKEYS.DATABASE
This is an old version of the template file.  The database file isn't necessary
2022-03-07 15:16:39 -08:00
rmkaplan
a84dcf8f57 CMLDEFFER: MAKEFILE-NEW to get FUNCTIONS in filemap for PF 2022-03-07 15:15:33 -08:00
rmkaplan
d035c4270f XREF is obsolete
Functionality is in TMAX-XREF
2022-03-07 15:14:54 -08:00
rmkaplan
e7e297c45c Merge pull request #729 from Interlisp/lmm17
more odds and ends from promote-internal
2022-03-07 14:50:57 -08:00
Larry Masinter
0bdba59aa9 more odds and ends from promote-internal 2022-03-07 13:15:16 -08:00
rmkaplan
831aa94cb4 Rmk27 GITFNS for renaming, minor other convenience adjustments (#728)
* GITFNS, COMPAREDIRECTORIES: more on renaming and copying

* MODERNIZE: use Wborder for the top for windows without titles

* DIRECTORY:  DEPTH as a parameter

* FILEPKG:  EDITCALLERS does FILDIR if FILES contains *

* GITFNS: Don't error on a non-existent "deleted" file
2022-03-07 12:38:35 -08:00
rmkaplan
74dc52b73f GITFNS: Fix CDGITDIR for < >, interpret C(opy) (#726) 2022-03-05 21:16:45 -08:00
rmkaplan
405845937d Merge pull request #698 from Interlisp/move-lispusers-lists
Move LispUsers documents to subdir for later sorting
2022-03-05 17:37:40 -08:00
Larry Masinter
ef24b9815d Fix MEDLEYDIR when NOERROR specified to not error and return correct path (#721) 2022-03-05 15:10:01 -08:00
rmkaplan
7bde19453e Merge pull request #711 from Interlisp/medley-logow
Medley logow
2022-03-04 21:08:44 -08:00
rmkaplan
a544855c08 Merge pull request #712 from Interlisp/odds-n-ends
Odds n ends
2022-03-04 21:08:09 -08:00
Larry Masinter
156b14851b Add MAKESYSDATE to logo window title, just delete Venue logo code 2022-03-04 19:49:07 -08:00
Larry Masinter
b95e68766d Fix bug introduced by 'changes to%' => ':CHANGES-TO' (#717) 2022-03-04 16:59:22 -08:00
Larry Masinter
3c35f6459b FINDFILE-WITH-EXTENSIONS update only (#708) 2022-03-04 16:49:05 -08:00
Larry Masinter
c68f84219a Fix bug in :CHANGES-TO :PREVIOUS-DATE not finding file changes 2022-03-02 16:53:33 -08:00
Larry Masinter
0f663ac5f5 forgot fn from KOTOLOGOW 2022-02-28 21:49:57 -08:00
Larry Masinter
6de8d3ec77 Move internal/library to internal, xerox font dirs, loadup and medleydir (#709)
* Move internal/library to internal, xerox font dirs, loadup and medleydir

* and MEDLEYDIR too

* mised some changes in 'promote/internal'

* tiny typo
2022-02-28 21:44:12 -08:00
rmkaplan
acc08e0dd7 Rmk23 Minor updates for COMPAREDIRECTORIES, GITFNS, REGIONMANAGER (#710)
* REGIONMANAGER:  TTY as a reference window

* GITFNS: Fix GITFNS.TEDIT, add DRAFTS as a prc parameter

so the menu shows the draft pr's for comparison

* COMPAREDIRECTORIES: only show differences in text-compares

Don't bother showing the unchanged chunks.
2022-02-28 21:30:26 -08:00
Larry Masinter
8eb9efdcc7 more greet file tweaks 2022-02-28 21:23:58 -08:00
Larry Masinter
f0f8b59ad8 LOGOW now Medley / based on KOTOLOGOW 2022-02-28 21:19:41 -08:00
rmkaplan
111ebe2d27 Merge pull request #706 from Interlisp/rmk22
Rmk22  Minor fix ups for comparisons, GITFNS for renamed files
2022-02-28 14:30:20 -08:00
rmkaplan
fbf33fe8e5 GITFNS: fix-ups prompted mostly by the pattern of git renames 2022-02-26 22:16:50 -08:00
rmkaplan
d3b1c6a3b4 Further cleanup of comparison functions
Mostly for cosmetics or convenience, a few glitches
2022-02-26 22:16:07 -08:00
rmkaplan
ab8da79d30 Merge pull request #703 from Interlisp/hyperdesk-needs-rooms
move hyperdesk to rooms for later review
2022-02-26 12:00:27 -08:00
Larry Masinter
c35a92db11 Loading VTCHAT should set it as default (#696) 2022-02-25 20:07:49 -08:00
Larry Masinter
601bc94fb7 obsolete many lispusers (#702)
* obsolete many lispusers

* NSDISPLAYSIZES isn't obsolete
2022-02-25 14:40:37 -08:00
rmkaplan
200b73c39d Merge pull request #699 from Interlisp/idlehax
patch some idle hacks and merge in IDLEDRAIN
2022-02-25 14:14:55 -08:00
Larry Masinter
72811d5bea move lafite files to library/lafite for later sorting (#697)
* move lafite files to library/lafite for later sorting

* more lafite lispusers
2022-02-24 20:31:39 -08:00
Larry Masinter
8045087be3 move hyperdesk to rooms for later review 2022-02-24 20:19:20 -08:00
Larry Masinter
1e4501be8e EOL convert .lisp files 2022-02-24 19:48:38 -08:00
rmkaplan
eb84efa12b Merge pull request #695 from Interlisp/tedit-no-font
Change OPENTEXTSTREAM to not error when finding display font (for hardcopy)
2022-02-24 19:34:23 -08:00
Larry Masinter
7c24032530 add lispusers/README.md 2022-02-24 19:26:25 -08:00
Larry Masinter
4002f75be8 Was merged into MEDLEY-UTILS 2022-02-24 19:23:51 -08:00
Larry Masinter
2ec33f860c useless IDLESWAP, no docs 2022-02-24 19:09:53 -08:00
Larry Masinter
071f8e5004 patch some idle hacks and merge in IDLEDRAIN 2022-02-24 19:03:49 -08:00
Larry Masinter
aad2344d82 odds and ends -- 2022-02-24 18:59:15 -08:00
Larry Masinter
018a464db4 Move LispUsers documents to subdir for later sorting 2022-02-24 18:49:08 -08:00
Larry Masinter
f940246eb1 Change OPENTEXTSTREAM to not error when finding display font (for hardcopy) 2022-02-24 17:51:37 -08:00
Larry Masinter
4ae11aebf4 get rid of unused font files from medley release (#679)
more cleanup from promote-internal destructuring
2022-02-24 10:14:16 -08:00
Larry Masinter
ae1d6536ef remove unused Xerox files.Z and shorten dir name (#692) 2022-02-24 05:06:45 -08:00
Larry Masinter
d734ec9d45 Move test files to its own repo (#691) 2022-02-23 20:00:19 -08:00
Bill Stumbo
0fc31e1183 Merge pull request #670 from Interlisp/masinter-patch-README
Update README.md
2022-02-22 07:44:16 -05:00
rmkaplan
17a3a5a93e Merge pull request #686 from Interlisp/rmk21
Rmk21 Comparison tools, Tedit string-args in Lafite files
2022-02-20 08:15:14 -08:00
rmkaplan
db8c951887 Comparison tools: Cosmetic fixes, a few glitches 2022-02-19 18:37:42 -08:00
rmkaplan
c4fac75f0a LAFITE files: Tedit--strings are filenames
more of #666
2022-02-19 18:35:11 -08:00
rmkaplan
160cf35f91 TEDITWINDOW: Fix offscreen scrolling #669 2022-02-19 18:32:24 -08:00
rmkaplan
ac1fcd2e2e BROWSER: missing specvars, added MODERNWINDOW
This should be included with Masterscope
2022-02-19 18:29:37 -08:00
Frank Halasz
e292ff99db Fixing up confusion between Docker username and Docker namespaces. Hopefully will fix docker login issues with buildDocker workflow. (#677) 2022-02-12 17:31:43 -08:00
Arun Welch
615885a0fa New version of IRM (#665)
* New version of IRM

New version of the IRM, updated to Medley.

* moved to docs/medley-irm as discussed
2022-02-12 14:05:10 -08:00
Frank Halasz
b2315a9b10 Fgh002.1: Workflow to test Docker Hub Login in this repo (#675)
* Complete revamp of the buildRelease and buildDocker workflows for Medley.  Also adding the buildReleaseInclDocker composite workflow.

* Add testLogin workflow to test Docker Hub login.
2022-02-12 09:40:01 -08:00
Frank Halasz
9dc01167c3 Complete revamp of the buildRelease and buildDocker workflows for Medley. Also adding the buildReleaseInclDocker composite workflow. (#674) 2022-02-11 21:27:28 -08:00
rmkaplan
66091a2375 Rmk20: Eliminate string arguments to TEDIT, move some bogus files to obsolete (#668)
* Eliminate string arguments to OPENTEXTSTREAM  #666

Empty string replaced by NIL, mostly.  Otherwise, string wrapped in OPENSTRINGSTREAM.  TEDIT hasn't yet been modified, just all the callers.

* INDEX, NGROUP:  move to obsolete   #667

* HELPSYS:  Add proper FILETYPE property

* ROOMS files:  Also updated for TEDIT string arguments
2022-02-07 13:56:05 -08:00
Larry Masinter
ca33b92033 Update README.md 2022-02-06 17:57:05 -08:00
rmkaplan
fe90ac5f9f Rmk19 (#664)
* PSEUDOHOSTS: Overlay a file system at the end of a path in another file system

New package, please look through it.

* REGIONMANAGER:  added RELCREATEPOSITION, allow for arguments to be spread

If the WIDTH argument looks like a list of arguments, the arguments are spread out.  Means that a relative region can be passed through intermediate functions.

* EXAMINEDEFS:  More control over regions and windows

Examination windows are returned so that callers can manipulate them

* TEDIT-PF-SEE:  tf respects reader environment and bold faces of DEFUN and DEFMACRO names

* COMPAREDIRECTORIES:  refactored for more flexibility and easier maintenance

Also, based on SPY, made more internal operations work on streams that are located and created once, rather than on file

Added CDMERGE to merge CDVALUES for different subdirectories, to permit scrolling of all differences in a single browser window

* COMPARESOURCES:  Region for CS browser is passed through, window is returned

Also tried to eliminate mismatching of simple edit timestamps

* COMPARETEXT: Files can be input streams, region is passed in, window is returned

* COMPAREDIRECTORIES again:  Fixed a promptwindow bug

* GITFNS:  New package for comparing and copying back and forth from My Medley to the git clone

* REGIONMANAGER:  Added CLOSEWITH and MOVEWITh

Primitives for building hierarchically dependent window clusters

* PSEUDOHOSTS:  Added PSEUDOHOSTNAME, hierarchical hosts #663

For hierarchical hosts (hosts whose prefixes are extensions of the prefixes of other pseudohosts), always the pseudofilename is always the shortest one.  See #663 for more details

* EXAMINEDEFS:  Fix prettyprint of non-function expressions

* GITFNS, Comparison files:  Use CLOSEWITH and MOVEWITH abstractions for window hierarchies
2022-01-31 09:51:50 -08:00
rmkaplan
b791bff070 Rmk19: Updates and remaining components for managing comparisons and interactions between git and Medley (#658)
* PSEUDOHOSTS: Overlay a file system at the end of a path in another file system

New package, please look through it.

* REGIONMANAGER:  added RELCREATEPOSITION, allow for arguments to be spread

If the WIDTH argument looks like a list of arguments, the arguments are spread out.  Means that a relative region can be passed through intermediate functions.

* EXAMINEDEFS:  More control over regions and windows

Examination windows are returned so that callers can manipulate them

* TEDIT-PF-SEE:  tf respects reader environment and bold faces of DEFUN and DEFMACRO names

* COMPAREDIRECTORIES:  refactored for more flexibility and easier maintenance

Also, based on SPY, made more internal operations work on streams that are located and created once, rather than on file

Added CDMERGE to merge CDVALUES for different subdirectories, to permit scrolling of all differences in a single browser window

* COMPARESOURCES:  Region for CS browser is passed through, window is returned

Also tried to eliminate mismatching of simple edit timestamps

* COMPARETEXT: Files can be input streams, region is passed in, window is returned

* COMPAREDIRECTORIES again:  Fixed a promptwindow bug

* GITFNS:  New package for comparing and copying back and forth from My Medley to the git clone
2022-01-27 22:32:49 -08:00
rmkaplan
ab8e97ff7b Rmk18 (#655)
* ADIR, COREIO:  Just move FILEDIRCASE array from COREIO to ADIR
Logically better place, my fear about loadup interactions was unfounded (I got burned before with bittables, but this is just a simple array)
* SPY:  Modernize the spy window
* TEDITHCPY: Make Interpress conditional on Interpress being loaded
This was an old edit that somehow got lost
* TEDITSCREEN:  Remove WAITINGCURSOR
The RESETSAVE for WAITINGCURSOR somehow wasn't working, but not worth debugging because we now don't have a wait.
* TEDITWINDOW:  Use TTYINPROMPTFORWORD instead of PROMPTFORWORD
2022-01-27 15:37:47 -08:00
Larry Masinter
f8e4bbd7cb Merge pull request #651 from Interlisp/rmk17
Rmk17:  Minor tweaks to sources
2022-01-27 10:36:15 -08:00
rmkaplan
c7272e78f2 ADIR: Only first colon before marks a device #651 2022-01-25 17:24:19 -08:00
rmkaplan
f531e89dde COREIO: More accurate directory name processing, added FILEDIRCASEARRAY
FILEDIRCASEARRAY does upper/lower case equivalents plus /<> for testing directory string equivalents.  Could be in COREIO, but that's probably too early in the loadup.
2022-01-24 21:12:56 -08:00
rmkaplan
293c973f1d EDITINTERFACE: bug fix in date-comment recognition, improvements to dated change-note behavior 2022-01-24 21:10:45 -08:00
rmkaplan
fe62e8e6e2 LLCHAR: Extend STRING.EQUAL to take CASEARRAY as argument
still defaults to the previously built-in reference to UPPERCASEARRAY
2022-01-24 21:09:15 -08:00
rmkaplan
51f0c19ad1 DMISC: Generalize argument to FLASHWINDOW 2022-01-24 21:07:01 -08:00
rmkaplan
1438ddba1f UFS, CMLFILESYS: Honor default extension and version for subdirectory enumeration 2022-01-24 21:06:20 -08:00
rmkaplan
ae3851ccf9 CMLPATHNAME: reprinted for FUNCTION/MACRO filemap 2022-01-24 21:04:10 -08:00
rmkaplan
e3f9a4ca9a FILEIO: Recirculated FDEV fields that had been evacuated during external format transformation
FDEV1...FDEV4 now available (used by PSEUDOHOSTS)
2022-01-24 21:03:15 -08:00
rmkaplan
7966704f1e PRETTY: DEFMACROS in filemap for PF, CLSTREAMS remade to test 2022-01-24 20:57:56 -08:00
rmkaplan
311e4f049c ADIR: Device colons before directories 2022-01-24 20:55:52 -08:00
rmkaplan
e119314a9e Remove move bogus % in filenames (#650) 2022-01-24 20:35:50 -08:00
rmkaplan
27d4df45e6 Merge pull request #645 from Interlisp/lmm15
Lmm15
2022-01-20 22:38:20 -08:00
Larry Masinter
312e99b0f4 Add templates for CL:WHEN CL:UNLESS 2022-01-15 20:26:40 -08:00
Larry Masinter
82eaacc542 patch some idlehacks to not draw so fast 2022-01-15 20:09:52 -08:00
Larry Masinter
479de87011 set MAKESYSNAME to MEDLEY: (e.g., as used by LOOPS) 2022-01-15 15:59:36 -08:00
Larry Masinter
5445a12b7e phase 0 of GATHER-INFO is setup for rest 2022-01-12 15:06:10 -08:00
rmkaplan
fadf81012b Rmk13: More infrastructure for flexible region management and support for comparisons (#641)
* TEXTOFD:  Property OBJECTBYTE returned instead of image objects

This allows COMPARETEXT to work on TEDIT files

* ATBL: Default reader environment uses *DEFAULT-EXTERNALFORMAT* instead of :XCCS constant

* CMLEXEC:  Fix FILETYPE property

It had CL:COMPILE-FILE, but the directory had LCOMs.  Changed to :FAKE-COMPILE-FILE.

* FILEIO:  single place for EOL specification

Now only in SETFILEINFO, not separately in \DO.PARAMS.AT.OPEN

* WINDOWOBJ:  COPYINSERT now uniformly allows lists of objects

It was incomplete.

* COMPARETEXT: Now works for TEDIT files

* EXAMINEDEFS: side-by-side attached SEDIT windows for comparing alternative definitions

* OBJECTWINDOW:  container for arbitrary image objects

* ATBL: fixed typo

* MODERNIZEP: pass shape and move to main window if PASSTOMAINCOMS

* EXAMINEDEFS:  Remove EXAMINEDEFS-REGION

Replaced by equivalent functionality in new package REGIONMANAGER

* TEDIT:  adjustments to give caller control of window region

* Revert "TEDIT:  adjustments to give caller control of window region"

This reverts commit aec12b41f0.

* Revert "EXAMINEDEFS:  Remove EXAMINEDEFS-REGION"

This reverts commit 0c670bbc56.

* TEDIT, TEDITWINDOW:  Adjustments for propagating (typed) regions

* EXAMINEDEFS: added EXAMINEFILES for looking viewing files side-by-side

Fix titling glitch, add EXAMINEFILES

* OBJECTWINDOW: minor cleanup

* REGIONMANAGER: new package for managing typed regions, relative regions, and constellation regions

* TEDIT-PF-SEE:  commands for scrollable PF and SEE alternatives
2022-01-09 09:18:28 -08:00
rmkaplan
792edfdad5 Rmk14: Browsers for COMPAREDIRECTORIES, COMPARESOURCES, COMPARETEXT for TEDIT files (#642)
* TEXTOFD:  Property OBJECTBYTE returned instead of image objects

This allows COMPARETEXT to work on TEDIT files

* ATBL: Default reader environment uses *DEFAULT-EXTERNALFORMAT* instead of :XCCS constant

* CMLEXEC:  Fix FILETYPE property

It had CL:COMPILE-FILE, but the directory had LCOMs.  Changed to :FAKE-COMPILE-FILE.

* FILEIO:  single place for EOL specification

Now only in SETFILEINFO, not separately in \DO.PARAMS.AT.OPEN

* WINDOWOBJ:  COPYINSERT now uniformly allows lists of objects

It was incomplete.

* COMPARETEXT: Now works for TEDIT files

* EXAMINEDEFS: side-by-side attached SEDIT windows for comparing alternative definitions

* OBJECTWINDOW:  container for arbitrary image objects

* ATBL: fixed typo

* MODERNIZEP: pass shape and move to main window if PASSTOMAINCOMS

* EXAMINEDEFS:  Remove EXAMINEDEFS-REGION

Replaced by equivalent functionality in new package REGIONMANAGER

* TEDIT:  adjustments to give caller control of window region

* Revert "TEDIT:  adjustments to give caller control of window region"

This reverts commit aec12b41f0.

* Revert "EXAMINEDEFS:  Remove EXAMINEDEFS-REGION"

This reverts commit 0c670bbc56.

* TEDIT, TEDITWINDOW:  Adjustments for propagating (typed) regions

* EXAMINEDEFS: added EXAMINEFILES for looking viewing files side-by-side

Fix titling glitch, add EXAMINEFILES

* OBJECTWINDOW: minor cleanup

* REGIONMANAGER: new package for managing typed regions, relative regions, and constellation regions

* TEDIT-PF-SEE:  commands for scrollable PF and SEE alternatives

* COREIO:  Fixed bug in \CORE.SETFILEINFO

* COMPAREDIRECTORIES:  Added CDBROWSER

and associated reworking

* COMPARESOURCES:  Added CSBROWSER

and associated reworking

* COMPARETEXT:  Reworked for TEDIT files

Also for better window management
2022-01-09 09:17:17 -08:00
Zoe Braiterman
fd2e5ed93e Update README.md (#643) 2022-01-08 08:57:59 -08:00
rmkaplan
e3e9156452 Merge pull request #638 from Interlisp/msnoblock
remove useless and slowing (BLOCK) from MSPRGTEMPLATE
2021-12-27 09:08:33 -08:00
Larry Masinter
f0feca759b remove useless and slowing (BLOCK) from MSPRGTEMPLATE 2021-12-26 18:47:02 -08:00
Larry Masinter
5fadc6c083 move obsolete lispusers (#635) 2021-12-22 20:57:56 -08:00
rmkaplan
2dcfac5350 Rmk12: Lispusers packages of general utility, but especially for git compare (#634)
* TEXTOFD:  Property OBJECTBYTE returned instead of image objects

This allows COMPARETEXT to work on TEDIT files

* ATBL: Default reader environment uses *DEFAULT-EXTERNALFORMAT* instead of :XCCS constant

* CMLEXEC:  Fix FILETYPE property

It had CL:COMPILE-FILE, but the directory had LCOMs.  Changed to :FAKE-COMPILE-FILE.

* FILEIO:  single place for EOL specification

Now only in SETFILEINFO, not separately in \DO.PARAMS.AT.OPEN

* WINDOWOBJ:  COPYINSERT now uniformly allows lists of objects

It was incomplete.

* COMPARETEXT: Now works for TEDIT files

* EXAMINEDEFS: side-by-side attached SEDIT windows for comparing alternative definitions

* OBJECTWINDOW:  container for arbitrary image objects
2021-12-22 20:56:57 -08:00
rmkaplan
dcd83c3753 Merge pull request #630 from Interlisp/rmk10
Rmk10: Background fixups to support git-compare
2021-12-17 22:25:56 -08:00
rmkaplan
cde5c9018d FILEIO: allow EOLCONVENTION ANY for input files
Any occurrence of CR, LF, CRLF maps to EOL, to facilitate processing of text files of unknown provenance
2021-12-16 20:11:56 -08:00
rmkaplan
1108a00b90 COMPARETEXT: upgraded to externalformat character interface
Also cleaned up some crufty code, added FILELABELS argument to give caller more precise control over the column labels.
2021-12-16 20:09:38 -08:00
rmkaplan
d9e445ad8c TEDIT: added TITLE argument to TEDIT-SEE
So caller can provide more informative information (useful in COMPAREDIRECTORIES)
2021-12-16 20:06:41 -08:00
rmkaplan
5b690d39d1 Delete STREAMDECLS
Old bogus file
2021-12-16 16:16:30 -08:00
Bill Stumbo
2573e4351f Add EOL to last line of each file. (#629) 2021-12-15 21:10:42 -08:00
Bill Stumbo
936bdd84b5 Add environment variables move medley files to /home/medley. (#627)
Add Build_Date, Maiko_Release and Medley_Release environment variables.
2021-12-14 21:58:31 -08:00
rmkaplan
c2915bf5d3 Rmk8: Revised EDITINTERFACE, another attempt at SEDIT-TOPLEVEL (#619)
* EDITINTERFACE: further cleanup

* SEDIT:  Another attempt at adding a property interface
2021-12-11 21:45:29 -08:00
Larry Masinter
40c10a7841 Shrink menu filebrowser icon restored (#595) 2021-12-09 12:32:20 -08:00
rmkaplan
362fac9389 Merge pull request #615 from Interlisp/rmk6-redux
rmk6 2nd change to EDITINTERFACE
2021-12-08 11:33:06 -08:00
Larry Masinter
db082b37e1 correct SEDIT patch 2021-12-08 19:27:27 +00:00
Larry Masinter
c0e020f033 rmk6 2nd change to EDITINTERFACE 2021-12-07 16:35:25 -08:00
Larry Masinter
9af86df169 Recompile with COMPILE-FIILE (#611) 2021-12-07 15:46:43 -08:00
Larry Masinter
6c26fe958a Revert "MKPROGN from record was overridden by the better one on WTFIX; ancient bug tickled when compiling LIFE (#612)" (#614)
This reverts commit 339bd47107.
2021-12-07 09:12:25 -08:00
Larry Masinter
339bd47107 MKPROGN from record was overridden by the better one on WTFIX; ancient bug tickled when compiling LIFE (#612) 2021-12-06 21:43:47 -08:00
Larry Masinter
3a04303d93 reduce errors during GREET from out-of-order problems (#596) 2021-12-06 21:36:01 -08:00
rmkaplan
68f1e7efe1 EDITINTERFACE: Oops, didn't trim all the white space (#602)
So it was misparsing some of the old dates
2021-12-04 10:11:05 -08:00
rmkaplan
993bdb2e00 Maintaining old edit dates #359 (#599)
* PRINTFN: Allow suppression of gratuitous TERPRI in PFCOPYBYTES

An odd feature of PFCOPYBYTES is that it was outputting a gratuitous EOL just in the case of copying a whole file, so copy-all+1.  Don't know who depends on it as is, so I added an extra argument NOTERPRI to allow clients to suppress it.

* Keep old editdates #359

Rework of the editdate capability, centralizing in EDITINTERFACE and removing the pieces that were also on FILEPKG.  Also added a new capability--edit dates can include change-log-type information.  See issue
2021-12-03 20:18:21 -08:00
Arun Welch
7a27c26f01 Update CHAPNUMBERS.TEDIT (#600)
Updated CHAPNUMBERS
2021-12-03 19:36:40 -08:00
Larry Masinter
75a031de39 change to keywords in FILECREATED expressions (#592) 2021-12-03 19:31:17 -08:00
Larry Masinter
7d656006a6 Switch (back to) SEDIT mode when reacting to a MARKASCHANGED (#597) 2021-12-03 19:30:19 -08:00
rmkaplan
1f8c123184 Merge pull request #593 from Interlisp/rmk4
Small fixes to SEDIT-TOPLEVEL, WHEELSCROLL, COMPARE
2021-12-01 22:03:56 -08:00
rmkaplan
50ce484c1b SEDIT-TOPLEVEL: added GET-WINDOW function
So window is available without declarations.   Also, there was an extra-argument error in SEDIT:SEDIT, in the calls to START-PROCESS.  Now fixed
2021-12-01 17:41:33 -08:00
rmkaplan
e3f043b40d WHEELSCROLL: Separate delta for horizontal scrolling, refixed constants 2021-11-29 22:42:51 -08:00
rmkaplan
945df5fbe8 COMPARE: Use EQUALALL instead of EQUAL 2021-11-29 22:24:29 -08:00
Arun Welch
3d8066b7e8 Migration from Interlisp to CL format (#591)
Tool for translating File Manager format files to Common Lisp format
2021-11-28 22:07:37 -08:00
rmkaplan
b303e0affa Rmk3 (#587)
* TEDITMENU:  menus don't grow vertically on reshaping

* CLSTREAMS, EDITINTERFACE:  Update filemap for FUNCTIONS

Needs to be done for most CL-function containing files.
2021-11-28 14:45:21 -08:00
rmkaplan
869b3a2e32 Merge pull request #582 from Interlisp/rmk2
Rmk2
2021-11-27 10:22:32 -08:00
rmkaplan
f19d9cc5e2 Merge pull request #581 from Interlisp/ron-1
ron-1:  a number of little cleanups in various places
2021-11-27 08:11:08 -08:00
rmkaplan
237f3aa6bf FILEBROWSER: Get right date for compiled files
Turns out that FILEDATE of a compiled file returns the creation date of the source, not the compiled file.  To get the proper date for both source and compiled files, you have to first call it with CFLG=T, if that is NIL, try with CFLG=NIL, if that's NIL it isn't a Medley file, use the creation date.

Would be more intuititive with different semantics:  (FILEDATE   xx NIL) should give you the date of this file whether compiled or not, (FILEDATE xx T) should give you the date of the source file, if it happens to be a compiled file.  I.e, CFLG → SFLG
2021-11-25 08:29:07 -08:00
rmkaplan
89a8fe183d DINFO: Menu has MIN/MAX sizes for scrolling 2021-11-25 08:22:31 -08:00
rmkaplan
8266980c22 FILEPKG: SHOWDEF uses reader environment, better COMPAREDEFS formatting 2021-11-25 08:13:15 -08:00
rmkaplan
c385039c42 IMAGEIO: Fontchange characters don't change charposition 2021-11-25 08:11:17 -08:00
rmkaplan
1ff0018772 FILESETS: Add DTDECLARE to EXPORTFILES 2021-11-25 08:10:21 -08:00
rmkaplan
6611f96702 COREIO, FASLOAD: FILEDATE and directory dates
FILEDATE was wrong for the formats on DFASL files.  COREIO wasn't maintaining directory file dates
2021-11-25 08:09:44 -08:00
rmkaplan
824e0f20b2 COMPARE: better alignment in header printing 2021-11-25 08:08:35 -08:00
rmkaplan
d479ef2ef9 IOCHAR: Fix DST comment 2021-11-25 08:07:52 -08:00
rmkaplan
98aa15455e XCCS: Mark format as unstable
byte encoding of particular characters can be different at different points in the file
2021-11-25 08:07:36 -08:00
rmkaplan
ca069578c3 Merge pull request #556 from Interlisp/lmm9
ACCESSFNS VCELL had bogus computation
2021-11-22 22:49:57 -08:00
rmkaplan
23731b05d1 Merge pull request #542 from Interlisp/lmm3
Change WHEELSCROLL constants from LEFT,RIGHT etc to \WSLEFT etc
2021-11-22 22:02:33 -08:00
Larry Masinter
ab4800054e update READMEs and BUILDING; move NOXNSPATCH and extra files in greetfiles (#545)
* update READMEs and BUILDING, move out some unused files

* update loadups/README.md
2021-11-21 17:23:13 -08:00
Larry Masinter
b1634ef140 Change init to MEDLEYDIR-INIT (suitable for run-medley configs) and added BACKGROUND-YIELD (#568)
* Change init to MEDLEYDIR-INIT (suitable for run-medley configs) and added BACKGROUND-YIELD

* fix permissions

* fix up odd characters inserted by tedit

* Editing sh files in TEdit left stuff in run-medley
2021-11-21 12:23:28 -08:00
Bill Stumbo
76a2235636 Add Maiko Release to tags. Install Maiko from Release assets. (#567) 2021-11-20 20:27:28 -08:00
Bill Stumbo
7c65b47fba Update to use Maiko release artifacts (#563) 2021-11-09 22:05:35 -08:00
Larry Masinter
a315e6926f ACCESSFNS VCELL had bogus computation 2021-10-27 22:35:23 -07:00
Larry Masinter
c3a497d8f3 Add GATHER-INFO to internal/library/MEDLEYUTILS (#549) 2021-10-27 21:35:56 -07:00
Larry Masinter
9cf54a1687 Replace (OPCODES SUBRCALL subrnumber) with (SUBRCALL subrname (#553)
* Change numeric OPCODES SUBRCALL NN to use the LLSUBRS name

* more opcodes subr# in maikoloadupfns

* even more OPCODES SUBRCALL

* Recover BIGBMAPS definitions dup (but more recent) from LLCOLOR
2021-10-27 16:41:37 -07:00
Larry Masinter
5490abb143 remove duplicate \DISPLAYLINE accidentally in MAIKOETHER (#550) 2021-10-27 12:13:23 -07:00
rmkaplan
18f5da85fd Fix DST in IOCHAR, y2k problem in TMAX-daTE, DUMPDB (#547)
* IOCHAR:  Fix daylight savings time
* TMAX: Y2K fix
   Also a little code cleanup, changing default font to TERMINAL from GACHA and making text more legible
* DATABASEFNS, ATBL:  DUMPDB with DEFINE-FILE-INFO

New database files will have standard headers, then a little special stuff for LOADDB to synchronize, old database files default to a new interlisp environment. 

 MAKE-READER-ENVIRONMENT in ATBL extended for easier specification, plus better type-testing.

* Remove duplicate comment
2021-10-27 12:05:15 -07:00
Larry Masinter
01de5a2324 Add TMAX to image-object set (#535) 2021-10-25 18:59:43 -07:00
Bill Stumbo
528776de19 Updated Docker build to use Medley Release Assets (#546) 2021-10-24 21:02:59 -07:00
Larry Masinter
1c9c1da257 Change WHEELSCROLL constants from LEFT,RIGHT etc to \WSLEFT etc 2021-10-24 11:05:41 -07:00
Bill Stumbo
b67cf5ae09 Update build (#538)
* Build loadup (#1)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Build loadup (#2)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Cleanup

* Build loadup (#3)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Cleanup

* Cleanup

* Build loadup (#4)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Cleanup

* Cleanup

* Build loadup (#5)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Cleanup

* Cleanup

* Move sysouts to correct location

* Set root directory to medley
2021-10-22 22:11:08 -07:00
Larry Masinter
d1fe834e6f Move material from 'release-notes' to README (#526)
* Move material from 'release-notes' to README

* Remove extra junk files from Lispusers DATE and PLAINTEXTSTREAM

* Update README instructions per feedback; add a BUILDING readme
2021-10-21 23:19:37 -07:00
rmkaplan
c3b5e23cd9 Eliminate implicit calls to \FILEOUTCHARFN (#529)
* Eliminate implicit calls to \FILEOUTCHARFN

Also, update DATE to modern readtable (don't know what it does), add LLETHER to EXPORTFILES in FILESETS (may also need the file that exports pup records).

* Further fixups for EXPORTFILES

also fixing/compiling PLAINTEXTSTREAM

* Remove garbage files DATE and PLAINTEXTSTREAM from checkin

Co-authored-by: Larry Masinter <LMM@acm.org>
2021-10-21 16:25:16 -07:00
Larry Masinter
9b4976e33f merging PRINTFN 2021-10-21 12:51:16 -07:00
rmkaplan
31d9473184 Better control of modern windows (#527)
* MODERNIZE, FILEBROWSER: Better control of modern windows

Also fixed Y2K bug in FILEBROWSER, updated COMPAREDIRECTORIES and WHEELSCROLL documentation.  MODERNWINDOWS allows separate specification of the hot-corner region and the top margin for siphoning off left-button clicks

* MODERNIZE.LCOM: didn't get included
2021-10-21 10:02:43 -07:00
Bill Stumbo
bf5689be2a Build loadup (#534)
* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Build loadup (#1)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Cleanup

* Build loadup (#2)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Cleanup

* Cleanup

* Build loadup (#3)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Cleanup

* Cleanup

* Move sysouts to correct location

* Build loadup (#4)

* Add new GitHub action to create medley release

* Update to manual trigger with release name as input

* Cleanup

* Cleanup
2021-10-21 10:00:28 -07:00
rmkaplan
08bdd34e69 Tedit readonly files, cleanup filesets printfn (#532)
* FILESETS, TEDITWINDOW, TEDIT-PF-SEE

Add DTDECLARE to EXPORTFILES, fix TEDIT so that READONLY windows and processes are collected

* PRINTFN:  Eliminate PMORE
2021-10-21 09:56:36 -07:00
Larry Masinter
c7a219fd22 Use COPYCHARS instead of COPYBYTES when HPRINT is copying from NODIRCORE buffer (#506)
* Use COPYCHARS instead of COPYBYTES when HPRINT is copying from NODIRCORE buffer

* Change HPRINT of non-random-access files to use FORMAT of ultimate destination
2021-10-21 09:50:15 -07:00
rmkaplan
13cfb9b835 FILEPKG: MAKEFILE now takes format identifer (e.g. :UTF-8) in its options list (#524) 2021-10-15 11:28:51 -07:00
rmkaplan
b3219c33da Merge pull request #521 from Interlisp/Improve-TEDIT-interaction-with-MODERNIZE
Improve tedit interaction with modernize
2021-10-14 15:58:30 -07:00
rmkaplan
b0f9f2cce8 Merge pull request #523 from Interlisp/Lispusers-packages-modernize,-thinfiles,-tedit=pf=see
Lispusers packages modernize, thinfiles, tedit=pf=see
2021-10-14 15:57:32 -07:00
rmkaplan
1ad92b3dd4 TEDIT: TEDIT_SEE sets initial DEFAULTFONT for Lisp source files 2021-10-13 10:20:12 -07:00
rmkaplan
588835603c lispusers/TEDIT-PF-SEE: Explicitly give up TTY process on close
I'm not sure  why the READONLY TEDIT-SEE windows get the TTY process, that may be the underlying problem.  But at least here I now make sure that the if the window is the tty process on closing, it gives it back to the exec.  Otherwise, the window pops back up if there is input (even wheel scroll interrupts) before the user clicks somewhere else
2021-10-12 22:35:58 -07:00
rmkaplan
df70662f2c INSPECT: INSPECTCODE starts with DEFAULTFONT (presumably fixed pitch) 2021-10-12 17:22:43 -07:00
rmkaplan
32461da7eb Lispusers packages: MODERNIZE, THINFILES TEDIT-PF-SEE (new)
MODERNIZE interacts better with TEDIT split windows, THINFILES works better on filenames, not just extensions.  TEDIT-PF is new: provides commands tpf and ts for doing PFCOPYBYTES or SEE to scrollable read-only TEDIT windows, also functions for remembering and reusing the regions of windows of particular types.
2021-10-12 17:22:21 -07:00
rmkaplan
1beba945a2 PRINTFN DEXEC CMLEXEC: Cleanup PFCOPYBYTES interface
Removed unused FLG argument in PFCOPYBYTES, tried to make sense of PFDEFAULT (in preparation for TEDIT-PF. CMLEXEC just to upgrade the filemap
2021-10-12 17:20:18 -07:00
rmkaplan
e6cf869a23 Update HARDCOPY.LCOM
Forgot to include in TEDIT commit
2021-10-12 17:17:19 -07:00
rmkaplan
a6efdb3558 TEDIT fixes for format and window-splitting
Introduced an external format (:TEDIT) for Tedit, initialized TEXTOFD to use it.  Parmeterized the window split-window region to stop confusions with modernwindows.  TEDIT-SEE starts out the defaultfont for non-Tedit-format files. Restored git-lost edits to COPY.TEXT.TO.IMAGE
2021-10-12 17:16:44 -07:00
rmkaplan
e222743f74 Update lsee for UTF-8 (#518)
* Update lsee for UTF-8

Change less -R to less -r

* Minor cleanup for typo at end of script.

Co-authored-by: Nick Briggs <nicholas.h.briggs@gmail.com>
2021-10-08 23:25:31 -07:00
rmkaplan
ea0f303988 Merge pull request #505 from Interlisp/Externalformat-collected-in-a-separate-file
Externalformat collected in a separate file
2021-10-07 07:41:01 -07:00
rmkaplan
b85084ce31 LLREAD and LLREAD.LCOM: restore unversioned files 2021-10-05 19:46:07 -07:00
Larry Masinter
e39943fdcc Merge pull request #509 from Interlisp/run-medley-noscroll
Add -noscroll option to run-medley; turns off scollbars
2021-10-04 16:27:03 -07:00
Larry Masinter
a4370ae57d Put -noscroll first in usage at head 2021-10-04 15:03:49 -07:00
rmkaplan
cbfdfd6dab Merge branch 'master' into Externalformat-collected-in-a-separate-file 2021-10-01 23:13:12 -07:00
Larry Masinter
84bf09394e Merge pull request #513 from Interlisp/LAFITE-CR-to-LF
Lafite cr to lf
2021-10-01 18:57:53 -07:00
Nick Briggs
a92bce555f Fix long-standing error wherein VTCHAT.STATUS attempts to BOUT a string (#510)
In replying to a request for the cursor position, the VTCHAT.STATUS
code attempted to construct the escape-sequence response passing a
string representing the X (and Y) coordinate as text to BOUT rather
than using PRIN1.
2021-10-01 15:57:00 -07:00
Nick Briggs
ae26c3c9fa Replace chat via "rlogin" with chat via "ssh" (#512)
Modern systems are unlikely to be configured with "rlogin" access,
remote login, if available, is likely to be via "ssh", so use that.
2021-10-01 15:55:46 -07:00
rmkaplan
09fec6ac56 Add FILESETS back
For some reason, in going back and forth, the hard link between the versioned and the unversioned got lost, and the unversioned was effectively deleted.  I did a copyfile to get things back in order
2021-10-01 12:22:02 -07:00
rmkaplan
625a5a839c Convert UNICODE to LF
Don't know why it reverted.  Just a MAKEFILE NEW and recompile
2021-10-01 09:03:00 -07:00
rmkaplan
f28a7a6278 Move UNIXMAIL.* and MAILSCAVENGE.TEDIT to library/lafite 2021-10-01 08:20:38 -07:00
rmkaplan
9f85f4e17e Convert LAFITE files to LF
They missed the previous global conversion since they were in a subdirectory.  The only actual change is in LAFITETEDIT, it had the wrong name for the TEDITDCL file
2021-09-30 23:16:45 -07:00
Larry Masinter
1380722e55 Add -noscroll option to run-medley; turns off scollbars 2021-09-30 17:22:19 -07:00
rmkaplan
d6173b5269 Revert "HARDCOPY: COPY.TEXT.TO.IMAGE had Unicode-incompatible end-of-file shortcut"
This reverts commit 65a2d8000e.
2021-09-30 13:39:10 -07:00
rmkaplan
1d8fa0301d TEDIT: TEDIT-SEE treats FORMAT better for plain-text files 2021-09-29 22:27:18 -07:00
rmkaplan
65a2d8000e HARDCOPY: COPY.TEXT.TO.IMAGE had Unicode-incompatible end-of-file shortcut
Also used byte and not character-code operation in CRLF check
2021-09-29 22:26:11 -07:00
rmkaplan
388d54b713 TEDITSCREEN: Cleanup \DISPLAYLINE
Test argument validity at top so ffetch can be used consistently.  Remove unused variables, and move some other variable bindings to their proper scope
2021-09-29 22:23:45 -07:00
rmkaplan
f58936e762 PRINTFN: Fix typo, add comments 2021-09-29 10:11:31 -07:00
Larry Masinter
63904f754c two variables COPYRIGHTFLG and *REPLACE-OLD-EDIT-DATES* set for Lispcore developers (#504)
* two variables COPYRIGHTFLG and *REPLACE-OLD-EDIT-DATES* set for Lispcore developers

* COPYRIGHTFLG = PRESERVE
2021-09-28 10:21:57 -07:00
rmkaplan
2dabe594f3 Merge branch 'master' into Externalformat-collected-in-a-separate-file 2021-09-27 14:19:55 -07:00
rmkaplan
0462c1aa5e TEDITSCREEN, TEDITHCPY: Remove absolute NS charcodes (#494)
* TEDITSCREEN, TEDITHCPY: Remove absolute NS charcodes

Also eliminated \MAIKO.DISPLAYLINE.  Git got twisted up between branches, stuck in <<<< in some files, I think I unscrambled it.  (Had to copy TEDIT again separately).  Still says TEDITHCPY.LCOM is conflicted, even though I have completely TCOMPLed it.  Git sucks.

* Trying to fix master incompatibilities
2021-09-27 14:16:49 -07:00
rmkaplan
1d4c9ed6ee BOOTSTRAP: PRINT-READER-ENVIRONMENT puts out an extra EOL
To separate the DEFINE-FILE-INFO  header from the actual contents, when using TEDIT-SEE (in Medley) or lsee
2021-09-27 10:28:50 -07:00
rmkaplan
6b66665e9d BOOTSTRAP: Read initial DEFINE-FILE-INFO as a string, not an atom
If it is ead with RATOM, then e.g. LISPSOURCEFILEP gives an error if the first line of the file begins with something like (Author:
2021-09-26 23:41:52 -07:00
rmkaplan
db3ca49564 Localize external format implementation in new EXTERNALFORMAT file
Pieces moved from FILEIO and LLREAD, EXTERNALFORMAT added to FILESETS
2021-09-25 22:48:04 -07:00
rmkaplan
c89ac61d34 IMAGEIO: Separate construction of :DISPLAY external format
Defaults for 4/8/24 bit display FDEV's
2021-09-25 22:47:16 -07:00
rmkaplan
9b7464d966 MULTI-COMPILE: Just MAKEFILE-NEW to get better filemap 2021-09-25 22:40:25 -07:00
Larry Masinter
5a9bc56628 Ignore #\( #\{ patterns in 'smart' argnames when showing stack frames (#475) 2021-09-23 13:01:07 -07:00
rmkaplan
205223c9b1 Merge pull request #490 from Interlisp/TEDIT-SEE
TEDIT + FILEBROWSER:  Add function TEDIT-SEE, call from FILEBROWSER
2021-09-21 15:13:36 -07:00
Larry Masinter
ccc776608d Add Lispusers BACKGROUND-YIELD to call new subr (#488)
* Add Lispusers BACKGROUND-YIELD to call new subr

* Make BACKGROUND-YIELD a variable
2021-09-20 15:06:40 -07:00
Larry Masinter
25617e383a Add to medley release a tar of loadups-only, for those who want that (#465)
* Add to medley release a tar of loadups-only, for those who want that

* separate pieces (loadups+runtime) with 'don't need runtime if cloned'
2021-09-20 15:04:07 -07:00
rmkaplan
5e6eb4b424 HARDCOPY, TEDITHCPY: fix #491
INITVAR for PRINTFILETYPES, fix the coms for the Interpress option in TEDITHCPY

(This branch is accumulating little TEDIT glitches)
2021-09-20 11:17:55 -07:00
rmkaplan
7175669633 TEDITWINDOW: Ensure TOTOPW in tedit buttoneventfn and scrollfn #492 2021-09-20 07:36:01 -07:00
rmkaplan
21088d3eff TEDIT + FILEBROWSER: Add function TEDIT-SEE, call from FILEBROWSER 2021-09-19 19:10:18 -07:00
Larry Masinter
8ec1ca966d If lde is on path, don't bother with MAIKODIR (#478) 2021-09-13 21:34:03 -07:00
Nick Briggs
c55239f744 Minor cleanups in LLSUBRS to support new subrs.h for YIELD subr. (#479)
Keep the \INITSUBRS in sorted order: move (YIELD 210) to the end of
the list.

Change the output of WRITECALLSUBRS so that the guard wraps the whole
subrs.h include file.

Avoid using literal tabs in the output #defines, pad with spaces and
arrange the minimum field widths so that everything lines up better.
2021-09-13 20:33:43 -07:00
Larry Masinter
d6f7ad7de9 run-medley improvements (#476) 2021-09-13 05:54:31 -07:00
Larry Masinter
0236971881 Add NOERROR extra parameter to STKARGNAME, and set it in DEBUGGER (#471) 2021-09-12 11:47:14 -07:00
Larry Masinter
d04f734295 Move POSTSCRIPTSTREAM.TEDIT with its implementation (#467) 2021-09-11 17:07:57 -07:00
Larry Masinter
27a52b6ce0 Add COPYRIGHTFLG=PRESERVE meaning 'no new copyright dates, but keep previous' (#468) 2021-09-11 17:07:07 -07:00
Larry Masinter
0e2e16f183 changes from #453 redone: NOGREET for run-medley, dummy HOME LOGINDIR for loadups (#464) 2021-09-09 22:26:06 -07:00
rmkaplan
b760d005fb Second recompile fdev #457 (#463)
* FONTPROFILE:  Fix NS COMMENTFONT, delete FONTPROFILEPATCH

This reverts commit 2615140ede.

* Recompile FDEV creators with FILEIO defaulting to :XCCS

* FONTPROFILE: Fixed COMMENTFONT in BIGGERNS

* FONTPROFILE:  fixed typo
2021-09-07 11:52:14 -07:00
rmkaplan
95c9496780 Merge pull request #461 from Interlisp/revert-458-Recompile-FDEV-creators-#457
Revert "Recompiled all FDEV creators to install *DEFAULT-EXTERNALFORMAT*"
2021-09-06 10:37:05 -07:00
Larry Masinter
4bb4457d55 Revert "Recompiled all FDEV creators to install *DEFAULT-EXTERNALFORMAT* (#458)"
This reverts commit 2615140ede.
2021-09-06 09:04:00 -07:00
rmkaplan
2615140ede Recompiled all FDEV creators to install *DEFAULT-EXTERNALFORMAT* (#458) 2021-09-05 16:39:51 -07:00
Larry Masinter
77d772ae45 Duplicate files cleanup (#403)
* Duplicate POSTSCRIPT files in LispUsers and LispUsers/POSTSCRIPT

* DICOLOR on LispUsers is old version uncompiled 1985; version on internal library is newer

* missed PS-TTY in the postscript files

* Fix .gitignore no longer need diff filter; remove odd extra ~ file

* Verified POSTSCRIPT lispusers subdirectory redundant (not same hash because of EOL. POSTSCRIPT-old apparently was older version, copyright not venue

* Save postscript-old in obsolete

* move internal/library/DICOLOR to obsolete
2021-09-05 07:21:18 -07:00
Larry Masinter
995c321f59 release more (#447)
* move badfiles

* fix release to include sources

* load known, used image object defns

* add docs/Documentation Tools to release

* Avoid --exclude-backups with explicit exclude

* fix typo remove 'release-one' leftover from older regime

* update release notes
2021-09-03 14:05:09 -07:00
Larry Masinter
9d4a8796dd Move SIGMA font from LispUsers (as part of EQUATIONEDITOR) to fonts/other/c0 where FONTCREATE will find ite (#451) 2021-09-02 22:35:44 -07:00
Larry Masinter
185ee4db70 Release tweaks (#448)
* Fix release notes errors + tweaks in SYSEDIT

* releaseone.sh was for the previous setup with combined releases

* single backticks don't work in release notes
2021-09-02 20:36:05 -07:00
rmkaplan
f5205e23c6 Update unicode mapping tables (#440)
* Updated all ISO8859 and Vendor Unicode mappings from current Unicode.org information

* John Cowan says that East Asia is obsolete

* Delete obsolete file
2021-08-28 09:01:27 -07:00
Larry Masinter
b57438983b modify release notes / scripts for separate medley maiko releases (#436)
* modify release notes / scripts for separate medley maiko releases

* Tweak release notes

* more edits release notes
2021-08-28 08:41:33 -07:00
rmkaplan
f4951abf4d Merge pull request #442 from Interlisp/Adjust-TTYIN-and-LLKEY-for-character-specifications
Adjust ttyin and llkey for character specifications
2021-08-27 21:29:08 -07:00
rmkaplan
d1fb141fa1 TTYIN: Remove indirects to generic char io functions, abstract to function for TTYIN.RESTORE.BUF.CODES
Local BOUTCCODE macro replaced by call to \OUTCHAR etc.  Previously it called PRINTCCODE probably because that was the encapsulation of NSIN.  Now avoid the user-level function call, so it can be broken, go directly to the generic.
2021-08-27 17:05:55 -07:00
rmkaplan
66624477f9 LLKEY: Do the Meta/Function abstraction for \ORIGKEYACTIONS and \MAIKOKEYACTIONST4
With all the back and forth in the last branch I forgot to commit these particular changes
2021-08-27 16:20:48 -07:00
Larry Masinter
c810d2860b use 'less -R' instead of 'more' for better compatibility in lsee (#439) 2021-08-27 09:57:10 -07:00
Larry Masinter
3ef7a79b52 Restore unixmail (#385)
* Restore unixmail from archive

* Restore unixmail from archive
2021-08-26 21:40:09 -07:00
Larry Masinter
c37fed89e8 Update lsee to translate ^^ (control-circumflex) to : for define-file-info; add more (#432) 2021-08-26 21:39:10 -07:00
Larry Masinter
7897471126 no longer commit loadups; start with starter.sysout (#430)
* Start loadup using lisp.venuesysout as the base on which to build new

* Change 'starter.sysout' (taken from recent lisp.sysout)

* Fix problem with GREET ordering
2021-08-26 15:47:59 -07:00
rmkaplan
3d7905905b Merge pull request #435 from Interlisp/LLKEY-with-Meta-and-Function
LLKEY with meta and function
2021-08-25 14:55:48 -07:00
rmkaplan
439cc93ca4 TEDITWINDOW: Minor cleanup for Masterscope
Not related to the LLKEY/LLREAD, but just get it done.  The new masterscope showed that a field name wasn't qualified, and a comment was in a value context
2021-08-24 23:34:12 -07:00
rmkaplan
9282681644 LLKEY: system keyactions with Meta and Function instead of 1, and 2,
Keyaction lists have also been updated so that they contain only character specifications, not a mixture of character codes and specifications.

KEYACTION now tests its KEY argument for validity

New function \KEYNUMBERTONAME, potentially convenient for future keyboard work
2021-08-24 22:47:34 -07:00
rmkaplan
b4c5b304c4 LLREAD: CHARCODE.DECODE independent of CHARTABLE 2021-08-24 22:44:05 -07:00
Larry Masinter
6176aa9ebf Patch sketch code for Masterscope errors (#433) 2021-08-24 16:42:14 -07:00
rmkaplan
7b5541a417 Abstracting meta and function charcodes (#425)
* TTYIN: Meta chars defined by Meta charset, not specific value 1

Also, changed \TTYIN.RPEOF to use \FORMATBYTESTREAM generic function so that it does not make assumptions about the stream's external format

* LLKEY:  Respecify 535 as "Function,^W" in \ORIGKEYACTIONS

First step in anticipating moving meta and signaling characters to unoccupied parts of the Unicode code space

* Have to commit the build artifacts in order to unstash changes

* CMLSTRING:  No change, just upgrade filemap for CL Functions

* LLREAD: A little tighter on CHARCODE.DECODE

Allow hex and unicode in comma-separated specs, but must have 0X or U+ indicator.  Don't allow junk characters

* LLKEY:  Revert attempt at Meta,x and Function,x

For unknown reason, CHARTABLE isn't declared when LLREAD appears in loadup sequence.

* Unicode:  Unicode character-constants weren't properly prefixed

Needed U+ or x0

* THINFILES (again): Add version number for mis-ordered HELP

* ATBL: Change 1,0...1,377 to Meta,0...Meta,377

In anticipation of a future migration of the meta charset.

* TEDITFNKEYS:  Convert 1,x 2,x to Meta,x Function,x

In anticipation of eventual deconfliction with Unicode

* FILEBROWSER: remove reference to reader-environment field, add fix-directory-dates

Added a new submenu item under Recompute to make directory dates match the filecreated dates for Medley source/compiled files.

* SEDIT-COMMANDS:  1/2 to Meta/Function in Sedit commands

Codes in the 512+ range are now Function, anticipating eventual code-space translation

* FILEPKG:   Consistency of exports.all external format
2021-08-24 11:05:38 -07:00
Larry Masinter
c62ad47730 add big fonts, move MEDLEYDIR init (#424)
* add big fonts, move MEDLEYDIR init

* found a few more big fonts, adding them
2021-08-24 10:21:40 -07:00
rmkaplan
cdd9bc46d7 Merge pull request #417 from Interlisp/masterscope-macros
Masterscope wasn't expanding cl:defmacro defined macros
2021-08-18 16:04:54 -07:00
Larry Masinter
ab24d11371 Masterscope wasn't expanding cl:defmacro defined macros 2021-08-18 12:30:39 -07:00
rmkaplan
af16fb48fa Restore package/reatable eval in define file fino (#415)
* Adds fields to reader-environment to remember evaluation forms for reprinting

For package and readtable, not for base or external format.  This restores previous package/readtable behavior.

ATBL also is now not radix 8

* THINFILES:  now can add extensions/file names to operate on

Not related to other things in this branch, just a useful extension to a simple lispusers package.  You can now add dribble as an extension, and things like I-NEW as a name, to make it easy to clean up the tmp/ loadup directory in particular.
2021-08-18 12:22:45 -07:00
rmkaplan
0d2c6622bb Format implementation functions set a known variable *BYTECOUNTER* (#402)
* Format implementation functions set a known variable *BYTECOUNTER*

The generic functions deal with updating the application variable.
\INCHAR eliminated in favor of \INCCODE.EOLC to make clear what it does.
OPENSTRINGSTREAM streams have their own format, and the string is always fattened.
READBITMAP doesn't mix character and byte reading

* AOFD: Don't execute \STRINGSTREAM.INIT

This creates a file device that is not used anywhere.  The function OPENSTRINGSTREAM provides the functionality that this file device suggests that it would provide, but that functionality seems suspect at best.  The function is left in the system for now, probably should be deleted at some point in the future so we don't try to maintain it if we trip over it.

* TTYIN:  Fix an ancient coding error

but still doesn't solve the  (DIRECTORY ?=  problem #402

* LLREAD, FILEIO, XCCS:  Improve charcode backing, copychars

Added \BACKCCODE.EOLC that backs up over EOL encoding bytes, simplifies \RSTRING2.
\XCCSBACKCCODE returns T/NIL according to whether it succeeded.
\XCCSOUTCHAR uses IPLUS16 for CHARPOSITION
COPYCHARS makes no assumptions about EOL encoding
But still no solution for #402

* LLREAD, TTYIN.LCOM    fix #402

The bug showed up in TTYIN, but it was actually a bad edit in the generic backccode.

TTYIN.LCOM is just a recompile--that had never been done with various new declarations.
2021-08-15 18:45:04 -07:00
Larry Masinter
d6d47953d9 Add small utility 'lsee' to change lisp font-escapes to color changes (#399) 2021-08-08 13:38:33 -07:00
Larry Masinter
3569379861 Revert "duplicate definition of UNINTERRUPTABLY pp macro (#395)" (#397)
This reverts commit b07d528f22.
2021-08-06 19:50:12 -07:00
Larry Masinter
9ab24c044d Merge branch 'Miscellaneous-format-stuff' 2021-08-06 13:38:26 -07:00
rmkaplan
565f5994f2 Merge pull request #394 from Interlisp/sysedit-load-exports.all
Update SYSEDIT to load exports.all when running run-medley -new
2021-08-06 12:53:49 -07:00
Larry Masinter
93d9b7f176 Fix bitrot in manual TEdit file as per #268 (#391) 2021-08-06 12:16:17 -07:00
Larry Masinter
8a5057fbdc Remove explicit old versions from cloned repo (#392)
it took a long time to figure out how to restore old versions, using the './scripts/restore-versions file'. Now that it's there and tested  it should be ok to remove them from new 'git clone' of medley
2021-08-06 12:14:55 -07:00
Larry Masinter
b07d528f22 duplicate definition of UNINTERRUPTABLY pp macro (#395) 2021-08-06 12:09:49 -07:00
rmkaplan
3de2ebb719 FILEIO UNICODE: Fix THROUGHIN, cleanup UTF8-16 back 2021-08-06 10:36:05 -07:00
Larry Masinter
a2fdebbfa0 Update SYSEDIT to load exports.all when running run-medley -new 2021-08-06 07:41:06 -07:00
rmkaplan
b1d209484a FILEIO, MACHINEINDEPENDENT
\EXTERNALFORMAT extracts the format from a reader-environment
WRITEFILE uses the format in *OLD-IINTERLISP-READ-ENVIRONMENT* (now :XCCS)
2021-08-05 21:08:05 -07:00
rmkaplan
c2cff44a64 MACHIINEINDEPENDENT
MAKEFILE NEW with Interlisp read table, as per Larry's request
2021-08-05 15:17:41 -07:00
rmkaplan
c94e044bf3 FILEIO: Fix bad IF statement in \EXTERNALFORMAT 2021-08-05 14:44:01 -07:00
rmkaplan
d64e9282bf DEFINE-FILE-INFO with its own reader environment (#381)
* DEFINE-FILE-INFO with its own reader environment

Including format.  That reader environment also allows colon as a package delimiter, in addition to the funky control and upper panel character.

"Function" is now a synonym for character set 2.  WITH-READER-ENVIRONMENT doesn't bind EXTERNALFORMAT.

* Changed *DEFAULT-MAKEFILE-ENVIRONMENT* to use Interlisp rdtbl

* Store FDEV's default externalformat in the FDEV

And related adjustments so that the display output stream (which is created in various places) is always created with the right (CR) EOL convention.  Also a little simpler interface for creating external formats.
2021-08-05 13:43:08 -07:00
Larry Masinter
3fc26567c0 git on WSL doesn't remember +x bit (#387) 2021-08-05 09:53:34 -07:00
Bill Stumbo
25c397ccdf Git hub build (#374)
* GibHubBuild of Medley container.

* Add build.yml to master

* fix version

* add gitHubBuild branch

* cleanup

* add in gitHubBuild

* GibHubBuild of Medley container.

* cleanup

* Cleanup
2021-08-02 20:26:47 -07:00
Larry Masinter
b18d16b807 fixes Issue #375 -- make 'loadup-full' start with loadups/lisp.sysout (#379) 2021-08-02 20:16:09 -07:00
Larry Masinter
9b7df4a022 Add option (mainly for Ron) to add tmp to front of directories where exports.all and other newly created sources will come from (when using SIMPLE-INIT). Modified fn MEDLEY-INIT-VARS in LOADUP-LISP. (#383) 2021-08-02 20:14:54 -07:00
rmkaplan
4ea68c6746 Store FDEV's default externalformat in the FDEV
And related adjustments so that the display output stream (which is created in various places) is always created with the right (CR) EOL convention.  Also a little simpler interface for creating external formats.
2021-08-02 19:56:19 -07:00
rmkaplan
ff134ecd23 Changed *DEFAULT-MAKEFILE-ENVIRONMENT* to use Interlisp rdtbl 2021-08-01 21:03:24 -07:00
rmkaplan
925adc1deb DEFINE-FILE-INFO with its own reader environment
Including format.  That reader environment also allows colon as a package delimiter, in addition to the funky control and upper panel character.

"Function" is now a synonym for character set 2.  WITH-READER-ENVIRONMENT doesn't bind EXTERNALFORMAT.
2021-07-30 19:37:48 -07:00
Larry Masinter
4efe2f93af Merge (rebase) Cleanup-character-IO-interfaces with master (#356)
* Cleanup  of character IO interface

Committing this branch for further testing.  I know at least that the TTY output stream somehow is defaulting to :XCCS, which is wrong, but I haven't yet found the interface for that.

* Clean out \NSIN etc

No top-level calls to the NS specific functions, just to the generic \OUTCHAR etc.

Updated full.database

* MODERNIZE: added dragging for fixed-menu windows

They can be dragged by their title bars

* UNICODE:  Added Greek to the default set

Also made spelling of default-externalformats consistent with FILEIO

* FASLOAD: EOL conversion in FASL::READ-TEXT

EOL's printed as LF's will be read as EOL

* LLREAD:  Added meta as a CHARACTERSETNAME

meta,a maps to 1,a now.  But slowly propagating this to TEDIT, SEDIT, etc will make it easier to change the coding of meta characters, e.g. as part of a Unicode transition.

* APRINT FILEIO LLREAD: \OUTCHAR now a closed function

Removed the macro

* LLKEY: call CHARCODE.DECODE directory in \KEYACTION1

Minor cleanup, avoid typical user entry and APPLY*

* WHEELSCROLL: re-enable on AFTERMAKESYS/SYSOUT FORMS

Also sets up mappings in the \COMMANDKEYACTIONS, whatever that is

* ABASIC:  NILL and ZERO change from LAMBDA NOBIND to LAMBDA NIL

So that things like Masterscope don't break

* MASTERSCOPE:  Added WHEREIS as last-resort for CONTAINS

Looks at the WHEREIS database, if present, for FNS and FUNCTIONS if it has no other information.  . WHO CONTAINS ANY CALLING FOO works, but not the inverse:  . WHO DOES FUM CONTAIN.  We still need to figure out why the CONTAINS table isn't populated

* POSTSCRIPTSTREAM: use standard \OUTCHAR conventions

Now uses generic \OUTCHAR to get the proper function from the stream (or default)

* Recompile with right EXPORTS.ALL

Some of the macros weren't correct.

* Fix POSTSCRIPTSTREAM

Cleaner separation between external \OUTCHAR and internal BOUT

* POSTSCRIPTSTREAM gets its own external format

* Minor fix

* Compile-time warning about EXPORTS.ALL

* MODERNIZE:  Modern button fn has same args as the original

For Notecards  #343

* Fixed another glitch in the MODERNIZE  arglist thing

\TEDIT.BUTTONEVENTFN actually takes a second STREAM argument.  I don't see where it is ever called with that.  The modernize replacement binds that argument, but it isn't being passed to the original.

* FILEWATCH:  added missing record field

* Update FILEWATCH.LCOM

* Eliminating record/type name conflicts

Mostly just qualifying references, more work to get BIGBITMAP stuff out of ADISPLAY and to eliminate ambiguity of LINE record (now XXLINE in XXGEOM)

* Compile away open calls to \OUTCHAR, add loadups/full.database

Mostly new LCOMS where \OUTCHAR calls were compiled open

* Remove garbage library/XCCS

Old tools for reading wikipedia XCCS tables, sources/XCCS will deal with XCCS external format

* Next step:  Remove open input-character calls, factor XCCS to separate file

XCCS is the default, but can be swapped out (eventually) by setting a few variables, without recompiling everything

* Lots of residual cleanup for XCCS isolation

* Delete old file MACINTERFACE (migrated to MODERNIZE)

* Eliminate straggling NS calls:  LAFITE, READINTERPRESS

* Typo

* READINTERPRESS:  removed CHARSET

* MODERNIZE: Interface to control title-bar response (for Notecards)

* Many changes for external format name consistency

Very close to the end of this

* Put :FORMAT in file info, fix TEDIT plaintext hardcopy

I distributed :FORMAT :XCCS as the default marking, but somehow one of the variables seems to get revert during the loadup.  This is correct, as far as it goes.

* Getting the format in the file-info

This is all very twisty, different variables set in different places.  It now seems to do the right thing, at least for new files.  Marks them with :FORMAT :XCCS.

* Another fileinfo glitch

* CLIPBOARD -UNICODE:  Make UTF8 to UTF-8 to match standards

* MODERNIZE:  fix bug in MODERWINDOW

* External format as MAKEFILE option, LOAD applies the file's format

(MAKEFILE 'XX '((FORMAT :UTF-8)))
  will dump XX as a UTF-8 file.  LOAD will load it back to XCCS internal.

* Compilers respect DEFINE-FILE-INFO format

* MODERNIZE:  little glitch

* Delete old FILEIO.LCOM

* More edge cases of external format thru MAKEFILE, PRETTY, PRETTYFILEINDEX etc.

* FILEBROWSER:  Can SEE UTF-8 Lisp sourcefile

* INSPECT:  Better macro for inspecting readtables

* recompile changed files and do new loadup

Co-authored-by: rmkaplan <ron.kaplan@post.harvard.edu>
2021-07-29 17:07:23 -07:00
rmkaplan
4fac4e3e96 Merge pull request #352 from Interlisp/restore-versions
Add small util for restoring versions from git history
2021-07-21 17:14:53 -07:00
Larry Masinter
966b837351 Add small util for restoring versions from git history 2021-07-21 17:09:40 -07:00
rmkaplan
dac0acd0d5 Merge pull request #346 from Interlisp/recover-unversioned
Some files were checked in with only versioned files (from unix side)
2021-07-21 16:43:24 -07:00
Larry Masinter
105b0d1f3a Some files were checked in with only versioned files (from unix side) 2021-06-23 20:52:49 -07:00
Larry Masinter
10e3916e7e See PR #275 for discusssion 2021-05-06 16:24:43 -07:00
Larry Masinter
2cf33cebcf new loadups without ron's init or etherwait 2021-05-06 15:29:22 -07:00
Larry Masinter
d40aeffdc7 Remove unused file reference to PSETF and (lower case) psetf macro (#318) 2021-05-06 15:12:52 -07:00
Larry Masinter
6f9cafc578 Add a loadups/full.database masterscope database (#323) 2021-05-06 15:10:23 -07:00
Larry Masinter
a781751832 Better handling of no-ether when starting without ethernet (#327)
* Better handling of no-ether when starting without ethernet

* before save, with ether, clear \ETHERPORTS, passwords

* move SUBRCALL to separate function
2021-05-06 15:05:19 -07:00
Larry Masinter
d5b26c1352 switch around -nt because ldeinit phase can take less than a second (#329)
minor script bugfix
2021-05-06 15:03:41 -07:00
Larry Masinter
0a5ff04393 Use .CM to loadup full, to avoid GREET call (#322) 2021-05-01 20:43:14 -07:00
Larry Masinter
a946a90ef8 left out from PR #324 2021-05-01 09:08:43 -07:00
rmkaplan
66fa5e42cf Upgrade TEDIT to LF (#324)
* Upgrade TEDIT to LF

Fixes the black boxes in the Tedit menus.
TEDIT had a built-in bias towards CR in files and in displaying them.  I changed the bias to LF.

* TEDITDCL had no content

Its COMS specified lots of records etc from other TEDIT files, but none of those were actually in the symbolic file (the LCOM was OK).  I loaded all of the other TEDIT files and remade/recompiled this, looks like it captured everything
2021-04-30 20:45:52 -07:00
rmkaplan
05df858e55 Revert Linebuffer to CR
Explicitly made LINEBUFFER in ATERM specify CR independent of the new default stream EOLCONVENTION of LF in FILEIO.  Don't know why the TTY editor needs CR.
2021-04-29 09:53:56 -07:00
Larry Masinter
f64f8bbb87 loadup cleanups (#306) 2021-04-28 18:07:23 -07:00
Larry Masinter
2388f730ca fix permissions (#307) 2021-04-28 17:57:07 -07:00
Larry Masinter
607d9ab2e7 Add a brief sanity check to loadup process (#314)
Each step of the loadup now starts with a 'touch' to create a timestamp. At the end of the loadup, it makes sure the files needed by the next step are newer. This will catch some of the problems.
2021-04-28 17:15:35 -07:00
rmkaplan
f0ad3c5f60 All source files converted to LF (#315)
* All source files converted to LF

Also, HPRINT:  EQUALALL knows about CL arrays
FILEIO:  STREAM record with fields for external format functions

* Delete makeinit.dribble

* Converted CR to LF on internal/library and docs/Documentation Tools
2021-04-28 15:36:03 -07:00
rmkaplan
179325c528 Remove SEDIT-GAP from lispusers/ISO8859IO
Also converted to LF, while I was at it
2021-04-24 17:20:30 -07:00
rmkaplan
21c8759084 Change default EOL to LF on UFS (#312)
UFS changes the the default in \UFSeol to LF.EOLC.  LLREAD changes \rprint2 to convert EOL to LF if escaped in a string.  NSPROTECTION eliminates literal EOL
2021-04-22 21:10:48 -07:00
Nick Briggs
f0b9ce3dae Fix eolconv.sh script so tr doesn't choke on bad UTF-8 data (#309) 2021-04-17 22:47:31 -07:00
Larry Masinter
1d81350714 guard didn't include #endif 2021-04-05 21:56:17 -07:00
Larry Masinter
5a83a9cd8f Add writing guard and running again 2021-04-05 21:56:17 -07:00
Larry Masinter
ba70b3a126 spell nightly correctly 2021-04-05 21:55:22 -07:00
Larry Masinter
26e4af726a Default tag to nightly 2021-04-05 21:55:22 -07:00
Larry Masinter
ad912885aa needed updated release-notes.md 2021-04-05 21:55:22 -07:00
Larry Masinter
ee5efd782f add missing font directories 2021-04-05 21:55:22 -07:00
Larry Masinter
9ddef79484 add scripts to release 2021-04-05 21:55:22 -07:00
Larry Masinter
5a04b88dcc tar files have version tag 2021-04-05 21:55:22 -07:00
Larry Masinter
945ffe56f8 Second try release scripts 2021-04-05 21:55:22 -07:00
Larry Masinter
7d8efbdfd6 Fix MAKESYSNAME (misspelled) and move GATHER-INFO to my personal init 2021-04-05 21:53:13 -07:00
Larry Masinter
6e9791ad0a Add back in files that were in lisp.venuesysout 2021-04-05 21:53:13 -07:00
Larry Masinter
3e64317db5 TEMPORARILY add files needed to compile (or load) that had been moved to 'obsolete/' 2021-03-31 14:07:31 -07:00
Larry Masinter
78d53039c5 dwim dwimify checktran fix (#295)
* Use checktran for all uses except in newfault1 block

* Replace CHECKTRAN+ with /DWIMCHECKTRAN only used in DWIM to undoably /RPLNODE the original, e.g. for spelling correction. Should be fixed for CL:LAMBDA
2021-03-22 20:25:17 -07:00
Larry Masinter
094f0146c9 sysout logout version (#296)
* Fix sysout makesys to make new versions

* redoing some lost edits
2021-03-22 20:22:22 -07:00
Larry Masinter
3c33ba0b7e Revert "Fix sysout makesys to make new versions (#277)" (#293)
This reverts commit 3409522d67.
2021-03-22 09:56:33 -07:00
Larry Masinter
489642573d Revert "Checktran called from outside block, remove one blockcompile (#278)" (#292)
This reverts commit ada3a6391a.
2021-03-22 09:45:31 -07:00
Larry Masinter
ada3a6391a Checktran called from outside block, remove one blockcompile (#278) 2021-03-22 09:33:55 -07:00
Larry Masinter
3409522d67 Fix sysout makesys to make new versions (#277)
* Fix sysout makesys to make new versions

* redoing some lost edits

* add new loadups
2021-03-22 09:31:52 -07:00
Larry Masinter
c2afb8265b Undid prior attempt to optimize (#283) 2021-03-19 18:15:18 -07:00
Nick Briggs
558f4c6655 Loadup failure ldeinit (#286)
* a litte better info and checking

* fix typo

Co-authored-by: Larry Masinter <LMM@acm.org>
2021-03-19 15:45:20 -07:00
Larry Masinter
9975e44b0a MAPATOMS contains an older definition (by a few hours) than fn in LLBASIC (#256) 2021-03-19 12:45:29 -07:00
Larry Masinter
99f28008dc make initial whereis.hash size bigger 2021-03-16 22:09:34 -07:00
Larry Masinter
9b80a9f81b Changes to interpret.rem.cm and sysout et all (#273) 2021-03-15 17:18:00 -07:00
Larry Masinter
114fbebc5a Remove awkward duplicate function CHECKTRAN (#274) 2021-03-15 16:41:50 -07:00
rmkaplan
a297686908 MODERNIZE SKETCH WINDOWS
Fix MODERNIZE, SKETCH, and GRAPHER so that modernization happens whether MODERNIZE is loaded before or after the other packages
2021-03-15 13:04:02 -07:00
Larry Masinter
9156590679 Hope this whereis.hash works better 2021-03-14 22:01:13 -07:00
Larry Masinter
7c4b45fa81 new loadup full (#261)
* (hopefully) improve the loadup-full process

* go back to rebuilding in {CORE} and copy when done

* I think these fix the loadups problem

* perhaps unnecessary update but useful test'

* WIP: more loadup cleanup

* brute force: close open files when done loadup

* new loadups to match
2021-03-12 17:27:19 -08:00
Nick Briggs
6cd13acf36 Merge pull request #252 from Interlisp/dup-new-TEDIT
move older "new" TEDIT
2021-03-11 21:41:24 -08:00
Larry Masinter
621c93c3a9 add options to run-medley for new sysouts (#259) 2021-03-12 05:35:44 +00:00
Larry Masinter
14d927bf71 COLOR on LispUsers older than copy in library (#255) 2021-03-11 23:38:49 +00:00
Larry Masinter
fc96c6441d Added release notes (#225)
Added the last version of the release notes in PDF

Co-authored-by: Arun Welch <Anzus@users.noreply.github.com>
2021-03-11 10:17:21 -08:00
Larry Masinter
2fa35baccc Remove whereis.hash 2021-03-10 18:10:54 -08:00
Larry Masinter
7a7e6f3b67 Save RDSYS for reading sysouts. Made by loadup-init (#251) 2021-03-10 14:01:17 -08:00
Larry Masinter
6c25898c7d unixprint (#254)
* UNIXPRINT.TEDIT upper case

* UNIXPRINTCOMMAND was an older copy of UNIXPRINT
2021-03-10 13:59:38 -08:00
Larry Masinter
f6eed8b043 READ-PRINT-PROFILE only mentioned by internal/library/MULTI-COMPILE (#258) 2021-03-10 21:42:00 +00:00
Larry Masinter
9cbd5b6e76 Files duplicated or older versions of library/lafite (#250) 2021-03-10 20:56:52 +00:00
Larry Masinter
ca7fe181f5 Minor change to remove duplicate function, but 2021-03-09 20:15:18 -08:00
Larry Masinter
38a0e0c6d1 We might revisit this, but it looks like new was all written in spring of 1995 2021-03-09 19:26:55 -08:00
Larry Masinter
3156b7c1f4 Save RDSYS for reading sysouts. Made by loadup-init 2021-03-09 19:01:26 -08:00
Larry Masinter
4119b2a680 Make exports.all and whereis.hash in tmp directory. Add script to release. (#249) 2021-03-09 17:25:13 -08:00
Larry Masinter
5d93ffc7c5 SUNFONT set DISPLAYFONTDIRECTORIES incorrectly (#248) 2021-03-09 17:21:50 -08:00
Larry Masinter
b5fdf0fd50 XREM.CM used in mid-from-init loadup script doesn't need package lookups (#246) 2021-03-08 22:52:49 -08:00
Larry Masinter
a0f3d8b475 remove nits (#245)
* Not 100% sure about this one, looks like proposed change not sure if it was taken o abandoned; no referenced

* YREM.CM was used with old loadup process; P4A.scn isn't referenced, looks like junk
2021-03-08 22:44:03 -08:00
Larry Masinter
3e6e104d86 Main cleanup of new init process, scripts, etc (#243) 2021-03-08 22:36:27 -08:00
Larry Masinter
ea9137f71f Of historical interest: BCPL and Dorado microcode, moved (#240) 2021-03-08 22:22:39 -08:00
Larry Masinter
372e6f8e31 Part 3, git mv clos/3.5/* clos 2021-03-08 21:12:00 -08:00
Larry Masinter
28ed557183 part 2, git mv clos/2.01big/ obsolete/clos/ 2021-03-08 21:10:46 -08:00
Larry Masinter
b030cdccc1 part 1, git mv clos.2.0 obsolete/clos/ 2021-03-08 21:09:58 -08:00
Larry Masinter
6c3fcbac7e SYNCLISPFILES was the way of patching sysouts but it was unreliable, full of special cases, obsolete now (#242) 2021-03-09 04:51:22 +00:00
Larry Masinter
6f9648868b delete WINDOW-OLD, old version of WINDOW (#241) 2021-03-09 02:51:25 +00:00
Larry Masinter
9464ec780c remove note files (#238) 2021-03-08 17:04:48 -08:00
Larry Masinter
ec63826fdd Removed files duplicated in Lispusers (#237) 2021-03-08 17:02:04 -08:00
Larry Masinter
a4f447565e Move unused X-window package sources to obsolete (#236) 2021-03-08 17:01:42 -08:00
Larry Masinter
081d78f269 Move all of sunloadup directory to obsolete; may be of historical interest but not needed for loadup (#234) 2021-03-09 00:44:48 +00:00
Larry Masinter
077712fe42 Move all of sunloadup directory to obsolete; may be of historical interest but not needed for loadup 2021-03-08 13:39:53 -08:00
Larry Masinter
7c2ca9116f Forgot an instance of xfull35 => full 2021-03-07 08:53:19 -08:00
Larry Masinter
d16512838e loadups with new stuff 2021-03-03 14:40:53 -08:00
Larry Masinter
55d6821966 Early file cleanup; move networking-related maikoloadupfns to another file 2021-03-03 14:18:40 -08:00
Larry Masinter
a86e440056 Why wasn't MACRO-FN in MSMACROPROPS? 2021-03-03 14:15:51 -08:00
Larry Masinter
70b0d313e4 MEDLEY-FIX-DIRS was on wrong file; start to gather information about cleanups needed 2021-03-03 14:13:34 -08:00
rmkaplan
c904d8ef11 WHEELSCROLL.TXT: describe uintended Tedit scrolling as a current nonfeature 2021-03-02 10:30:57 -08:00
Larry Masinter
8989d55080 Delete xlisp xfull3.5 sysouts
These have been replaced by 'lisp' and 'full' since they no longer depend on (patching) venue sysouts.
2021-03-02 10:21:43 -08:00
Larry Masinter
22e54106da add -m -mem option to Medley, default is 256 2021-03-01 20:51:51 -08:00
Larry Masinter
ab94267c49 update exports.all and whereis.hash to make sure 2021-02-28 21:51:31 -08:00
Larry Masinter
e02c47e90c Merge of LOAD-FULL from Ron and makeinit7, redone 2021-02-28 19:53:57 -08:00
Larry Masinter
e2b7c425b6 Merge branch 'makeinit7' 2021-02-28 18:09:16 -08:00
Larry Masinter
1dcd55b258 Merge in changed files 2021-02-28 18:08:43 -08:00
rmkaplan
2f1b68ea4f MODERNIZE: More work on attached windows, LOADUP-FULL with MODERNIZE replacing MACINTERFACE 2021-02-27 22:01:14 -08:00
rmkaplan
39664945fb Merge branch 'master' of https://github.com/interlisp/medley 2021-02-27 21:59:47 -08:00
rmkaplan
d4e0a1ba28 FILEBROWSER: Edit/see window stay on top
Addresses #216
2021-02-27 21:58:41 -08:00
Nick Briggs
14415e197f Fix run-medley -dimensions processing to make sensible choices (#217)
Given a "-dimension WxH" argument, round up the W to a multiple of 32 for the
Lisp window width and use an X window geometry with an additional
22 pixels for both W and H to account for the current scrollbar size so that
the resulting X window will not require scrolling.
2021-02-28 01:59:06 +00:00
Larry Masinter
7ec7f4cf5c rem.cm no longer used 2021-02-27 10:18:37 -08:00
rmkaplan
a5356980f0 FILEBROWSER: minor cleanup, meta-F seems to work 2021-02-25 15:38:27 -08:00
Larry Masinter
d6f40b5437 set makesysname 2021-02-24 11:33:14 -08:00
rmkaplan
1bdbf22516 CLIPBOARD: fix typo 2021-02-23 22:13:40 -08:00
rmkaplan
8066be6a74 CLIPBOARD: updated with the elaborated xclip commands, to be tested 2021-02-23 17:34:09 -08:00
rmkaplan
81ce9354e2 MODERNIZE: initial push
This is the rename of MACINTERFACE, including a doc file MODERNIZE.TXT.

When ready to install it in a loadup, replace MACINTERFACE with MODERNIZE in sources/LOADUP-FULL.
2021-02-23 10:21:37 -08:00
Larry Masinter
ac9bfd1446 Now that XQuartz supports m1 mac, don't need separate instructions (#179) 2021-02-22 22:19:07 -08:00
rmkaplan
891b08d8d6 Merge branch 'master' of https://github.com/interlisp/medley 2021-02-22 20:43:13 -08:00
Larry Masinter
429294c61f Restore fontprofile (#200)
* restore FONTPROFILE and PATCH

* extra (dup) version
2021-02-22 19:55:50 -08:00
rmkaplan
4ce9320489 TABLEBROWSER uses newer TABLEBROWSERDECLS, older TBDECLS is deprecated
TABLEBROWSER uses newer TABLEBROWSERDECLS, older TBDECLS is deprecated
2021-02-22 19:55:50 -08:00
rmkaplan
5cba07aabc WHEELSCROLL: a little tuning, plus a WHEELSCROLL.TXT file 2021-02-22 19:55:50 -08:00
rmkaplan
500a55d0af PRETTY: Fix PRINTCOPYRIGHT1 to avoid line overflow 2021-02-22 19:55:49 -08:00
rmkaplan
d4169488ec TWODINSPECTOR: fixed error in 2D layout, synchronized scrolling of values and indexes 2021-02-22 19:55:49 -08:00
rmkaplan
bd1a8ce561 EMACS: Removed outdated copies of Tedit functions and dependency on old BQUOTE emulation, so that it now at least loads and compiles. But it doesn't work. 2021-02-22 19:55:49 -08:00
rmkaplan
ea64c5e612 MACINTERFACE: more consistent recognition of corner and titlebar clicking, and more appropriate ghost regions of reshaping and moving 2021-02-22 19:55:49 -08:00
rmkaplan
795983e8f5 WHEELSCROLL: no action if the wheel moves while in a pop-up scroll bar 2021-02-22 19:55:49 -08:00
rmkaplan
ac08f3ab1a Added 2 lines in SCROLL.HANDLER in WINDOWSCROLL so that vertical and horizontal scrollbar windows are recognizable and recognizably related to their main windows. This allows WHEELSCROLL to provide better wheel-scrolling behavior 2021-02-22 19:55:49 -08:00
rmkaplan
e468314846 DINFO: removed compile-time declarations from compiled file 2021-02-22 19:55:49 -08:00
rmkaplan
0b541fbecd Tedit scrolling executed in mouse process 2021-02-22 19:55:49 -08:00
rmkaplan
28783fe510 Better behavior when the wheel moves inside a scroll bar 2021-02-22 19:55:49 -08:00
rmkaplan
43706dc311 First commit of wheel-mouse scrolling 2021-02-22 19:55:49 -08:00
Larry Masinter
b7458b24be Restore fontprofile (#200)
* restore FONTPROFILE and PATCH

* extra (dup) version
2021-02-22 18:09:07 -08:00
Larry Masinter
30e47fc811 Remove use of ~/rem.cm in loadups. Now the LDEINIT file is checked instead; probably can get rid of even that, later 2021-02-22 16:12:20 -08:00
rmkaplan
582b927ea5 CLIPBOARD: Delete old versions 2021-02-22 15:12:52 -08:00
rmkaplan
5e73577a6f CLIPBOARD: Added xclip as default (non-mac) stream names, added .txt file
Other platforms may require different clipboard-stream names
2021-02-22 14:59:33 -08:00
rmkaplan
7c74e2f3af MACINTERFACE: first step towards renaming to MODERNIZE 2021-02-22 14:09:43 -08:00
rmkaplan
439b48a1aa Delete TWODINSPECTOR.LCOM.~2~ 2021-02-22 14:09:14 -08:00
rmkaplan
3351dddc79 FILEBROWSER: Build-in anticipation of MODERNIZE, eliminate line feeds 2021-02-22 13:00:49 -08:00
rmkaplan
217d5a17d2 WHEELSCROLL: Added keyactions for LEFT/RIGHT 2021-02-22 12:48:51 -08:00
rmkaplan
3e13151e59 Cleaning out old versions of MACINTERFACE 2021-02-21 21:15:35 -08:00
rmkaplan
d385cf61f3 Using Git Desktop to clean out old version-number files 2021-02-21 21:13:25 -08:00
rmkaplan
a9ce553070 Update COMPAREDIRECTORIES.TEDIT 2021-02-21 21:04:05 -08:00
rmkaplan
48209a75a7 COMPAREDIRECTORIES: removed makesysout from MEDLEY-FIX-DIRS, new EOLTYPE tool
Larry reorganized the directories so makesysout no longer exists.  EOLTYPE now takes a SHOWCONTEXT argument.  This prints the context of eol characters that are not consistent with the original type of the file.
2021-02-21 20:55:25 -08:00
rmkaplan
d7eca38b27 TABLEBROWSER uses newer TABLEBROWSERDECLS, older TBDECLS is deprecated
TABLEBROWSER uses newer TABLEBROWSERDECLS, older TBDECLS is deprecated
2021-02-21 17:47:34 -08:00
rmkaplan
6b53149afa WHEELSCROLL: a little tuning, plus a WHEELSCROLL.TXT file 2021-02-21 17:34:42 -08:00
rmkaplan
0009c2f4e4 PRETTY: Fix PRINTCOPYRIGHT1 to avoid line overflow 2021-02-21 13:41:15 -08:00
rmkaplan
53c173a943 TWODINSPECTOR: fixed error in 2D layout, synchronized scrolling of values and indexes 2021-02-19 14:38:24 -08:00
rmkaplan
a74f8784e5 EMACS: Removed outdated copies of Tedit functions and dependency on old BQUOTE emulation, so that it now at least loads and compiles. But it doesn't work. 2021-02-19 11:46:03 -08:00
Larry Masinter
b14cbb2f77 typo in -gr instead of -g 2021-02-18 12:29:23 -08:00
Larry Masinter
7b1c12989f run-medley -prog option for selecting ldeinit; update screen dimensions 2021-02-18 10:22:46 -08:00
rmkaplan
97cbd66288 MACINTERFACE: more consistent recognition of corner and titlebar clicking, and more appropriate ghost regions of reshaping and moving 2021-02-17 23:41:40 -08:00
rmkaplan
57680d588d WHEELSCROLL: no action if the wheel moves while in a pop-up scroll bar 2021-02-17 22:52:31 -08:00
Larry Masinter
c46e57fabc loadup on pi 2021-02-17 19:10:30 -08:00
Larry Masinter
80223da625 split loadup of lisp into two phases for better debugging 2021-02-17 14:58:53 -08:00
rmkaplan
c406cbf2ad Added 2 lines in SCROLL.HANDLER in WINDOWSCROLL so that vertical and horizontal scrollbar windows are recognizable and recognizably related to their main windows. This allows WHEELSCROLL to provide better wheel-scrolling behavior 2021-02-17 14:00:23 -08:00
Larry Masinter
25568bf0fe Update LOADUP-INIT.LISP 2021-02-17 11:30:42 -08:00
rmkaplan
0c7fed9a18 DINFO: removed compile-time declarations from compiled file 2021-02-17 08:55:59 -08:00
rmkaplan
6c8ef665bb Tedit scrolling executed in mouse process 2021-02-16 22:37:49 -08:00
rmkaplan
a8a9b69e94 Better behavior when the wheel moves inside a scroll bar 2021-02-16 15:44:08 -08:00
rmkaplan
f5d8a17e74 First commit of wheel-mouse scrolling 2021-02-15 20:31:14 -08:00
Larry Masinter
cfded49965 minor cleanups 2021-02-14 11:28:31 -08:00
Larry Masinter
4e5f0beafb loadups to go with new files 2021-02-14 00:42:47 -08:00
Larry Masinter
63481a174e Change default lock toggle to match 2021-02-14 00:09:51 -08:00
Larry Masinter
9143c29cca Push to get new loadups for making an init, loadup a lisp and then a full 2021-02-14 00:08:37 -08:00
Larry Masinter
e2239ae6a5 make init files 2021-02-13 14:45:47 -08:00
Larry Masinter
198ce09b0d files remade for init 2021-02-13 09:01:21 -08:00
Larry Masinter
18710d62f6 Edit ATBL to match older version for init and loadup 2021-02-13 08:58:16 -08:00
Larry Masinter
bef35d1423 Fixing init build 2021-02-12 23:14:33 -08:00
Larry Masinter
975610b803 Partial cleanup of old versions no longer needed 2021-02-12 23:04:22 -08:00
Larry Masinter
b94dae7889 FASLOAD needs LCOM not .DFASL 2021-02-12 20:42:38 -08:00
Larry Masinter
745fa7f506 remove old versions of FONT 2021-02-12 20:38:03 -08:00
Larry Masinter
3b1c7c2dae sources/LLPARAMS was pre BIGVM 2021-02-12 20:33:40 -08:00
Larry Masinter
ddf2fddd7a Turn off CACHEDISPLAYFONTS because of init problems; not important 2021-02-12 19:42:36 -08:00
Larry Masinter
43372329cf LLFAULT had init problems, cleaned up 2021-02-12 19:35:09 -08:00
Larry Masinter
ea85de4c37 defoptimizer won't work on early init, remove it (not important) 2021-02-12 19:30:21 -08:00
Larry Masinter
00bb81aec4 Interlisp macros (including BQUOTE) can't be used in interpreted code until DWIMIFY is loaded 2021-02-12 17:03:01 -08:00
Larry Masinter
c3d89a7f34 move loadup scripts + part of initial phase of cleanup (#174) 2021-02-11 16:35:41 -08:00
Larry Masinter
946472410c Remove MACHINEINDEPENDENT patch by making it LOADable 2021-02-06 13:23:59 -08:00
Larry Masinter
ed9abc6f82 remove LLREADPATCH from patches, make LLREAD reloadable using MOVD? 2021-02-06 13:03:03 -08:00
Larry Masinter
dfb28cec43 remove spurious load of PUPPRINT
There might possibly be converters from PRESS format
but no PUP-based printers. Anyway  fixes Medley #172
2021-02-05 22:25:17 -08:00
rmkaplan
fa559449a1 UTF-8 wasn't interpreting EOLCONVENTION (#171)
Fixed UNICODE character fns to interpret the stream's EOLCONVENTION
2021-02-03 16:12:59 -08:00
Larry Masinter
c7463ca04f add sunloadup to fix directories, let fix-dates take a directory 2021-01-28 12:24:31 -08:00
Larry Masinter
f2d3bafdf9 Do MEDLEY-UTILS rename and move to internal/library 2021-01-23 12:16:14 -08:00
Larry Masinter
2eb317260c starting work on makeinit 2021-01-23 12:13:40 -08:00
Larry Masinter
21efad5faa Combine Sun Users Guide pdfs and export to HTML 2021-01-23 03:55:53 +00:00
Larry Masinter
ae38d644ac Revert "Move organizational health files (back)to Interlisp/.GitHub master branch (#147)" (#165)
This reverts commit eb502eed24.
2021-01-22 18:05:14 -08:00
Larry Masinter
eb502eed24 Move organizational health files (back)to Interlisp/.GitHub master branch (#147)
* update MAKE-EXPORTS-ALL and run it

* now served from Interlisp/.github repo

* Revert "update MAKE-EXPORTS-ALL and run it"

This reverts commit 08e8c7fd8b.
split out
2021-01-22 18:02:00 -08:00
Larry Masinter
2ced7080e5 Rename to MEDLEY-FIX-LINKS & make sure it is run from MEDLEYDIR or unix path suppllied (#155) 2021-01-22 17:54:31 -08:00
Larry Masinter
08397a1d13 WIP: remove duplicate fonts; how do I test this? (#158) 2021-01-22 17:52:41 -08:00
Larry Masinter
75f477005c better setting for PDF -> HTML 2021-01-22 15:26:25 -08:00
Larry Masinter
a507f2dcfe Convert primer from PDF to HTML using recognition 2021-01-22 22:41:07 +00:00
Larry Masinter
92b01de6e6 optimized size of PDFs, put together one (300k) primer 2021-01-22 14:32:26 -08:00
Larry Masinter
5c0bcdfdde Update instructions for building and running & coordinate with Wiki (#161)
* Move instructions for building and running to Wiki

* oops typo

* Move (revised) build instructions back

* More tweaking
2021-01-22 11:24:52 -08:00
Nick Briggs
6c5fc920cd Merge pull request #156 from Interlisp/movepalatino
move palatino fonts down into c0
2021-01-18 23:35:05 -08:00
Larry Masinter
c7ba2e0651 move palatino fonts down into c0 2021-01-18 23:15:31 -08:00
Nick Briggs
6edbe90e89 Merge pull request #153 from Interlisp/medley-utilities
Medley utilities
2021-01-17 22:24:00 -08:00
Larry Masinter
647ed31704 remove expectation of system.hash. make run-medley work from wherever. add in eol diff fix 2021-01-17 15:13:06 -08:00
Larry Masinter
88fac61a47 Made EXPORTS.ALL, drop system.hash 2021-01-16 23:16:20 -08:00
Larry Masinter
6b5817a279 Collect together utilities for maintenance - EXPORTS.ALL WHEREIS.HASH etc 2021-01-16 22:22:16 -08:00
Larry Masinter
64b2a4978a dir and fb behave badly when filing.enumeration.depth is T; change it (#151)
"fix" (of sorts) for #140
2021-01-14 23:33:19 -08:00
rmkaplan
1121d1e19f Added ~= selector for COMPAREDIRECTORIES to exclude byte-equal files. Added DIR argument to MEDLEY-FIX-DIRS (#141)
now that I can look again, there is nothing lost
2021-01-12 23:54:17 -08:00
Larry Masinter
c15816c897 add MEDLEY-FIX-DIRS to fix dates of (most of) medley repo (#129)
* add MEDLEY-FIX-DIRS to fix dates of (most of) medley repo -- should be done on any checkout / clone / pull

* Fix typos
2021-01-05 16:05:57 -08:00
Larry Masinter
1830b3fd1c Delete TEXTMODULES
moved to Library
2021-01-05 14:24:00 -08:00
Larry Masinter
3219c519b1 Undo 2 edits correcting textmodules ref (#131) 2021-01-05 10:48:55 -08:00
Larry Masinter
7231fa9e05 Larry teditmenu (#128)
* ^j => ^M

* new full sysout to go with tedit fix
2021-01-04 17:21:31 -08:00
Larry Masinter
37aafbeab0 once more 2021-01-03 19:50:35 -08:00
Larry Masinter
52dc16c01f move templates under .github 2021-01-03 19:37:42 -08:00
Larry Masinter
fb6f239b1c add back copies from .github repo
https://github.community/t/default-community-files-ignores-issue-templates/2802/3
2021-01-03 19:23:19 -08:00
Larry Masinter
ef628926d6 Delete CODE_OF_CONDUCT.md
moved to .github repo for all  repos
2021-01-03 14:59:01 -08:00
Nick Briggs
bfc7b7444b Merge pull request #123 from Interlisp/remove-maiko-submodule
Remove Maiko submodule.
2021-01-01 11:13:46 -08:00
Abe Jellinek
d52c4456df Remove Maiko submodule.
I was under the impression that Git submodules had improved; they have not.
Submodules still require manual updates, effort on the part of the user to
initialize them, and constant maintenance. There's such a thing as a
"subtree," which might better fit our needs, but I'm going to scrap the whole
idea for now because the advantages over cloning both repositories separately
(or having an init script that does it for us) aren't clear.
2021-01-01 11:09:11 -08:00
Larry Masinter
af69770bec Merge pull request #118 from Interlisp/ignore-versions
Ignore versions + macinterface + some cleanup of internal/test
2020-12-31 10:08:40 -08:00
Larry Masinter
0e08605de7 Merge pull request #112 from Interlisp/add-code-of-conduct-1
Create CODE_OF_CONDUCT.md
2020-12-29 15:46:41 -08:00
Larry Masinter
7134585e9b Create CODE_OF_CONDUCT.md 2020-12-29 10:54:19 -08:00
Larry Masinter
ed534309ed more cleanup of tests 2020-12-28 10:33:23 -08:00
Larry Masinter
89cea11658 incorporate new xfull35
with Ron's update to macinterface
2020-12-27 12:26:08 -08:00
rmkaplan
fe19438659 Fix bug in MACINTERFACE for better (but not perfect) behavior with attached windows 2020-12-27 12:09:32 -08:00
Larry Masinter
2f41e9e5bf ignore versions 2020-12-27 10:13:15 -08:00
Larry Masinter
3374d8cb53 fix script perms 2020-12-24 19:28:33 -08:00
Larry Masinter
58e76b593c Merge branch 'master' of https://github.com/interlisp/medley 2020-12-24 19:18:19 -08:00
Larry Masinter
623f75a917 Merge pull request #107 from Interlisp/lisp-testing
Lisp testing
2020-12-24 19:17:01 -08:00
Larry Masinter
ec383ad7a0 git clone pronlrmd
i was having trouble cloning medley from windows; worked fine in WSL.

This is what GitHub Desktop for windows thinks needs to be done.
2020-12-24 18:58:46 -08:00
Larry Masinter
c74934fbe2 Some trouble clonning repo with these files 2020-12-24 18:03:03 -08:00
Larry Masinter
211bf95877 remove a few files 2020-12-24 17:58:01 -08:00
Larry Masinter
8c162e264b broken shell scripts; need to start with hash bang 2020-12-24 15:01:44 -08:00
Larry Masinter
7958f65c95 Clean out useless / obsolete / duplicate tests 2020-12-21 15:10:01 -08:00
Larry Masinter
028702ff90 Update README.md 2020-12-20 21:13:03 -08:00
Larry Masinter
9b4fcdac64 see README for status 2020-12-19 19:23:01 -08:00
Larry Masinter
5ce20b2f45 Merge branch 'master' of https://github.com/interlisp/medley 2020-12-16 18:22:49 -08:00
Larry Masinter
bffbf30c8e Start to clean out envos test directory 2020-12-16 18:21:28 -08:00
Arun Welch
30554c3866 Sun Users Guide 2020-12-15 19:18:04 -07:00
Larry Masinter
ca5acfe5c6 Delete OPTESTS.DFASL 2020-12-15 00:15:24 -08:00
Larry Masinter
425afa50c0 Delete BBTESTS.DFASL 2020-12-15 00:13:38 -08:00
Larry Masinter
75f6712f5c Rename BBTESTS to bbtests
error: invalid path 'internal/test/Maiko/Aux/BBTESTS'
2020-12-15 00:02:23 -08:00
Larry Masinter
bd492b34ff rework MEDLEY-INIT-VARS 2020-12-14 19:15:43 -08:00
Larry Masinter
68c5f7c65b -geometry was broken 2020-12-14 14:46:41 -08:00
Larry Masinter
d8d5935a54 Merge pull request #78 from Interlisp/fix-run-medley
Don't change LOGINDIR LDEINIT default if already set
2020-12-14 13:51:31 -08:00
Larry Masinter
f3691a7b6d gabriel folder needs EOL swap tr handling 2020-12-14 11:56:09 -08:00
Arun Welch
b9901709c9 Rooms built for Medley 3.5 2020-12-13 17:54:28 -07:00
Arun Welch
a3425ec303 Working for Medley 3.5 2020-12-13 17:51:51 -07:00
Arun Welch
fde929a6d3 Tools to build the indexes 2020-12-13 17:11:43 -07:00
Arun Welch
5b384db4e1 added converted TEDIT and IMPTR files 2020-12-13 17:04:48 -07:00
Arun Welch
330f259470 Medley primer in PDF format
Primer TEDIT's converted to PDF
2020-12-12 22:53:24 -07:00
Larry Masinter
4c67817130 fix init of LOGINHOST/DIR and IRM.DINFOGRAPH 2020-12-12 16:34:15 -08:00
Larry Masinter
b221975603 Don't change LOGINDIR LDEINIT default if already set 2020-12-12 13:23:18 -08:00
Larry Masinter
4081a8b641 Another variable IRM.DINFOGRAPH needs resetting 2020-12-11 19:06:52 -08:00
Larry Masinter
693819da87 Wasn't clearing old values after loadup 2020-12-10 22:44:15 -08:00
Larry Masinter
f5961c9847 minor cleanup; empty bin directory of old binaries 2020-12-10 18:45:42 -08:00
Larry Masinter
01491ff031 always work in a branch 2020-12-06 00:34:32 -08:00
Larry Masinter
88464efcd8 still not getting sync between loadup and after loadup 2020-12-05 20:46:06 -08:00
Larry Masinter
56ee6a8cba cleanup 2020-12-05 17:46:43 -08:00
Larry Masinter
4ffb879760 get rid of venue logo window 2020-12-05 16:26:13 -08:00
Larry Masinter
8e89c99d67 wasn't computing which files to load correctly; also reworked MEDLEYDIR 2020-12-05 13:23:28 -08:00
Abe Jellinek
0ff3ac07d2 Merge macOS instructions 2020-12-02 14:11:39 -08:00
Abe Jellinek
253df8b146 More macOS build/run instructions for users without Docker 2020-12-02 14:09:58 -08:00
Abe Jellinek
24e3e2acd3 Unify the READMEs
- axe the outdated parts of README-MAC.txt
- let's present Docker as the easy default here; Maiko build
  instructions are in that repo
2020-12-02 13:57:32 -08:00
Abe Jellinek
c66fd9a4d8 Delete run-medley-mac: run-medley works on macOS 2020-12-02 13:36:06 -08:00
Abe Jellinek
3aaa8c9837 Update run-medley
- Pass through args correctly
- Help text that matches (more or less) the available params
- Add --dimensions to make setting screen size and geometry straightforward
2020-12-02 13:32:01 -08:00
Larry Masinter
ec4f57461c So far, it looks like every file with through tr '\r\n' '\n\r' swapping cr and lf. 2020-12-01 17:56:50 -08:00
Larry Masinter
5584b38276 avoid using ~ or 2020-11-30 15:54:28 -08:00
Larry Masinter
e5f1166e73 import benchmarks and tests from Envos 1993 history to start refurbishing 2020-11-30 12:08:03 -08:00
Larry Masinter
1bbb2344d7 Didn't expand ~ for lisp.virtualmem 2020-11-30 11:14:23 -08:00
Larry Masinter
d4adca5aae don't know where rem.cm came from (MAKEINIT?) but it's gone now 2020-11-29 15:29:36 -08:00
Larry Masinter
1935a35bf9 rewrite to merge in Abe's changes to run-medley and test 2020-11-29 15:08:08 -08:00
Larry Masinter
8b55778238 include new xlisp.sysout and dribble 2020-11-29 11:47:44 -08:00
Larry Masinter
8a498ea3b1 Get lisp and full loadups to run; fix unicode directory 2020-11-29 11:07:22 -08:00
Larry Masinter
9c3e2f746d converging on loadup full 2020-11-28 20:11:38 -08:00
Larry Masinter
a25d98081a fix bugs and start working on loadup changes 2020-11-28 10:54:11 -08:00
Larry Masinter
fc7eeaeb6e update USERGREETFILES based on Ron's email 2020-11-27 13:02:54 -08:00
Larry Masinter
6c4761799e Pick up HELPSYS recompile 2020-11-27 11:29:08 -08:00
Larry Masinter
968b5d96a2 add more options to run-medley; fix HELPSYS compile problem 2020-11-27 10:18:42 -08:00
Larry Masinter
01a532491b reduce options to simplify 2020-11-26 21:21:57 -08:00
Larry Masinter
21fe7fc9c4 update SIMPLE-INIT simplifying it 2020-11-25 19:13:51 -08:00
Larry Masinter
6f66ab388c merge LOCAL-INIT with ron's and simplify some 2020-11-24 11:41:19 -08:00
Abe Jellinek
c9c0113258 run-medley: quote our variables for safety. 2020-11-23 18:59:28 -08:00
Abe Jellinek
f78657b173 run-medley: remove old/inaccurate comments. 2020-11-23 18:52:31 -08:00
Abe Jellinek
0704402930 Rename run-medley args, pass unknowns through.
This allows for a more consistent command-line interface that doesn't
have to duplicate lde's argument parsing. We handle four arguments that
are inconvenient when calling lde directly or that require setting
environment variables, and then the rest is passed through.

At this point, `run-medley-mac` shouldn't be necessary, but I haven't
tested this revised script on a Mac yet, so I'm leaving it be for now.
2020-11-23 18:43:58 -08:00
Larry Masinter
065be116b6 Merge pull request #57 from AbeJellinek/docker
Update Dockerfile and add Maiko as submodule
2020-11-23 14:25:11 -08:00
Larry Masinter
ce4299d11a Merge pull request #66 from Interlisp/reorg-try4
Reorg try4 to match Ron's lispcore
2020-11-23 14:15:34 -08:00
Abe Jellinek
ba65225017 Translate run-medley from csh to POSIX sh.
This is just a first step: a direct translation for compatibility with
non-csh shells. The only change that I made in the logic was to conform
to the directory structure of this branch (`initfiles/local-init` ->
`greetfiles/LOCAL-INIT`).
2020-11-22 16:44:48 -08:00
Larry Masinter
ce4eae736e add merge in Ron's 11/21/2020 lispcore 2020-11-21 13:24:44 -08:00
Larry Masinter
e9a80b1144 merge in Ron's 11/21/2020 lispcore 2020-11-21 13:21:14 -08:00
Larry Masinter
205ad01541 Finish cleanup 2020-11-20 12:30:56 -08:00
Larry Masinter
f5f28c70d6 and add them back 2020-11-19 14:15:01 -08:00
Larry Masinter
903358e543 redoing commit from case sensitive file system 2020-11-19 14:13:47 -08:00
Larry Masinter
f77240ab2d pick up windows-setup 2020-11-19 08:24:12 -08:00
Larry Masinter
ecc89f54a1 upcase rest of displayfont files 2020-11-17 06:52:54 -08:00
Larry Masinter
1d75ba5182 upper case file names 2020-11-16 23:18:13 -08:00
Larry Masinter
71fdc51a0d file name with space messes up scropting 2020-11-16 17:10:21 -08:00
Larry Masinter
84acd5861e remove files moved to history 2020-11-16 17:01:33 -08:00
Larry Masinter
6424116dc9 massive reorganization 2020-11-15 19:22:14 -08:00
Abe Jellinek
634be40664 Add steps to run via Docker 2020-11-02 15:07:28 -08:00
Abe Jellinek
5c28190d5e loadups -> basics in medley repo 2020-11-02 14:59:45 -08:00
Abe Jellinek
fbda23486f Cut image size to 356 MB, down from 2 GB
Using a Docker feature called "multi-stage builds" [1], we build Maiko in
one image, then create a new one into which we copy the final binary but
not sources and headers. Both images are still Ubuntu-based (todo), but
the <400 MB final product is much slimmer than what we had before.

[1]: https://docs.docker.com/develop/develop-images/multistage-build/
2020-11-02 14:56:45 -08:00
Abe Jellinek
c00fea902a Add .dockerignore to slim down builds a bit 2020-11-02 14:43:18 -08:00
Abe Jellinek
140ac59e44 Update Dockerfile and add Maiko as submodule 2020-11-02 14:43:18 -08:00
Larry Masinter
6a758f1aa9 make medley repo match Ron's dropbox
this will give us a stable point on which we can make changes in coordination via git.
NO MORE USING A SHARED DROPBOX
Last major commit wihout a PR against a Medley issue.
2020-10-29 15:31:53 -07:00
Larry Masinter
d89cdeaef7 copy in Ron's dropbox bin 2020-10-29 12:44:21 -07:00
Larry Masinter
fa7186f831 put back fonts from Ron's Dropbox
wholesale copy
2020-10-29 12:42:08 -07:00
Larry Masinter
2bf873ad10 Merge pull request #44 from AbeJellinek/master
Add `-screensize` arg to run-medley
2020-10-12 15:24:44 -07:00
Abe Jellinek
8a41d3058a Add screensize to help 2020-10-12 14:54:11 -07:00
Abe Jellinek
367b3a9b7e Add -screensize arg to run-medley 2020-10-12 10:45:37 -07:00
Larry Masinter
2785ffd329 info about setting up windows using docker 2020-09-21 15:15:36 -07:00
Larry Masinter
c596d3ef79 Update windows-setup.txt 2020-09-19 11:48:15 -07:00
Larry Masinter
2be373c6c8 Update windows-setup.txt 2020-09-18 20:09:47 -07:00
Larry Masinter
02ed8d4bf4 add cl-benchmarks
benchmarks probably belong under internal/benchmarks
2020-09-16 23:17:10 -07:00
Larry Masinter
b47b2290c7 Merge branch 'master' of https://github.com/Interlisp/medley 2020-09-16 22:15:51 -07:00
Larry Masinter
b7f0aca735 Create windows-setup.txt 2020-09-16 22:15:41 -07:00
Larry Masinter
14ec3f28df Update README.md
thanks @pmcjones for trying out the  NOTES
2020-09-14 19:00:31 -07:00
Larry Masinter
b739c0bfdc move (huge) Interlisp manual files to history repo 2020-09-13 21:38:56 -07:00
Larry Masinter
40bf2eaabd Update run-medley 2020-09-02 20:02:28 -07:00
Larry Masinter
e4a584061c Update run-medley 2020-09-02 09:00:06 -07:00
Larry Masinter
1357d69391 Update README.md
explain where we are at (kind of) and what to expect
2020-08-31 15:21:37 -07:00
Arun Welch
b8234b1f4e Create README.md 2020-08-30 20:45:10 -06:00
Arun Welch
80c1d595e5 Created READMEmd
Initial README file
2020-08-30 20:41:22 -06:00
Arun Welch
7807a81b5e Create README.md 2020-08-30 20:38:16 -06:00
Arun Welch
e3ae191874 Update README.md 2020-08-30 20:36:43 -06:00
Arun Welch
cfbf5df2fc Update README.md
Updated for the new directory formats.
2020-08-30 20:32:09 -06:00
Larry Masinter
ad0eaca829 tweaks to match runtime 2020-08-30 17:25:38 -07:00
Larry Masinter
851925875d initial checkin for sources 2020-08-29 18:36:46 -07:00
Larry Masinter
cb46b0b62b initial checkin for library 2020-08-29 18:35:53 -07:00
Larry Masinter
d6580ff010 initial checkin for library 2020-08-29 18:34:00 -07:00
Larry Masinter
b58c88bda3 initial checkin for lispusers 2020-08-29 18:28:07 -07:00
Larry Masinter
feaf0a556f initial checkin for misc files
unicode tables
2020-08-29 18:26:03 -07:00
Larry Masinter
758c289cef intial checkin some useful sysouts 2020-08-29 18:13:52 -07:00
Larry Masinter
32bd3262b2 initial checkin docs 2020-08-29 17:39:57 -07:00
Larry Masinter
c9afda1a8a initial checkin fonts 2020-08-29 17:34:19 -07:00
Larry Masinter
e820723b2d Update README.md 2020-08-24 21:09:11 -07:00
8203 changed files with 2160328 additions and 3 deletions

18
.dockerignore Normal file
View File

@@ -0,0 +1,18 @@
# Object files
*.o
# Editor backups and recovery files
*~
\#*#
# build directories
*.386-x/**
*.386/**
*.sparc-x/**
*.sparc/**
*.x86_64-x/**
*.x86_64/**
*.armv7l-x/**
*.armv7l/**
init.386/**
# core files
core
*.core

9
.gitattributes vendored Normal file
View File

@@ -0,0 +1,9 @@
# Denote all files that are truly binary and should not be modified.
*.tedit binary
*.lcom binary
*.sketch binary
*.dfasl binary
*.TEDIT binary
*.LCOM binary
*.SKETCH binary
*.DFASL binary

32
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,32 @@
---
name: Bug report (not specific)
about: Create a report to help us improve
title: ''
labels: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Files loaded '...'
2. Form to eval and/or menus to click '....'
3. What happened? '....'
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Context (please complete the following information):**
- OS: [e.g. Mac/Linux/Cygwin]
- OS Version: [e.g. High Siera/Ubuntu 18/Raspbian]
- Host arch: [e.g. x86_64, arm7l, arm64, sparc]
- Maiko version: [e.g. commit ID from `git log | head`]
- IL:MAKESYSDATE: [ date ]
**Additional context**
Add any other context about the problem here.

17
.github/ISSUE_TEMPLATE/documentation.md vendored Normal file
View File

@@ -0,0 +1,17 @@
---
name: Documentation problem
about: Problems with this web site?
title: ''
labels: ''
---
**Errors happen. Please tell us the URL**
**What does it say?**
**What should it say?**
**Screen shot**

View File

@@ -0,0 +1,19 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -0,0 +1,32 @@
name: "New entry for **What People Are Saying**"
description: "Suggest a new entry for the **What People are Saying** page"
title: "What People are Saying suggestion"
body:
- type: dropdown
id: contentType
attributes:
label: "What type of entry?"
options:
- Blog
- Tweet
- Email
- Other
validations:
required: true
- type: input
id: entryLink
attributes:
label: Link to entry
description: "What is the link to the item we should add to the **What People are Saying** page?"
validations:
required: true
- type: textarea
id: additionalInformation
attributes:
label: Additional information
description: "Use this space to supply any addiitonal information on the suggested item."
validations:
required: false
- type: markdown
attributes:
value: "## Thank you for your suggestion!"

84
.github/workflows/Dockerfile_medley vendored Normal file
View File

@@ -0,0 +1,84 @@
#*******************************************************************************
#
# Dockerfile to build Medley image from latest Maiko image
# plus latest release tars from github
#
# Copyright 2022-2023 by Interlisp.org
#
# ******************************************************************************
FROM ubuntu:22.04
ARG TARGETPLATFORM
# Handle ARGs, ENV variables, and LABELs
ARG BUILD_DATE=unknown
ARG MEDLEY_RELEASE=unknown
ARG MAIKO_RELEASE=unknown
ARG REPO_OWNER=Interlisp
LABEL name="Medley"
LABEL description="The Medley Interlisp environment"
LABEL url="https://github.com/${REPO_OWNER}/medley"
LABEL build-date=$BUILD_DATE
LABEL medley_release=$MEDLEY_RELEASE
LABEL maiko_release=$MAIKO_RELEASE
ENV MEDLEY_DOCKER_BUILD_DATE=$BUILD_DATE
ENV MEDLEY_RELEASE=$MEDLEY_RELEASE
ENV MAIKO_RELEASE=$MAIKO_RELEASE
ENV LANG=C.UTF-8
# Copy over the release deb files
ADD ./*.deb /tmp
# Get tzdata setup ahead of time
RUN apt-get update; \
ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime; \
DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata; \
dpkg-reconfigure --frontend noninteractive tzdata
# Install Medley/Maiko and add tightvnc server and xclip to the image
RUN apt-get update \
&& apt-get install -y apt-utils \
&& apt-get install -y tigervnc-standalone-server \
&& apt-get install -y xclip \
&& apt-get install -y man-db \
&& apt-get install -y nano \
&& apt-get install -y sudo \
&& p=$(echo "${TARGETPLATFORM}" | sed -e "s#linux/##") \
&& p=$( \
if [ "$p" = "amd64" ]; \
then echo "x86_64"; \
elif [ "$p" = "arm64" ]; \
then echo "aarch64"; \
elif [ "$p" = "arm/v7" ]; \
then echo "armv7l"; \
else \
echo "x86_64"; \
fi \
) \
&& deb="medley-full-linux-${p}-${MEDLEY_RELEASE#medley-}" \
&& deb=${deb}_${MAIKO_RELEASE#maiko-}.deb \
&& apt-get install -y /tmp/${deb} \
&& chown --recursive root:root /usr/local/interlisp \
&& (if [ -n "$(which unminimize)" ]; then (yes | unminimize); fi)
# "Finalize" image
EXPOSE 5900
RUN adduser --gecos "" medley \
&& adduser --gecos "" ubuntu \
&& adduser medley sudo \
&& adduser ubuntu sudo \
&& (echo 'medley:yeldem' | chpasswd ) \
&& (echo 'ubuntu:utnubu' | chpasswd ) \
&& echo "medley ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers \
&& echo "ubuntu ALL=(ALL) NOPASSWD:ALL" >>/etc/sudoers \
&& mkdir -p /home/medley/il \
&& chown medley:medley /home/medley/il
ENV TERM=xterm
USER medley
WORKDIR /home/medley
#ENTRYPOINT USER=medley Xvnc -SecurityTypes none -geometry 1280x720 :0 & DISPLAY=:0 medley --full -g 1280x720
ENTRYPOINT /bin/bash

268
.github/workflows/buildDocker.yml vendored Normal file
View File

@@ -0,0 +1,268 @@
#*******************************************************************************
# buidDocker.yml
#
# Workflow to build and push a multiplatform (amd64, arm64 & arm7) Linux Docker
# image for Medley. This workflow uses the latest Maiko docker image and the
# latest Medley release on github.
#
# This workflow contains a sentry that causes it to skip the build (as identified
# by its commit SHA) if its already been done. Setting the "force" input to true
# will bypass this sentry,
#
# Updated 2022-01-18 by Frank Halasz from on earlier buildDocker.yml
#
# Copyright 2022 by Interlisp.org
#
# ******************************************************************************
name: 'Build/Push Docker Image'
# Run this workflow on ...
on:
workflow_dispatch:
inputs:
draft:
description: "Mark this as a draft release"
type: choice
options:
- 'false'
- 'true'
force:
description: "Force build even if build already successfully completed for this commit"
type: choice
options:
- 'false'
- 'true'
workflow_call:
outputs:
successful:
description: "'True' if medley docker build completed successully"
value: ${{ jobs.complete.outputs.build_successful }}
inputs:
draft:
description: "Mark this as a draft release"
required: false
type: string
default: 'false'
force:
description: "Force build even if build already successfully completed for this commit"
required: false
type: string
default: 'false'
secrets:
DOCKER_USERNAME:
required: true
DOCKER_PASSWORD:
required: true
defaults:
run:
shell: bash
jobs:
######################################################################################
# Regularize the inputs so they can be referenced the same way whether they are
# the result of a workflow_dispatch or a workflow_call
inputs:
runs-on: ubuntu-latest
outputs:
draft: ${{ steps.one.outputs.draft }}
force: ${{ steps.one.outputs.force }}
steps:
- id: one
run: >
if [ '${{ toJSON(inputs) }}' = 'null' ];
then
echo "workflow_dispatch";
echo "draft=${{ github.event.inputs.draft }}" >> $GITHUB_OUTPUT;
echo "force=${{ github.event.inputs.force }}" >> $GITHUB_OUTPUT;
else
echo "workflow_call";
echo "draft=${{ inputs.draft }}" >> $GITHUB_OUTPUT;
echo "force=${{ inputs.force }}" >> $GITHUB_OUTPUT;
fi
######################################################################################
# Use sentry-action to determine if this release has already been built
# based on the latest commit to the repo
sentry:
needs: inputs
runs-on: ubuntu-latest
outputs:
release_not_built: ${{ steps.check.outputs.release_not_built }}
steps:
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
- run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }}
# Check if build already run for this commit
- name: Build already completed?
id: check
continue-on-error: true
uses: ./../actions/check-sentry-action
with:
tag: "docker"
######################################################################################
#
# Build and push the medley docker image
#
build_and-push:
runs-on: ubuntu-latest
needs: [inputs, sentry]
if: |
needs.sentry.outputs.release_not_built == 'true'
|| needs.inputs.outputs.force == 'true'
steps:
# Checkout latest commit
- name: Checkout Medley
uses: actions/checkout@v3
# Find latest release (draft or normal)
# and download its assets
- name: Download linux debs from latest (draft) release
run: |
tag=""
if [ "${{ needs.inputs.outputs.draft }}" = "true" ];
then
tag=$(gh release list | grep Draft | head -n 1 | awk '{ print $3 }')
fi
if [ -z "${tag}" ];
then
tag=$(gh release list | grep Latest | head -n 1 | awk '{ print $3 }')
fi
mkdir -p release_debs
gh release download ${tag} -D release_debs -p '*-linux-*.deb'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Get Maiko and Medley release information from name of deb files
# just downloaded from the Medley latest release
- name: Get info about Miako and Medley releases
id: release_info
run: |
regex="^medley-full-[^-]*-[^-]*-\([^_]*\)_\(.*\).deb\$"
ls -1 release_debs | head -n 1 > debname.tmp
medley_release="medley-$(sed -e "s/${regex}/\1/" debname.tmp)"
maiko_release="maiko-$(sed -e "s/${regex}/\2/" debname.tmp)"
rm -f debname.tmp
echo "MEDLEY_RELEASE=${medley_release}" >> ${GITHUB_ENV}
echo "MAIKO_RELEASE=${maiko_release}" >> ${GITHUB_ENV}
# regex="^[^0-9]*\([^_]*\)_\([^-]*-[^-]*\)-\([^-]*\)-\([^.]*\).*\$"
# Set repo env variables
- name: Set repo/docker env variables
id: repo_env
run: |
repo_name="${GITHUB_REPOSITORY#*/}"
docker_namespace="$(echo "${{ github.repository_owner }}" | tr '[:upper:]' '[:lower:]')"
docker_image="${docker_namespace}/${repo_name}"
if [ "${{ needs.inputs.outputs.draft }}" = "false" ];
then
docker_tags="${docker_image}:latest,${docker_image}:${MEDLEY_RELEASE#*-}_${MAIKO_RELEASE#*-}"
platforms="linux/amd64,linux/arm64"
else
docker_tags="${docker_image}:draft"
platforms="linux/amd64"
fi
echo "REPO_NAME=${repo_name}" >> ${GITHUB_ENV}
echo "DOCKER_NAMESPACE=${docker_namespace}" >> ${GITHUB_ENV}
echo "DOCKER_IMAGE=${docker_image}" >> ${GITHUB_ENV}
echo "DOCKER_TAGS=${docker_tags}" >> ${GITHUB_ENV}
echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> ${GITHUB_ENV}
echo "PLATFORMS=${platforms}" >> ${GITHUB_ENV}
#linux/amd64,linux/arm64,linux/arm/v7
# Setup the Docker Machine Emulation environment.
- name: Set up QEMU
uses: docker/setup-qemu-action@master
with:
platforms: linux/amd64,linux/arm64,linux/arm/v7
# Setup the Docker Buildx funtion
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@master
# Login into DockerHub - required to store the created image
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Do the Docker Build using the Dockerfile in the repository
# checked out and the release tars just downloaded.
# Push the result to Docker Hub
- name: Build Docker Image for Push to Docker Hub
uses: docker/build-push-action@v3
with:
builder: ${{ steps.buildx.outputs.name }}
build-args: |
BUILD_DATE=${{ env.BUILD_DATE }}
MEDLEY_RELEASE=${{ env.MEDLEY_RELEASE }}
MAIKO_RELEASE=${{ env.MAIKO_RELEASE }}
REPO_OWNER=${{ github.repository_owner }}
context: ./release_debs
file: ./.github/workflows/Dockerfile_medley
platforms: ${{ env.PLATFORMS }}
# Push the result to DockerHub
push: true
tags: ${{ env.DOCKER_TAGS }}
######################################################################################
# Use set-sentry-action to determine set the sentry that says this release has
# been successfully built
complete:
runs-on: ubuntu-latest
outputs:
build_successful: ${{ steps.output.outputs.build_successful }}
needs: [inputs, sentry, build_and-push]
steps:
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
- run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }}
# Set sentry
- name: Set flag that build for this commit has been completed
id: set
uses: ./../actions/set-sentry-action
with:
tag: "docker"
- name: Output
id: output
run: |
echo "build_successful='true'" >> ${GITHUB_OUTPUT}
######################################################################################

671
.github/workflows/buildLoadup.yml vendored Normal file
View File

@@ -0,0 +1,671 @@
#*******************************************************************************
# buidLoadup.yml
#
# Interlisp workflow to build Medley release and push it to github. This workflow
# is platform independent - but runs on Linux/amd64.
#
# This workflow contains a sentry that causes it to skip the build (as identified
# by its commit SHA) if its already been done. Setting the "force" input to true
# will bypass this sentry,
#
# 2022-01-17 Frank Halasz based on an earlier version of buildLoadup for Medley.
#
# Copyright 2022-2023 by Interlisp.org
#
# ******************************************************************************
name: Build/Push Medley Release
# Run this workflow on ...
on:
workflow_dispatch:
inputs:
draft:
description: "Mark this as a draft release"
type: choice
options:
- 'false'
- 'true'
force:
description: "Force build even if build already successfully completed for this commit"
type: choice
options:
- 'false'
- 'true'
workflow_call:
outputs:
successful:
description: "'True' if medley build completed successully"
value: ${{ jobs.complete.outputs.build_successful }}
inputs:
draft:
description: "Mark this as a draft release"
required: false
type: string
default: 'false'
force:
description: "Force build even if build already successfully completed for this commit"
required: false
type: string
default: 'false'
secrets:
OIO_SSH_KEY:
required: true
defaults:
run:
shell: bash
jobs:
# JOB: inputs #######################################################################
# Regularize the inputs so they can be referenced the same way whether they are
# the result of a workflow_dispatch or a workflow_call
inputs:
runs-on: ubuntu-latest
outputs:
draft: ${{ steps.one.outputs.draft }}
force: ${{ steps.one.outputs.force }}
steps:
- id: one
run: >
if [ '${{ toJSON(inputs) }}' = 'null' ];
then
echo "workflow_dispatch";
echo "draft=${{ github.event.inputs.draft }}" >> $GITHUB_OUTPUT;
echo "force=${{ github.event.inputs.force }}" >> $GITHUB_OUTPUT;
else
echo "workflow_call";
echo "draft=${{ inputs.draft }}" >> $GITHUB_OUTPUT;
echo "force=${{ inputs.force }}" >> $GITHUB_OUTPUT;
fi
# JOB: sentry #######################################################################
# Use sentry-action to determine if this release has already been built
# based on the latest commit to the repo
sentry:
needs: inputs
runs-on: ubuntu-latest
outputs:
release_not_built: ${{ steps.check.outputs.release_not_built }}
steps:
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
- run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }}
# Check if build already run for this commit
- name: Build already completed?
id: check
continue-on-error: true
uses: ./../actions/check-sentry-action
with:
tag: "loadup"
# JOB: loadup #######################################################################
#
# Do the loadup and push to release on github
#
loadup:
runs-on: ubuntu-latest
outputs:
combined_release_tag: ${{ steps.job_outputs.outputs.COMBINED_RELEASE_TAG }}
medley_release_tag: ${{ steps.job_outputs.outputs.MEDLEY_RELEASE_TAG }}
medley_short_release_tag: ${{ steps.job_outputs.outputs.MEDLEY_SHORT_RELEASE_TAG }}
debs_filename_base: ${{ steps.debs.outputs.DEBS_FILENAME_BASE }}
maiko_release_tag: ${{ steps.job_outputs.outputs.MAIKO_RELEASE_TAG }}
artifacts_filename_template: ${{ steps.job_outputs.outputs.ARTIFACTS_FILENAME_TEMPLATE }}
release_url: ${{ steps.push.outputs.html_url }}
needs: [inputs, sentry]
if: |
needs.sentry.outputs.release_not_built == 'true'
|| needs.inputs.outputs.force == 'true'
steps:
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
- run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }}
# Checkout latest commit
- name: Checkout Medley
uses: actions/checkout@v3
# Setup release tag
- name: Setup Release Tag
id: tag
uses: ./../actions/release-tag-action
# Get Maiko release information, retrieves the name of the latest (draft)
# release. Used to download the correct Maiko release
# Find latest release (draft or normal)
- name: Get maiko release information
id: maiko
run: |
tag=""
if [ "${{ needs.inputs.outputs.draft }}" = "true" ];
then
gh release list --repo ${{ github.repository_owner }}/maiko | grep Draft >/tmp/releases-$$
if [ $? -eq 0 ];
then
tag=$(head -n 1 /tmp/releases-$$ | awk '{ print $3 }')
fi
fi
if [ -z "${tag}" ];
then
tag=$(gh release list --repo ${{ github.repository_owner }}/maiko | grep Latest | head -n 1 | awk '{ print $3 }')
fi
echo "maiko_tag=${tag}" >> ${GITHUB_OUTPUT}
env:
GITHUB_TOKEN: ${{ secrets.MAIKO_TOKEN }}
# Setup environment variables & establish job outputs
- name: Setup Environment Variables
run: |
echo "build_time=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> ${GITHUB_OUTPUT}
echo "TARBALL_DIR=/tmp/tarballs" >>${GITHUB_ENV}
echo "MEDLEY_RELEASE_TAG=${RELEASE_TAG}" >>${GITHUB_ENV}
echo "MAIKO_RELEASE_TAG=${{ steps.maiko.outputs.maiko_tag }}" >>${GITHUB_ENV}
echo "ARTIFACTS_FILENAME_TEMPLATE=medley-full-@@PLATFORM@@-@@ARCH@@-@@MEDLEY.RELEASE@@_@@MAIKO.RELEASE@@" >>${GITHUB_ENV}
- name: More Environment Variables
run: |
echo "MEDLEY_SHORT_RELEASE_TAG=${MEDLEY_RELEASE_TAG#medley-}" >>${GITHUB_ENV}
echo "MAIKO_SHORT_RELEASE_TAG=${MAIKO_RELEASE_TAG#maiko-}" >>${GITHUB_ENV}
- name: Even More Environment Variables
run: |
echo "COMBINED_RELEASE_TAG=${MEDLEY_SHORT_RELEASE_TAG}_${MAIKO_SHORT_RELEASE_TAG}" >>${GITHUB_ENV}
- name: Establish job outputs
id: job_outputs
run: |
echo "COMBINED_RELEASE_TAG=${COMBINED_RELEASE_TAG}" >> ${GITHUB_OUTPUT}
echo "MEDLEY_RELEASE_TAG=${MEDLEY_RELEASE_TAG}" >> ${GITHUB_OUTPUT}
echo "MEDLEY_SHORT_RELEASE_TAG=${MEDLEY_SHORT_RELEASE_TAG}" >> ${GITHUB_OUTPUT}
echo "MAIKO_RELEASE_TAG=${MAIKO_RELEASE_TAG}" >> $GITHUB_OUTPUT;
echo "ARTIFACTS_FILENAME_TEMPLATE=${ARTIFACTS_FILENAME_TEMPLATE}" >> ${GITHUB_OUTPUT}
# Setup some needed dirs in workspace
- name: Create work dirs
run: mkdir -p ${TARBALL_DIR}
# Download Maiko Release Assets and untar it
- name: Download Release Assets
run: |
gh release download ${MAIKO_RELEASE_TAG} \
-D ${TARBALL_DIR} \
--repo ${{ github.repository_owner }}/maiko \
-p '*.tgz'
tar -xzf "${TARBALL_DIR}/${MAIKO_RELEASE_TAG}-linux.x86_64.tgz"
env:
GITHUB_TOKEN: ${{ secrets.MAIKO_TOKEN }}
# Checkout Notecards and tar it in the tarballsdir
- name: Checkout Notecards
uses: actions/checkout@v3
with:
repository: ${{ github.repository_owner }}/notecards
path: ./notecards
- name: Tar notecards into tarball dir
run: |
mv ./notecards ../notecards
cd ../notecards
git archive --format=tgz --output="${TARBALL_DIR}/notecards.tgz" --prefix=notecards/ main
# Install vnc
- name: Install vnc
run: sudo apt-get update && sudo apt-get install -y tightvncserver
- name: Build Loadup sysouts and databases
run: |
Xvnc -geometry 1280x720 :0 &
export DISPLAY=":0"
scripts/loadup-all.sh -apps
scripts/loadup-db.sh
- name: Build release tars
run: |
scripts/release-make-tars.sh "${MEDLEY_RELEASE_TAG}"
mv releases/"${MEDLEY_SHORT_RELEASE_TAG}"/*.tgz "${TARBALL_DIR}"
# Push the release up to github releases
- name: Delete existing release with same tag (if any)
uses: cb80/delrel@latest
with:
tag: ${{ env.MEDLEY_RELEASE_TAG }}
continue-on-error: true
- name: Push the release
id: push
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts:
# ${{ env.TARBALL_DIR }}/notecards.tgz,
${{ env.TARBALL_DIR }}/${{ env.MEDLEY_RELEASE_TAG }}-loadups.tgz,
${{ env.TARBALL_DIR }}/${{ env.MEDLEY_RELEASE_TAG }}-runtime.tgz
tag: ${{ env.MEDLEY_RELEASE_TAG }}
draft: ${{ needs.inputs.outputs.draft }}
prerelease: false
generateReleaseNotes: true
token: ${{ secrets.GITHUB_TOKEN }}
# Save the tarball directory for subsequent jobs
- name: Save tarballs
uses: actions/upload-artifact@v3
with:
name: tarballs
path: ${{ env.TARBALL_DIR }}
if-no-files-found: error
# JOB: linux_installer ##############################################################
#
# Create the linux installers (.deb and .tgz) and push to release on github
#
linux_installer:
runs-on: ubuntu-latest
needs: [inputs, sentry, loadup]
if: |
needs.sentry.outputs.release_not_built == 'true'
|| needs.inputs.outputs.force == 'true'
steps:
# Checkout latest commit
- name: Checkout Medley
uses: actions/checkout@v3
# Environment variables
- name: Environment variables
run: |
echo "DEBS_DIR=installers/deb/debs" >>${GITHUB_ENV}
echo "TARS_DIR=installers/deb/tars" >>${GITHUB_ENV}
echo "TARBALL_DIR=installers/deb/tmp/tarballs" >>${GITHUB_ENV}
echo "MEDLEY_RELEASE_TAG=${{ needs.loadup.outputs.medley_release_tag }}" \
>>${GITHUB_ENV}
echo "ARTIFACTS_FILENAME_TEMPLATE=${{ needs.loadup.outputs.artifacts_filename_template }}" >>${GITHUB_ENV}
# Create taball dir
- run: mkdir -p ${TARBALL_DIR}
# Get the tarballs
- name: Get tarballs
uses: actions/download-artifact@v3
with:
name: tarballs
path: ${{ env.TARBALL_DIR }}
# Build the deb files as well as the tgz files
- name: Build .deb files for 3 architectures
id: debs
run: |
cd installers/deb
./build_deb.sh
# Push the debs and tgz up to github releases
- name: Push the release
id: push_release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts:
${{ env.DEBS_DIR }}/*.deb,
${{ env.TARS_DIR }}/*.tgz
tag: ${{ env.MEDLEY_RELEASE_TAG }}
token: ${{ secrets.GITHUB_TOKEN }}
omitBodyDuringUpdate: true
omitDraftDuringUpdate: true
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true
- name: Rename medley tar for the x86_64 platform
run: |
cd ${{ env.TARS_DIR }}
mv medley-full-linux-x86_64-*.tgz medley.tgz
- name: Save medley tar for use in cygwin installers
uses: actions/upload-artifact@v3
with:
name: medley-tar
path: |
${{ env.TARS_DIR }}/medley.tgz
# JOB: macos_installer ##############################################################
#
# Create the macos installers (.dmg and .zip) and push to release on github
#
macos_installer:
runs-on: macos-12
needs: [inputs, sentry, loadup]
if: |
needs.sentry.outputs.release_not_built == 'true'
|| needs.inputs.outputs.force == 'true'
# if: false
defaults:
run:
shell: bash
steps:
# Checkout latest commit
- name: Checkout Medley
uses: actions/checkout@v3
# Environment variables
- name: Environment variables
run: |
MACOS_DIR=installers/macos
echo "MACOS_DIR=${MACOS_DIR}" >>${GITHUB_ENV}
echo "ARTIFACTS_DIR=${MACOS_DIR}/artifacts" >>${GITHUB_ENV}
echo "TARBALL_DIR=${MACOS_DIR}/tmp/tarballs" >>${GITHUB_ENV}
echo "MEDLEY_RELEASE_TAG=${{ needs.loadup.outputs.medley_release_tag }}" >>${GITHUB_ENV}
echo "ARTIFACTS_FILENAME_TEMPLATE=${{ needs.loadup.outputs.artifacts_filename_template }}" >>${GITHUB_ENV}
# Create tarball dir
- run: mkdir -p ${TARBALL_DIR}
# Get the tarballs
- name: Get tarballs
uses: actions/download-artifact@v3
with:
name: tarballs
path: ${{ env.TARBALL_DIR }}
# Build the .dmg and .zip files
- name: Build .dmg & .zip files
id: dmg-zip
run: |
cd ${MACOS_DIR}
./build_artifacts.sh
# Push the .dmg and .zip up to github releases
- name: Push the release
id: push_release
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts:
# 2023-07-20 not yet building dmg -- ${{ env.ARTIFACTS_DIR }}/*.dmg,
${{ env.ARTIFACTS_DIR }}/*.zip
tag: ${{ env.MEDLEY_RELEASE_TAG }}
token: ${{ secrets.GITHUB_TOKEN }}
omitBodyDuringUpdate: true
omitDraftDuringUpdate: true
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true
# JOB: cygwin_installer #############################################################
#
# Create the Windows installer, push it up to the release on github and
# update the downloads page on OIO
#
cygwin_installer:
runs-on: windows-2022
needs: [inputs, sentry, loadup, linux_installer]
if: |
needs.sentry.outputs.release_not_built == 'true'
|| needs.inputs.outputs.force == 'true'
outputs:
cygwin_installer: ${{ steps.compile_iss.outputs.CYGWIN_INSTALLER }}
steps:
# Checkout latest commit
- name: Checkout Medley
uses: actions/checkout@v3
# Store the values output from loadup job as environment variables
- name: Environment Variables
shell: powershell
run: |
$crt="${{ needs.loadup.outputs.combined_release_tag }}"
echo "COMBINED_RELEASE_TAG=$crt" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
$mrt="${{ needs.loadup.outputs.medley_release_tag }}"
echo "MEDLEY_RELEASE_TAG=$mrt" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
$msrt="${{ needs.loadup.outputs.medley_short_release_tag }}"
echo "MEDLEY_SHORT_RELEASE_TAG=$msrt" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
$aft="${{ needs.loadup.outputs.artifacts_filename_template }}"
echo "ARTIFACTS_FILENAME_TEMPLATE=$aft" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
$debs="${{ needs.loadup.outputs.debs_filename_base }}"
echo "DEBS_FILENAME_BASE=$debs" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
# Retrieve medley tars from artifact store
- name: Retrieve medley tar
uses: actions/download-artifact@v3
with:
name: medley-tar
path: installers/cygwin/
# Download maiko cygwin build
- name: Retrieve maiko cygwin build
shell: powershell
env:
GH_TOKEN: ${{ secrets.MAIKO_TOKEN }}
run: |
gh release download ${{ needs.loadup.outputs.maiko_release_tag }} --repo interlisp/maiko --pattern ${{ needs.loadup.outputs.maiko_release_tag }}-cygwin.x86_64.tgz --output installers\cygwin\maiko-cygwin.x86_64.tgz
# Download cygwin installer to be included by medley.iss
- name: Download cygwin installer
id: cygwin
shell: powershell
run: |
wget https://cygwin.com/setup-x86_64.exe -OutFile installers\cygwin\setup-x86_64.exe
# Download vnc viewer
#- name: Download vncviewer
# shell: powershell
# run: |
# $url = "https://sourceforge.net/projects/tigervnc/files/stable/1.12.0/vncviewer64-1.12.0.exe"
# $output = "installers\win\vncviewer64-1.12.0.exe"
# (New-Object System.Net.WebClient).DownloadFile($url, $output)
# Run iscc.exe to compile the installer
#- name: Compile medley.iss
# shell: powershell
# run: |
# iscc installers\win\medley.iss
# $filename="medley-install_${env:COMBINED_RELEASE_TAG}_x64.exe"
# echo "INSTALLER_FILENAME=$filename" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
# Run iscc.exe to compile the installer
- name: Compile cygwin_medley.iss
id: compile_iss
shell: powershell
run: |
$Env:CYGWIN_INSTALLER_BASE="medley-full-cygwin-x86_64-${env:COMBINED_RELEASE_TAG}"
$CYGWIN_INSTALLER="${Env:CYGWIN_INSTALLER_BASE}.exe"
echo "CYGWIN_INSTALLER=$CYGWIN_INSTALLER" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
echo "CYGWIN_INSTALLER=$CYGWIN_INSTALLER" | Out-File -FilePath $Env:GITHUB_OUTPUT -Encoding utf8 -Append
iscc installers\cygwin\medley.iss
# Upload windows installer to release
- name: Upload windows installer to release
id: push
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: installers/cygwin/${{ env.CYGWIN_INSTALLER }}
tag: ${{ env.MEDLEY_RELEASE_TAG }}
token: ${{ secrets.GITHUB_TOKEN }}
omitBodyDuringUpdate: true
omitDraftDuringUpdate: true
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true
# JOB: downloads_page ################################################################
#
# Update the downloads page on OIO
#
downloads_page:
runs-on: ubuntu-latest
needs: [inputs, sentry, loadup, linux_installer, macos_installer, cygwin_installer]
if: |
needs.sentry.outputs.release_not_built == 'true'
|| needs.inputs.outputs.force == 'true'
steps:
# Environment variables
- name: Environment Varibales (from other jobs)
run: |
crt="${{ needs.loadup.outputs.combined_release_tag }}"
echo "COMBINED_RELEASE_TAG=${crt}" >>${GITHUB_ENV}
mrt="${{ needs.loadup.outputs.medley_release_tag }}"
echo "MEDLEY_RELEASE_TAG=${mrt}" >>${GITHUB_ENV}
msrt="${{ needs.loadup.outputs.medley_short_release_tag }}"
echo "MEDLEY_SHORT_RELEASE_TAG=${msrt}" >>${GITHUB_ENV}
cyginst="${{ needs.cygwin_installer.outputs.cygwin_installer }}"
echo "CYGWIN_INSTALLER=${cyginst}" >>${GITHUB_ENV}
# Checkout latest commit
- name: Checkout Medley
uses: actions/checkout@v3
# Upload a dummy file to release
# Needed since download url of the release changes on every update
# So this will be the final update before creating downloads page
# and we can use its url for the page
- run: echo "placeholder" >placeholder.txt
- name: Upload windows placeholder.txt to release
id: pushph
uses: ncipollo/release-action@v1
with:
allowUpdates: true
artifacts: placeholder.txt
tag: ${{ env.MEDLEY_RELEASE_TAG }}
token: ${{ secrets.GITHUB_TOKEN }}
omitBodyDuringUpdate: true
omitDraftDuringUpdate: true
omitNameDuringUpdate: true
omitPrereleaseDuringUpdate: true
# Update the downloads page and the man page on OIO
- name: Update the downloads page and the man page to the OIO static page host
shell: bash
run: |
# Figure out filenames
download_url="${{ steps.pushph.outputs.html_url }}"
download_url="${download_url/\/tag\//\/download\/}"
local_template="installers/downloads_page/medley_downloads.html"
local_filename="medley_downloads.html"
local_manpath="docs/man-page/man_medley.html"
if [ "${{ needs.inputs.outputs.draft }}" = "true" ];
then
remote_filename="draft_downloads"
remote_manname="man_draft.html"
else
remote_filename="${local_filename%.html}"
remote_manname="man_medley.html"
fi
remote_filepath="/srv/oio/static/${remote_filename}"
remote_manpath="/srv/oio/static/${remote_manname}"
# Fill in downloads page template
sed \
-e "s/@@@MEDLEY.SHORT.RELEASE.TAG@@@/${MEDLEY_SHORT_RELEASE_TAG}/g" \
-e "s/@@@COMBINED.RELEASE.TAG@@@/${COMBINED_RELEASE_TAG}/g" \
-e "s~@@@DOWNLOAD_URL@@@~${download_url}~g" \
-e "s~@@@CYGWIN.INSTALLER@@@~${CYGWIN_INSTALLER}~g" \
< "${local_template}" > "${local_filename}"
# Create sftp instruction file
echo "-rm ${remote_filepath}.oldold" > batch
echo "-rename ${remote_filepath}.old ${remote_filepath}.oldold" >> batch
echo "-rename ${remote_filepath}.html ${remote_filepath}.old" >> batch
echo "-put ${local_filename} ${remote_filepath}.html" >> batch
echo "-put ${local_manpath} ${remote_manpath}" >> batch
# Do the sftp
eval $(ssh-agent)
ssh-add - <<< "${SSH_KEY}"
sftp -o StrictHostKeyChecking=no -b batch ubuntu@online.interlisp.org
env:
SSH_KEY: ${{ secrets.OIO_SSH_KEY }}
# Remove placeholder.txt
- name: Remove placeholder.txt
run: |
gh release delete-asset ${{ env.MEDLEY_RELEASE_TAG }} placeholder.txt --yes
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# JOB: complete #####################################################################
# Use set-sentry-action to determine set the sentry that says this release has
# been successfully built
complete:
runs-on: ubuntu-latest
outputs:
build_successful: ${{ steps.output.outputs.build_successful }}
needs: [inputs, sentry, loadup, downloads_page]
steps:
# Delete the tarballs artifact
- name: Delete tarballs artifact
uses: geekyeggo/delete-artifact@v2
with:
name: tarballs
failOnError: false
# Checkout the actions for this repo owner
- name: Checkout Actions
uses: actions/checkout@v3
with:
repository: ${{ github.repository_owner }}/.github
path: ./Actions_${{ github.sha }}
- run: mv ./Actions_${{ github.sha }}/actions ../actions && rm -rf ./Actions_${{ github.sha }}
# Set sentry
- name: Set flag that build for this commit has been completed
id: set
uses: ./../actions/set-sentry-action
with:
tag: "loadup"
- name: Output
id: output
run: |
echo "build_successful='true'" >> $GITHUB_OUTPUT
######################################################################################
######################################################################################

View File

@@ -0,0 +1,113 @@
#*******************************************************************************
# buidReleaseInclDocker.yml
#
# Interlisp webflow to build a Medley release and push it to github.
# And to build a multiplatform Docker image for the release and push it to Docker Hub.
#
# This workflow just calls two reuseable workflows to the two task:
# buildLoadup.yml and buildDocker.yml
#
# 2022-01-18 Frank Halasz
#
# Copyright 2022 by Interlisp.org
#
# ******************************************************************************
name: "Build/Push Release & Docker"
# Run this workflow on ...
on:
schedule:
- cron: '0 9 * * 1'
workflow_dispatch:
inputs:
draft:
description: "Mark this as a draft release"
type: choice
options:
- 'false'
- 'true'
force:
description: "Force build even if build already successfully completed for this commit"
type: choice
options:
- 'false'
- 'true'
workflow_call:
outputs:
successful:
description: "'True' if medley build completed successully"
value: ${{ jobs.complete.outputs.build_successful }}
inputs:
draft:
description: "Mark this as a draft release"
required: false
type: string
default: 'false'
force:
description: "Force build even if build already successfully completed for this commit"
required: false
type: string
default: 'false'
defaults:
run:
shell: bash
# Jobs that compose this workflow
jobs:
######################################################################################
# Regularize the inputs so they can be referenced the same way whether they are
# the result of a workflow_dispatch or a workflow_call
inputs:
runs-on: ubuntu-latest
outputs:
draft: ${{ steps.one.outputs.draft }}
force: ${{ steps.one.outputs.force }}
steps:
- id: one
run: >
if [ '${{ toJSON(inputs) }}' != 'null' ];
then
echo "draft=${{ inputs.draft }}" >> $GITHUB_OUTPUT;
echo "force=${{ inputs.force }}" >> $GITHUB_OUTPUT;
else
echo "draft=false" >> $GITHUB_OUTPUT;
echo "force=false" >> $GITHUB_OUTPUT;
fi
######################################################################################
# Build Loadup
do_release:
needs: inputs
uses: ./.github/workflows/buildLoadup.yml
with:
draft: ${{ needs.inputs.outputs.draft }}
force: ${{ needs.inputs.outputs.force }}
secrets: inherit
######################################################################################
# Build Docker Image
do_docker:
needs: [inputs, do_release]
uses: ./.github/workflows/buildDocker.yml
with:
draft: ${{ needs.inputs.outputs.draft }}
force: ${{ needs.inputs.outputs.force }}
secrets: inherit
######################################################################################

50
.gitignore vendored Normal file
View File

@@ -0,0 +1,50 @@
# loadup interim steps
tmp/*
# releases directory
releases/*
# all loadup files
loadups/exports.all
library/RDSYS*
loadups/lisp.sysout
loadups/full.sysout
loadups/*.dribble
loadups/whereis.hash
loadups/apps.sysout
loadups/fuller.database
# manual cross-reference files
*.IMPTR
#compiled code -- leave in for now
# *.lcom
# *.LCOM
# *.dfasl
# *.DFASL
# older versions
*~
# emacs detritus
*\#
\.\#*
# core files
core
# Mac OS detritus
.DS_Store
*.PS
# nano detritus
*.swp
*.save

0
.gitmodules vendored Normal file
View File

34
BUILDING.md Normal file
View File

@@ -0,0 +1,34 @@
# How to build a medley release
Originally done only with shell scripts:
```
./scripts/loadup-all.sh
```
to make the loadups
```
./scripts/loadup-and-release.sh
```
to go on to make the tgz files and release them
# Using github actions
In the github medley repository (Interlisp/medley) go to the Actions tab.
It will list the available github actions, select: **Build Medley Release**.
In the middle of the screen there's a box labeled workflow runs.
There should be a row in it that states 'This workflow has a workflow_dispatch event trigger' with a drop down menu (it really looks more like a button) on the right side labeled 'Run workflow'. Select that and you'll get a form allowing you to select the branch (I've only used Master) and enter the release name. Enter a name or leave it empty and press the green 'Run workflow' button. The workflow should queue up and run.
# How to create a Docker image for the latest Medley release
In the github medley repository (Interlisp/medley) go to the Actions tab.
It will list the available github actions, select: **Build Medley Docker image**.
A table is presented which lists the previous runs of the workflow. If the workflow has never been run, it will be empty. A the top of the list is a row labeled, 'This workflow has a workflow_dispatch event trigger.' with a drop down menu labeled 'Run workflow'. Select it.
A box will be presented asking, 'Use workflow from' with a drop down menu of all available branches. The default branch is **master**. Leave it selected and push the green 'Run workflow' button.
The workflow will be queued to run and start running.
The workflow pulls the latest Maiko image from Docker Hub and the Release Assets from the latest Medley release, generally defined as medley-YYMMDD. The Medley Docker image adds in Tight VNC Server and retrieves the two tarballs associated with a release, one containing the sysouts and the other the other needed files source, fonts, etc. The contents are uncompressed and loaded into the Medley directory structure.

4533
CLTL2/ADISPLAY Normal file

File diff suppressed because it is too large Load Diff

BIN
CLTL2/ADISPLAY.LCOM Normal file

Binary file not shown.

269
CLTL2/ADVISE Normal file
View File

@@ -0,0 +1,269 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "SYSTEM")
(IL:FILECREATED " 6-Jan-92 15:12:26" IL:|{DSK}<usr>local>lde>lispcore>sources>ADVISE.;2| 31117
IL:|changes| IL:|to:| (IL:FUNCTIONS XCL:ADVISE-FUNCTION XCL:UNADVISE-FUNCTION XCL:READVISE-FUNCTION FINISH-ADVISING)
IL:|previous| IL:|date:| "16-May-90 11:55:52" IL:|{DSK}<usr>local>lde>lispcore>sources>ADVISE.;1|
)
; Copyright (c) 1978, 1984, 1986, 1987, 1988, 1990, 1992 by Venue & Xerox Corporation. All rights reserved.
; The following program was created in 1978 but has not been published
; within the meaning of the copyright law, is furnished under license,
; and may not be used, copied and/or disclosed except in accordance
; with the terms of said license.
(IL:PRETTYCOMPRINT IL:ADVISECOMS)
(IL:RPAQQ IL:ADVISECOMS ((IL:STRUCTURES ADVICE) (IL:VARIABLES IL:ADVISEDFNS *UNADVISED-FNS*) (IL:* IL:|;;| "") (IL:* IL:|;;| "Interlisp entry points.") (IL:FNS IL:ADVISE IL:UNADVISE IL:READVISE) (IL:PROP IL:ARGNAMES IL:ADVISE) (IL:* IL:|;;| "") (IL:* IL:|;;| "XCL entry points.") (IL:FUNCTIONS XCL:ADVISE-FUNCTION XCL:UNADVISE-FUNCTION XCL:READVISE-FUNCTION) (IL:FUNCTIONS UNADVISE-FROM-RESTORE-CALLS FINISH-ADVISING FINISH-UNADVISING) (IL:* IL:|;;| "") (IL:* IL:|;;| "The advice database.") (IL:VARIABLES *ADVICE-HASH-TABLE*) (IL:FUNCTIONS ADD-ADVICE DELETE-ADVICE GET-ADVICE-MIDDLE-MAN SET-ADVICE-MIDDLE-MAN INSERT-ADVICE-FORM) (IL:SETFS GET-ADVICE-MIDDLE-MAN) (IL:* IL:|;;| "") (IL:* IL:|;;| "Hacking the actual advice forms.") (IL:FUNCTIONS CREATE-ADVISED-DEFINITION MAKE-AROUND-BODY) (IL:* IL:|;;| "") (IL:* IL:|;;| "Dealing with the File Manager") (IL:FILEPKGCOMS IL:ADVICE IL:ADVISE) (IL:FUNCTIONS XCL:REINSTALL-ADVICE) (IL:FUNCTIONS ADVICE-GETDEF ADVICE-PUTDEF ADVICE-DELDEF ADVICE-HASDEF ADVICE-NEWCOM ADVICE-FILE-DEFINITIONS ADVISE-CONTENTS ADVICE-ADDTOCOM) (IL:PROP IL:PROPTYPE IL:ADVISED) (IL:* IL:|;;| "") (IL:* IL:|;;| "Dealing with old-style advice") (IL:FUNCTIONS IL:READVISE1 ADD-OLD-STYLE-ADVICE CANONICALIZE-ADVICE-SYMBOL CANONICALIZE-ADVICE-WHEN-SPEC CANONICALIZE-ADVICE-WHERE-SPEC) (IL:DEFINE-TYPES XCL:ADVISED-FUNCTIONS) (IL:FUNCTIONS XCL:DEFADVICE) (IL:* IL:|;;| "Arrange for the proper package. Because of the DEFSTRUCT above, we must have the file dumped in the SYSTEM package.") (IL:PROP (IL:MAKEFILE-ENVIRONMENT IL:FILETYPE) IL:ADVISE) (IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS (IL:ADDVARS (IL:NLAMA IL:READVISE IL:UNADVISE) (IL:NLAML) (IL:LAMA IL:ADVISE)))))
(DEFSTRUCT (ADVICE (:TYPE LIST)) BEFORE AFTER AROUND)
(DEFVAR IL:ADVISEDFNS NIL)
(DEFVAR *UNADVISED-FNS* NIL)
(IL:* IL:|;;| "")
(IL:* IL:|;;| "Interlisp entry points.")
(IL:DEFINEQ
(il:advise
(il:lambda il:args (il:* il:\; "Edited 6-Apr-87 18:00 by Pavel")
(il:* il:|;;;| "ADVISE the FN given. ADVISE1 is for advice of the type (foo IN bar)")
(let (il:fn il:when il:where il:what)
(il:* il:|;;| "First we straighten out the arguments given to us")
(il:setq il:fn (il:arg il:args 1))
(case il:args (2 (il:setq il:what (il:arg il:args 2)))
(3 (il:setq il:when (il:arg il:args 2))
(il:setq il:what (il:arg il:args 3)))
(4 (il:setq il:when (il:arg il:args 2))
(il:setq il:where (il:arg il:args 3))
(il:setq il:what (il:arg il:args 4)))
(t (il:if (< il:args 2)
il:then (error 'il:too-few-arguments :callee 'il:advise :actual il:args
:minimum 2)
il:else (error 'il:too-many-arguments :callee 'il:advise :actual il:args :maximum
4))))
(il:setq il:when (canonicalize-advice-when-spec il:when))
(il:setq il:where (canonicalize-advice-where-spec il:where))
(il:if (il:nlistp il:fn)
il:then (xcl:advise-function il:fn il:what :when il:when :priority il:where)
il:elseif (il:string.equal (cadr il:fn)
"IN")
il:then (xcl:advise-function (first il:fn)
il:what :in (third il:fn)
:when il:when :priority il:where)
il:else (il:for il:x il:in il:fn
il:join (il:if (il:nlistp il:x)
il:then (xcl:advise-function il:x il:what :when il:when :priority
il:where)
il:else (xcl:advise-function (first il:x)
il:what :in (third il:x)
:when il:when :priority il:where)))))))
(il:unadvise
(il:nlambda il:fns (il:* il:\; "Edited 6-Apr-87 16:21 by Pavel")
(il:setq il:fns (il:nlambda.args il:fns))
(flet ((il:unadvise-entry (il:entry)
(il:if (il:listp il:entry)
il:then (xcl::unadvise-function (first il:entry)
:in
(third il:entry))
il:else (xcl::unadvise-function il:entry))))
(cond
((null il:fns)
(il:for il:entry il:in (il:reverse il:advisedfns) il:join (il:unadvise-entry il:entry))
)
((il:equal il:fns '(t))
(and (not (null il:advisedfns))
(il:unadvise-entry (car il:advisedfns))))
(t (il:for il:entry il:in il:fns il:join (il:unadvise-entry il:entry)))))))
(il:readvise
(il:nlambda il:fns (il:* il:\; "Edited 6-Apr-87 16:52 by Pavel")
(il:setq il:fns (il:nlambda.args il:fns))
(flet ((il:readvise-entry (il:entry)
(il:if (il:listp il:entry)
il:then (xcl::readvise-function (first il:entry)
:in
(third il:entry))
il:else (xcl::readvise-function il:entry))))
(cond
((null il:fns) (il:* il:\;
 "readvise them all, in reverse order.")
(il:for il:entry il:in (il:reverse *unadvised-fns*) il:join (il:readvise-entry il:entry
)))
((il:equal il:fns '(t)) (il:* il:\;
 "simple case, readvise just the last one that was unadvised.")
(and (not (null *unadvised-fns*))
(il:readvise-entry (car *unadvised-fns*))))
(t (il:* il:\; "they gave us some functions, so readvise THEM. We can't use READVISE-ENTRY here, because we may have to deal with old-style advice.")
(il:for il:entry il:in il:fns il:join (il:readvise1 il:entry)))))))
)
(IL:PUTPROPS IL:ADVISE IL:ARGNAMES (IL:WHO IL:WHEN IL:WHERE IL:WHAT))
(IL:* IL:|;;| "")
(IL:* IL:|;;| "XCL entry points.")
(DEFUN XCL:ADVISE-FUNCTION (XCL::FN-TO-ADVISE XCL::FORM &KEY ((:IN XCL::IN-FN)) (WHEN :BEFORE) (XCL::PRIORITY :LAST)) (MULTIPLE-VALUE-BIND (XCL::EXECUTABLE-TO-ADVISE XCL::NO-IN-FN) (XCL::NAME-OF-EXECUTABLE XCL::FN-TO-ADVISE) (COND ((AND (CONSP XCL::FN-TO-ADVISE) (NOT XCL::EXECUTABLE-TO-ADVISE)) (IL:FOR XCL::FN IL:IN XCL::FN-TO-ADVISE IL:JOIN (XCL:ADVISE-FUNCTION XCL::FN XCL::FORM :IN XCL::IN-FN :WHEN WHEN :PRIORITY XCL::PRIORITY))) ((AND (CONSP XCL::IN-FN) (NOT (XCL::NAME-OF-EXECUTABLE XCL::IN-FN))) (IL:FOR XCL::FN IL:IN XCL::IN-FN IL:JOIN (XCL:ADVISE-FUNCTION XCL::FN-TO-ADVISE XCL::FORM :IN XCL::FN :WHEN WHEN :PRIORITY XCL::PRIORITY))) (T (LET (XCL::EXECUTABLE-TO-ADVISE-IN) (COND ((NULL XCL::FORM) (FORMAT *ERROR-OUTPUT* "No advice given, so nothing done.") NIL) ((IL:UNSAFE.TO.MODIFY XCL::FN-TO-ADVISE "advise") (FORMAT *ERROR-OUTPUT* "~S not advised.~%" XCL::FN-TO-ADVISE) NIL) (T (COND (XCL::IN-FN (SETQ XCL::EXECUTABLE-TO-ADVISE-IN (XCL::NAME-OF-EXECUTABLE XCL::IN-FN)) (IF (NOT (HAS-CALLS XCL::EXECUTABLE-TO-ADVISE-IN XCL::EXECUTABLE-TO-ADVISE)) (ERROR "~S is not called from ~S." XCL::FN-TO-ADVISE XCL::IN-FN))) (T (IF (NULL (IL:GETD XCL::EXECUTABLE-TO-ADVISE)) (ERROR (QUOTE XCL:UNDEFINED-FUNCTION) :NAME XCL::FN-TO-ADVISE)))) (XCL:UNBREAK-FUNCTION XCL::FN-TO-ADVISE :IN XCL::IN-FN :NO-ERROR T) (COND ((NULL XCL::IN-FN) (IL:* IL:|;;| "Adjust the database of advice for this function.") (WHEN (NOT (MEMBER XCL::FN-TO-ADVISE IL:ADVISEDFNS :TEST (QUOTE EQ))) (IL:* IL:\; "If FN-TO-ADVISE is not currently advised, the new advice replaces any that may have been given before.") (DELETE-ADVICE XCL::FN-TO-ADVISE)) (ADD-ADVICE XCL::FN-TO-ADVISE WHEN XCL::PRIORITY XCL::FORM) (IL:* IL:|;;| "Finish off the process. This part is shared with READVISE-FUNCTION.") (FINISH-ADVISING XCL::FN-TO-ADVISE XCL::EXECUTABLE-TO-ADVISE)) (T (LET* ((XCL::ADVICE-NAME (IL:BQUOTE ((IL:\\\, XCL::FN-TO-ADVISE) :IN (IL:\\\, XCL::IN-FN)))) (XCL::ALREADY-ADVISED? (MEMBER XCL::ADVICE-NAME IL:ADVISEDFNS :TEST (QUOTE EQUAL)))) (IL:* IL:|;;| "Adjust the database of advice for this request.") (WHEN (NOT XCL::ALREADY-ADVISED?) (IL:* IL:\; "If not currently advised, the new advice replaces any that may have been given before.") (DELETE-ADVICE XCL::ADVICE-NAME)) (ADD-ADVICE XCL::ADVICE-NAME WHEN XCL::PRIORITY XCL::FORM) (IL:* IL:|;;| "Finish off the process. This part is shared with READVISE-FUNCTION.") (FINISH-ADVISING XCL::FN-TO-ADVISE XCL::EXECUTABLE-TO-ADVISE XCL::IN-FN XCL::EXECUTABLE-TO-ADVISE-IN)))))))))))
(DEFUN XCL:UNADVISE-FUNCTION (XCL::FN-TO-UNADVISE &KEY ((:IN XCL::IN-FN)) XCL::NO-ERROR) (MULTIPLE-VALUE-BIND (XCL::EXECUTABLE-TO-UNADVISE XCL::NO-IN-FN) (XCL::NAME-OF-EXECUTABLE XCL::FN-TO-UNADVISE) (COND ((AND (CONSP XCL::FN-TO-UNADVISE) (NOT XCL::EXECUTABLE-TO-UNADVISE)) (IL:FOR XCL::FN IL:IN XCL::FN-TO-UNADVISE IL:JOIN (XCL:UNADVISE-FUNCTION XCL::FN :IN XCL::IN-FN))) ((AND (CONSP XCL::IN-FN) (NOT (XCL::NAME-OF-EXECUTABLE XCL::IN-FN))) (IL:FOR XCL::FN IL:IN XCL::IN-FN IL:JOIN (XCL:UNADVISE-FUNCTION XCL::FN-TO-UNADVISE :IN XCL::FN))) (T (XCL:UNBREAK-FUNCTION XCL::FN-TO-UNADVISE :IN XCL::IN-FN :NO-ERROR T) (IF (NULL XCL::IN-FN) (LET ((XCL::ORIGINAL (GET XCL::EXECUTABLE-TO-UNADVISE (QUOTE IL:ADVISED)))) (COND ((NULL XCL::ORIGINAL) (UNLESS XCL::NO-ERROR (FORMAT *ERROR-OUTPUT* "~S is not advised.~%" XCL::FN-TO-UNADVISE)) NIL) (T (IL:PUTD XCL::EXECUTABLE-TO-UNADVISE (IL:GETD XCL::ORIGINAL) T) (REMPROP XCL::EXECUTABLE-TO-UNADVISE (QUOTE IL:ADVISED)) (PUSH XCL::FN-TO-UNADVISE *UNADVISED-FNS*) (SETQ IL:ADVISEDFNS (DELETE XCL::FN-TO-UNADVISE IL:ADVISEDFNS :TEST (QUOTE EQUAL))) (LIST XCL::FN-TO-UNADVISE)))) (IF XCL::NO-IN-FN (ERROR "~S can't be selectively unadvised :IN ~S" XCL::FN-TO-UNADVISE XCL::IN-FN) (LET* ((XCL::EXECUTABLE-TO-UNADVISE-IN (XCL::NAME-OF-EXECUTABLE XCL::IN-FN)) (XCL::ADVICE-NAME (IL:BQUOTE ((IL:\\\, XCL::FN-TO-UNADVISE) :IN (IL:\\\, XCL::IN-FN)))) (XCL::MIDDLE-MAN (GET-ADVICE-MIDDLE-MAN XCL::ADVICE-NAME))) (COND ((NULL XCL::MIDDLE-MAN) (UNLESS XCL::NO-ERROR (FORMAT *ERROR-OUTPUT* "~S is not advised.~%" XCL::ADVICE-NAME)) NIL) (T (CHANGE-CALLS XCL::MIDDLE-MAN XCL::EXECUTABLE-TO-UNADVISE XCL::EXECUTABLE-TO-UNADVISE-IN) (FINISH-UNADVISING XCL::ADVICE-NAME XCL::MIDDLE-MAN) (LIST XCL::ADVICE-NAME))))))))))
(DEFUN XCL:READVISE-FUNCTION (XCL::FN-TO-READVISE &KEY ((:IN XCL::IN-FN))) (MULTIPLE-VALUE-BIND (XCL::EXECUTABLE-TO-READVISE XCL::NO-IN-FN) (XCL::NAME-OF-EXECUTABLE XCL::FN-TO-READVISE) (COND ((AND (CONSP XCL::FN-TO-READVISE) (NOT XCL::EXECUTABLE-TO-READVISE)) (IL:FOR XCL::FN IL:IN XCL::FN-TO-READVISE IL:JOIN (XCL:READVISE-FUNCTION XCL::FN :IN XCL::IN-FN))) ((AND (CONSP XCL::IN-FN) (NOT (XCL::NAME-OF-EXECUTABLE XCL::IN-FN))) (IL:FOR XCL::FN IL:IN XCL::IN-FN IL:JOIN (XCL:READVISE-FUNCTION XCL::FN-TO-READVISE :IN XCL::FN))) (T (XCL:UNADVISE-FUNCTION XCL::FN-TO-READVISE :IN XCL::IN-FN :NO-ERROR T) (IF XCL::IN-FN (FINISH-ADVISING XCL::FN-TO-READVISE XCL::EXECUTABLE-TO-READVISE XCL::IN-FN (XCL::NAME-OF-EXECUTABLE XCL::IN-FN)) (FINISH-ADVISING XCL::FN-TO-READVISE XCL::EXECUTABLE-TO-READVISE))))))
(DEFUN UNADVISE-FROM-RESTORE-CALLS (FROM TO FN) (LET ((ENTRY (FIND-IF (FUNCTION (LAMBDA (ENTRY) (AND (CONSP ENTRY) (EQ (FIRST ENTRY) FROM) (EQ (THIRD ENTRY) FN)))) IL:ADVISEDFNS))) (ASSERT (NOT (NULL ENTRY)) NIL "BUG: Inconsistency in SI::UNADVISE-FROM-RESTORE-CALLS") (FINISH-UNADVISING ENTRY TO) (FORMAT *TERMINAL-IO* "~S unadvised.~%" ENTRY)))
(DEFUN FINISH-ADVISING (FN-TO-ADVISE EXECUTABLE-TO-ADVISE &OPTIONAL IN-FN EXECUTABLE-TO-ADVISE-IN) (COND ((NULL IN-FN) (LET* ((ALREADY-ADVISED? (MEMBER FN-TO-ADVISE IL:ADVISEDFNS :TEST (QUOTE EQ))) (ORIGINAL (IF ALREADY-ADVISED? (GET EXECUTABLE-TO-ADVISE-IN (QUOTE IL:ADVISED)) (LET ((*PRINT-CASE* :UPCASE)) (MAKE-SYMBOL (FORMAT NIL "Original ~A" EXECUTABLE-TO-ADVISE)))))) (IL:* IL:|;;| "Adjust the database of advice for this function.") (WHEN (NOT ALREADY-ADVISED?) (IL:PUTD ORIGINAL (IL:GETD EXECUTABLE-TO-ADVISE) T)) (IL:PUTD EXECUTABLE-TO-ADVISE (COMPILE NIL (CREATE-ADVISED-DEFINITION EXECUTABLE-TO-ADVISE ORIGINAL FN-TO-ADVISE))) (WHEN (NOT ALREADY-ADVISED?) (SETF (GET EXECUTABLE-TO-ADVISE (QUOTE IL:ADVISED)) ORIGINAL)) (IL:* IL:|;;| "These are outside the WHEN because COMPILE calls VIRGINFN, which may unadvise the function.") (SETQ *UNADVISED-FNS* (DELETE FN-TO-ADVISE *UNADVISED-FNS* :TEST (QUOTE EQUAL))) (SETQ IL:ADVISEDFNS (IL:* IL:\; "Move FN-TO-ADVISE to the front of IL:ADVISEDFNS if there already, else just add to front.") (CONS FN-TO-ADVISE (DELETE FN-TO-ADVISE IL:ADVISEDFNS :TEST (QUOTE EQUAL)))) (IL:MARKASCHANGED FN-TO-ADVISE (QUOTE IL:ADVICE)) (LIST FN-TO-ADVISE))) (T (LET* ((ADVICE-NAME (IL:BQUOTE ((IL:\\\, FN-TO-ADVISE) :IN (IL:\\\, IN-FN)))) (ALREADY-ADVISED? (MEMBER ADVICE-NAME IL:ADVISEDFNS :TEST (QUOTE EQUAL))) MIDDLE-MAN) (IL:* IL:|;;| "Create a middle-man for this request. If one has already been created, use it.") (SETQ MIDDLE-MAN (OR (GET-ADVICE-MIDDLE-MAN ADVICE-NAME) (SETF (GET-ADVICE-MIDDLE-MAN ADVICE-NAME) (CONSTRUCT-MIDDLE-MAN EXECUTABLE-TO-ADVISE EXECUTABLE-TO-ADVISE-IN)))) (IL:* IL:|;;| "Give the middle-man the new advised definition.") (IL:PUTD MIDDLE-MAN (COMPILE NIL (CREATE-ADVISED-DEFINITION EXECUTABLE-TO-ADVISE EXECUTABLE-TO-ADVISE ADVICE-NAME))) (WHEN (NOT ALREADY-ADVISED?) (IL:* IL:|;;| "Redirect any calls to FN-TO-ADVISE in IN-FN to call the middle-man.") (CHANGE-CALLS EXECUTABLE-TO-ADVISE MIDDLE-MAN EXECUTABLE-TO-ADVISE-IN (QUOTE UNADVISE-FROM-RESTORE-CALLS))) (IL:* IL:|;;| "Save a trail of information. These are outside the WHEN because COMPILE calls VIRGINFN, which may unadvise the function.") (SETQ *UNADVISED-FNS* (DELETE ADVICE-NAME *UNADVISED-FNS* :TEST (QUOTE EQUAL))) (SETQ IL:ADVISEDFNS (IL:* IL:\; "Move ADVICE-NAME to the front of IL:ADVISEDFNS if there already, else just add to front.") (CONS ADVICE-NAME (DELETE ADVICE-NAME IL:ADVISEDFNS :TEST (QUOTE EQUAL)))) (IL:MARKASCHANGED ADVICE-NAME (QUOTE IL:ADVICE)) (LIST ADVICE-NAME)))))
(DEFUN FINISH-UNADVISING (ADVICE-NAME MIDDLE-MAN) (SETQ IL:ADVISEDFNS (DELETE ADVICE-NAME IL:ADVISEDFNS :TEST (QUOTE EQUAL))) (PUSH ADVICE-NAME *UNADVISED-FNS*))
(IL:* IL:|;;| "")
(IL:* IL:|;;| "The advice database.")
(DEFVAR *ADVICE-HASH-TABLE* (MAKE-HASH-TABLE :TEST (QUOTE EQUAL)) (IL:* IL:|;;;| "Hash-table mapping either a function name or a list in the form (FOO :IN BAR) to a pair (advice . middle-man)."))
(DEFUN ADD-ADVICE (NAME WHEN PRIORITY FORM) (IL:* IL:|;;;| "Advice is stored on the hash table SI::*ADVICE-HASH-TABLE*. It is actually stored as a cons whose CAR is the advice and CDR is the middle-man name (for advice of the type (FOO :IN BAR)).") (LET* ((OLD-ADVICE (GETHASH NAME *ADVICE-HASH-TABLE*)) (ADVICE (IF (NULL OLD-ADVICE) (MAKE-ADVICE) (CAR OLD-ADVICE)))) (ECASE WHEN (:BEFORE (SETF (ADVICE-BEFORE ADVICE) (INSERT-ADVICE-FORM FORM PRIORITY (ADVICE-BEFORE ADVICE)))) (:AFTER (SETF (ADVICE-AFTER ADVICE) (INSERT-ADVICE-FORM FORM PRIORITY (ADVICE-AFTER ADVICE)))) (:AROUND (SETF (ADVICE-AROUND ADVICE) (INSERT-ADVICE-FORM FORM PRIORITY (ADVICE-AROUND ADVICE))))) (WHEN (NULL OLD-ADVICE) (SETF (GETHASH NAME *ADVICE-HASH-TABLE*) (CONS ADVICE NIL)))))
(DEFUN DELETE-ADVICE (NAME) (REMHASH NAME *ADVICE-HASH-TABLE*))
(DEFUN GET-ADVICE-MIDDLE-MAN (NAME) (CDR (GETHASH NAME *ADVICE-HASH-TABLE*)))
(DEFUN SET-ADVICE-MIDDLE-MAN (NAME MIDDLE-MAN) (SETF (CDR (GETHASH NAME *ADVICE-HASH-TABLE*)) MIDDLE-MAN))
(DEFUN INSERT-ADVICE-FORM (FORM PRIORITY ENTRY-LIST) (IL:* IL:|;;;| "Insert the new advice FORM into ENTRY-LIST using PRIORITY as a specification of where in that list to put it. If an equalish piece of advice already exists, remove it first.") (LET ((ENTRY (LIST PRIORITY FORM))) (SETF ENTRY-LIST (LABELS ((EQUALISH (X Y) (IL:* IL:|;;| "EQUALP, but don't ignore case in strings.") (TYPECASE X (SYMBOL (EQ X Y)) (CONS (AND (CONSP Y) (EQUALISH (CAR X) (CAR Y)) (EQUALISH (CDR X) (CDR Y)))) (NUMBER (AND (NUMBERP Y) (= X Y))) (CHARACTER (AND (CHARACTERP Y) (CHAR= X Y))) (STRING (AND (STRINGP Y) (STRING= X Y))) (PATHNAME (AND (PATHNAMEP Y) (IL:%PATHNAME-EQUAL X Y))) (VECTOR (AND (VECTORP Y) (LET ((SX (LENGTH X))) (AND (EQL SX (LENGTH Y)) (DOTIMES (I SX T) (IF (NOT (EQUALISH (AREF X I) (AREF Y I))) (RETURN NIL))))))) (ARRAY (AND (ARRAYP Y) (EQUAL (ARRAY-DIMENSIONS X) (ARRAY-DIMENSIONS Y)) (LET ((FX (IL:%FLATTEN-ARRAY X)) (FY (IL:%FLATTEN-ARRAY Y))) (DOTIMES (I (ARRAY-TOTAL-SIZE X) T) (IF (NOT (EQUALISH (AREF FX I) (AREF FY I))) (RETURN NIL)))))) (T (IL:* IL:|;;| "so that datatypes will be properly compared") (OR (EQ X Y) (LET ((TYPENAME (IL:TYPENAME X))) (AND (EQ TYPENAME (IL:TYPENAME Y)) (LET ((DESCRIPTORS (IL:GETDESCRIPTORS TYPENAME))) (IF DESCRIPTORS (IL:FOR FIELD IL:IN DESCRIPTORS IL:ALWAYS (EQUALISH (IL:FFETCHFIELD FIELD X) (IL:FFETCHFIELD FIELD Y)))))))))))) (DELETE-IF (FUNCTION (LAMBDA (OLD-ENTRY) (XCL:DESTRUCTURING-BIND (OLD-PRIORITY OLD-FORM) OLD-ENTRY (AND (EQUAL PRIORITY OLD-PRIORITY) (EQUALISH FORM OLD-FORM))))) ENTRY-LIST))) (COND ((NULL ENTRY-LIST) (LIST ENTRY)) ((EQ PRIORITY :FIRST) (CONS ENTRY ENTRY-LIST)) ((EQ PRIORITY :LAST) (NCONC ENTRY-LIST (LIST ENTRY))) (T (IL:* IL:\; "PRIORITY is a command to the old TTY Editor.") (UNLESS (AND (CONSP PRIORITY) (MEMBER (CAR PRIORITY) (QUOTE (IL:BEFORE IL:AFTER)))) (ERROR "Malformed priority argument to ADVISE: ~S" PRIORITY)) (XCL:CONDITION-CASE (IL:EDITE ENTRY-LIST (IL:BQUOTE ((IL:LC (IL:\\\,@ (CDR PRIORITY))) (IL:BELOW IL:^) ((IL:\\\, (CAR PRIORITY)) (IL:\\\, ENTRY))))) (ERROR (C) (ERROR "Error from EDITE during insertion of new advice:~% ~A~%" C))) ENTRY-LIST))))
(DEFSETF GET-ADVICE-MIDDLE-MAN SET-ADVICE-MIDDLE-MAN)
(IL:* IL:|;;| "")
(IL:* IL:|;;| "Hacking the actual advice forms.")
(DEFUN CREATE-ADVISED-DEFINITION (ADVISED-FN FN-TO-CALL ADVICE-NAME) (MULTIPLE-VALUE-BIND (LAMBDA-CAR ARG-LIST CALLING-FORM) (FUNCTION-WRAPPER-INFO ADVISED-FN FN-TO-CALL) (LET* ((ADVICE (CAR (GETHASH ADVICE-NAME *ADVICE-HASH-TABLE*))) (BEFORE-FORMS (MAPCAR (QUOTE SECOND) (ADVICE-BEFORE ADVICE))) (AFTER-FORMS (MAPCAR (QUOTE SECOND) (ADVICE-AFTER ADVICE))) (AROUND-FORMS (MAPCAR (QUOTE SECOND) (ADVICE-AROUND ADVICE))) (BODY-FORM (MAKE-AROUND-BODY CALLING-FORM AROUND-FORMS))) (IL:BQUOTE ((IL:\\\, LAMBDA-CAR) (IL:\\\, (IF (EQ LAMBDA-CAR (QUOTE LAMBDA)) (QUOTE (&REST XCL:ARGLIST)) ARG-LIST)) (IL:\\\,@ (AND ARG-LIST (MEMBER LAMBDA-CAR (QUOTE (IL:LAMBDA IL:NLAMBDA))) (IL:BQUOTE ((DECLARE (SPECIAL (IL:\\\,@ (IF (SYMBOLP ARG-LIST) (LIST ARG-LIST) ARG-LIST)))))))) (IL:\\CALLME (QUOTE (:ADVISED (IL:\\\, ADVICE-NAME)))) (BLOCK NIL (XCL:DESTRUCTURING-BIND (IL:!VALUE . IL:!OTHER-VALUES) (MULTIPLE-VALUE-LIST (PROGN (IL:\\\,@ BEFORE-FORMS) (IL:\\\, BODY-FORM))) (IL:\\\,@ AFTER-FORMS) (APPLY (QUOTE VALUES) IL:!VALUE IL:!OTHER-VALUES))))))))
(DEFUN MAKE-AROUND-BODY (CALLING-FORM AROUND-FORMS) (REDUCE (FUNCTION (LAMBDA (CURRENT-BODY NEXT-AROUND-FORM) (LET ((CANONICALIZED-AROUND-FORM (SUBST (QUOTE (XCL:INNER)) (QUOTE IL:*) NEXT-AROUND-FORM))) (IL:BQUOTE (MACROLET ((XCL:INNER NIL (QUOTE (IL:\\\, CURRENT-BODY)))) (IL:\\\, CANONICALIZED-AROUND-FORM)))))) AROUND-FORMS :INITIAL-VALUE CALLING-FORM))
(IL:* IL:|;;| "")
(IL:* IL:|;;| "Dealing with the File Manager")
(IL:PUTDEF (QUOTE IL:ADVICE) (QUOTE IL:FILEPKGCOMS) (QUOTE ((IL:COM IL:MACRO (IL:X (IL:P IL:* (ADVICE-FILE-DEFINITIONS (QUOTE IL:X) NIL))) IL:CONTENTS IL:NILL IL:ADD ADVICE-ADDTOCOM) (TYPE IL:DESCRIPTION "advice" IL:NEWCOM ADVICE-NEWCOM IL:GETDEF ADVICE-GETDEF IL:DELDEF ADVICE-DELDEF IL:PUTDEF ADVICE-PUTDEF IL:HASDEF ADVICE-HASDEF)))
)
(IL:PUTDEF (QUOTE IL:ADVISE) (QUOTE IL:FILEPKGCOMS) (QUOTE ((IL:COM IL:MACRO (IL:X (IL:P IL:* (ADVICE-FILE-DEFINITIONS (QUOTE IL:X) T))) IL:CONTENTS ADVISE-CONTENTS IL:ADD ADVICE-ADDTOCOM)))
)
(DEFUN XCL:REINSTALL-ADVICE (XCL::NAME &KEY XCL::BEFORE XCL::AFTER XCL::AROUND) (IL:FOR XCL::ADVICE IL:IN XCL::BEFORE IL:DO (XCL:DESTRUCTURING-BIND (XCL::PRIORITY XCL::FORM) XCL::ADVICE (ADD-ADVICE XCL::NAME :BEFORE XCL::PRIORITY XCL::FORM))) (IL:FOR XCL::ADVICE IL:IN XCL::AFTER IL:DO (XCL:DESTRUCTURING-BIND (XCL::PRIORITY XCL::FORM) XCL::ADVICE (ADD-ADVICE XCL::NAME :AFTER XCL::PRIORITY XCL::FORM))) (IL:FOR XCL::ADVICE IL:IN XCL::AROUND IL:DO (XCL:DESTRUCTURING-BIND (XCL::PRIORITY XCL::FORM) XCL::ADVICE (ADD-ADVICE XCL::NAME :AROUND XCL::PRIORITY XCL::FORM))))
(DEFUN ADVICE-GETDEF (NAME TYPE OPTIONS) (LET ((ADVICE (CAR (GETHASH NAME *ADVICE-HASH-TABLE*)))) (AND ADVICE (APPEND (IL:FOR ENTRY IL:IN (ADVICE-BEFORE ADVICE) IL:COLLECT (CONS (QUOTE :BEFORE) (COPY-TREE ENTRY))) (IL:FOR ENTRY IL:IN (ADVICE-AFTER ADVICE) IL:COLLECT (CONS (QUOTE :AFTER) (COPY-TREE ENTRY))) (IL:FOR ENTRY IL:IN (ADVICE-AROUND ADVICE) IL:COLLECT (CONS (QUOTE :AROUND) (COPY-TREE ENTRY)))))))
(DEFUN ADVICE-PUTDEF (NAME TYPE DEFINITION) (LET ((CANONICAL-DEFN (IL:FOR ENTRY IL:IN DEFINITION IL:COLLECT (LIST (CANONICALIZE-ADVICE-WHEN-SPEC (CAR ENTRY)) (CANONICALIZE-ADVICE-WHERE-SPEC (COPY-TREE (CADR ENTRY))) (COPY-TREE (CADDR ENTRY))))) (CURRENT-ADVICE (OR (CAR (GETHASH NAME *ADVICE-HASH-TABLE*)) (CAR (SETF (GETHASH NAME *ADVICE-HASH-TABLE*) (CONS (MAKE-ADVICE) NIL)))))) (SETF (ADVICE-BEFORE CURRENT-ADVICE) (MAPCAR (FUNCTION REST) (IL:FOR ENTRY IL:IN CANONICAL-DEFN IL:WHEN (EQ (CAR ENTRY) :BEFORE) IL:COLLECT ENTRY))) (SETF (ADVICE-AFTER CURRENT-ADVICE) (MAPCAR (FUNCTION REST) (IL:FOR ENTRY IL:IN CANONICAL-DEFN IL:WHEN (EQ (CAR ENTRY) :AFTER) IL:COLLECT ENTRY))) (SETF (ADVICE-AROUND CURRENT-ADVICE) (MAPCAR (FUNCTION REST) (IL:FOR ENTRY IL:IN CANONICAL-DEFN IL:WHEN (EQ (CAR ENTRY) :AROUND) IL:COLLECT ENTRY))) (IF (CONSP NAME) (XCL:READVISE-FUNCTION (FIRST NAME) :IN (THIRD NAME)) (XCL:READVISE-FUNCTION NAME))))
(DEFUN ADVICE-DELDEF (NAME TYPE) (DECLARE (IGNORE TYPE)) (WHEN (MEMBER NAME IL:ADVISEDFNS :TEST (QUOTE EQUAL)) (IF (CONSP NAME) (XCL:UNADVISE-FUNCTION (FIRST NAME) :IN (THIRD NAME)) (XCL:UNADVISE-FUNCTION NAME)) (FORMAT *TERMINAL-IO* "~S unadvised." NAME)) (REMHASH NAME *ADVICE-HASH-TABLE*))
(DEFUN ADVICE-HASDEF (NAME TYPE SOURCE) (AND (GETHASH NAME *ADVICE-HASH-TABLE*) (OR NAME T)))
(DEFUN ADVICE-NEWCOM (NAME TYPE LISTNAME FILE) (IL:* IL:|;;;| "If you make a new com for ADVICE, you should make an ADVISE command.") (IL:DEFAULTMAKENEWCOM NAME (QUOTE IL:ADVISE) LISTNAME FILE))
(DEFUN ADVICE-FILE-DEFINITIONS (NAMES READVISE?) (IL:* IL:|;;;| "READVISE? is true for the File Manager command ADVISE and false for the command ADVICE. For ADVISE, we want to emit a form to readvise the named functions after reinstalling the advice.") (LET ((REAL-NAMES NIL)) (IL:BQUOTE ((IL:\\\,@ (IL:FOR FN IL:IN NAMES IL:COLLECT (LET* ((NAME (IL:IF (CONSP FN) IL:THEN (ASSERT (AND (EQ (SECOND FN) :IN) (= 3 (LENGTH FN))) NIL "~S should be of the form (FOO :IN BAR)" FN) FN IL:ELSE (LET ((NAME (CANONICALIZE-ADVICE-SYMBOL FN)) (OLD-ADVICE (GET FN (QUOTE IL:READVICE)))) (WHEN OLD-ADVICE (ADD-OLD-STYLE-ADVICE NAME OLD-ADVICE) (REMPROP FN (QUOTE IL:READVICE))) NAME))) (ADVICE (CAR (GETHASH NAME *ADVICE-HASH-TABLE*)))) (ASSERT (NOT (NULL ADVICE)) NIL "Can't find advice for ~S" NAME) (PUSH NAME REAL-NAMES) (IL:BQUOTE (XCL:REINSTALL-ADVICE (QUOTE (IL:\\\, NAME)) (IL:\\\,@ (AND (ADVICE-BEFORE ADVICE) (IL:BQUOTE (:BEFORE (QUOTE (IL:\\\, (ADVICE-BEFORE ADVICE))))))) (IL:\\\,@ (AND (ADVICE-AFTER ADVICE) (IL:BQUOTE (:AFTER (QUOTE (IL:\\\, (ADVICE-AFTER ADVICE))))))) (IL:\\\,@ (AND (ADVICE-AROUND ADVICE) (IL:BQUOTE (:AROUND (QUOTE (IL:\\\, (ADVICE-AROUND ADVICE)))))))))))) (IL:\\\,@ (AND READVISE? (IL:BQUOTE ((IL:READVISE (IL:\\\,@ (REVERSE REAL-NAMES)))))))))))
(DEFUN ADVISE-CONTENTS (COM NAME TYPE) (AND (EQ TYPE (QUOTE IL:ADVICE)) (COND ((NULL NAME) (IL:* IL:\; "Return a list of the ADVICE's in the given COM.") (CDR COM)) ((EQ NAME (QUOTE T)) (IL:* IL:\; "Return T if there are ANY ADVICE's in the given COM.") (NOT (NULL (CDR COM)))) ((OR (SYMBOLP NAME) (= (LENGTH NAME) 3) (EQ (SECOND NAME) :IN)) (IL:* IL:\; "Return T iff an ADVICE named NAME in the given COM.") (AND (MEMBER NAME (CDR COM) :TEST (QUOTE EQUAL)) T)) (T (IL:* IL:\; "NAME is a list of names. Return the intersection of that list with the ADVICE's in the given COM.") (INTERSECTION NAME (CDR COM) :TEST (QUOTE EQUAL))))))
(DEFUN ADVICE-ADDTOCOM (COM NAME TYPE NEAR) (IL:* IL:|;;;| "This is the ADD method for both of the ADVICE and ADVISE commands.") (IL:* IL:|;;;| "Add the given name only if the type is ADVICE. Also, add it to ADVICE commands only if a NEAR was specified. We want to normally create only ADVISE commands. If the user really wants an ADVICE command, they'll have to create it themselves.") (AND (EQ TYPE (QUOTE IL:ADVICE)) (OR (EQ (CAR COM) (QUOTE IL:ADVISE)) (NOT (NULL NEAR))) (IL:ADDTOCOM1 COM NAME NEAR NIL)))
(IL:PUTPROPS IL:ADVISED IL:PROPTYPE IGNORE)
(IL:* IL:|;;| "")
(IL:* IL:|;;| "Dealing with old-style advice")
(DEFUN IL:READVISE1 (IL:FN) (FLET ((IL:READVISE-ENTRY (IL:ENTRY) (IL:IF (IL:LISTP IL:ENTRY) IL:THEN (XCL:READVISE-FUNCTION (FIRST IL:ENTRY) :IN (THIRD IL:ENTRY)) IL:ELSE (XCL:READVISE-FUNCTION IL:ENTRY)))) (IL:IF (IL:LISTP IL:FN) IL:THEN (ASSERT (IL:STRING.EQUAL (SECOND IL:FN) "IN") NIL "~S should be in the form (FOO IN BAR).~%" IL:FN) (IL:READVISE-ENTRY IL:FN) IL:ELSE (LET ((IL:NAME (CANONICALIZE-ADVICE-SYMBOL IL:FN)) (IL:OLD-ADVICE (GET IL:FN (QUOTE IL:READVICE)))) (IL:IF IL:OLD-ADVICE IL:THEN (ADD-OLD-STYLE-ADVICE IL:NAME IL:OLD-ADVICE) (REMPROP IL:FN (QUOTE IL:READVICE))) (IL:READVISE-ENTRY IL:NAME)))))
(DEFUN ADD-OLD-STYLE-ADVICE (NAME OLD-ADVICE) (IL:* IL:|;;;| "OLD-ADVICE should the value of the READVICE property of some symbol. Note that the CAR of that value is the old middle-man used for -IN- advice. Thus, we take the CDR below.") (WHEN (NOT (MEMBER NAME IL:ADVISEDFNS :TEST (QUOTE EQUAL))) (DELETE-ADVICE NAME)) (IL:FOR ADVICE IL:IN (CDR OLD-ADVICE) IL:DO (XCL:DESTRUCTURING-BIND (WHEN WHERE WHAT) ADVICE (IL:* IL:|;;| "Translate Interlisp names to the new standard.") (ADD-ADVICE NAME (CANONICALIZE-ADVICE-WHEN-SPEC WHEN) (CANONICALIZE-ADVICE-WHERE-SPEC WHERE) WHAT))))
(DEFUN CANONICALIZE-ADVICE-SYMBOL (SYMBOL) (LET ((IN-POS (IL:STRPOS "-IN-" SYMBOL))) (IF (NULL IN-POS) SYMBOL (LIST (IL:SUBATOM SYMBOL 1 (1- IN-POS)) :IN (IL:SUBATOM SYMBOL (+ IN-POS 4) NIL)))))
(DEFUN CANONICALIZE-ADVICE-WHEN-SPEC (SPEC) (IF (NULL SPEC) (QUOTE :BEFORE) (INTERN (STRING SPEC) "KEYWORD")))
(DEFUN CANONICALIZE-ADVICE-WHERE-SPEC (SPEC) (CASE SPEC ((NIL LAST IL:BOTTOM IL:END :LAST) (QUOTE :LAST)) ((IL:TOP IL:FIRST :FIRST) (QUOTE :FIRST)) (T (IF (CONSP SPEC) SPEC (ERROR "Illegal WHERE specification to ADVISE: ~S" SPEC)))))
(XCL:DEF-DEFINE-TYPE XCL:ADVISED-FUNCTIONS "Advised function definitions")
(XCL:DEFDEFINER (XCL:DEFADVICE (:PROTOTYPE (LAMBDA (XCL::NAME) (IL:BQUOTE (XCL:DEFADVICE (IL:\\\, XCL::NAME) "advice"))))) XCL:ADVISED-FUNCTIONS (XCL::NAME &BODY XCL::ADVICE-FORMS) (IL:BQUOTE (PROGN (IL:\\\,. (XCL:WITH-COLLECTION (DOLIST (XCL::ADVICE XCL::ADVICE-FORMS) (XCL:COLLECT (XCL:DESTRUCTURING-BIND (XCL::FN-TO-ADVISE XCL::FORM &KEY XCL::IN WHEN XCL::PRIORITY) XCL::ADVICE (IL:BQUOTE (XCL:ADVISE-FUNCTION (QUOTE (IL:\\\, XCL::FN-TO-ADVISE)) (QUOTE (IL:\\\, XCL::FORM)) (IL:\\\,@ (AND XCL::IN (IL:BQUOTE (:IN (QUOTE (IL:\\\, XCL::IN)))))) (IL:\\\,@ (AND WHEN (IL:BQUOTE (:WHEN (IL:\\\, WHEN))))) (IL:\\\,@ (AND XCL::PRIORITY (IL:BQUOTE (:PRIORITY (IL:\\\, XCL::PRIORITY)))))))))))))))
(IL:* IL:|;;|
"Arrange for the proper package. Because of the DEFSTRUCT above, we must have the file dumped in the SYSTEM package."
)
(IL:PUTPROPS IL:ADVISE IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "SYSTEM"))
(IL:PUTPROPS IL:ADVISE IL:FILETYPE :COMPILE-FILE)
(IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS
(IL:ADDTOVAR IL:NLAMA IL:READVISE IL:UNADVISE)
(IL:ADDTOVAR IL:NLAML)
(IL:ADDTOVAR IL:LAMA IL:ADVISE)
)
(IL:PRETTYCOMPRINT IL:ADVISECOMS)
(IL:RPAQQ IL:ADVISECOMS ((IL:STRUCTURES ADVICE) (IL:VARIABLES IL:ADVISEDFNS *UNADVISED-FNS*) (IL:* IL:|;;| "") (IL:* IL:|;;| "Interlisp entry points.") (IL:FNS IL:ADVISE IL:UNADVISE IL:READVISE) (IL:PROP IL:ARGNAMES IL:ADVISE) (IL:* IL:|;;| "") (IL:* IL:|;;| "XCL entry points.") (IL:FUNCTIONS XCL:ADVISE-FUNCTION XCL:UNADVISE-FUNCTION XCL:READVISE-FUNCTION) (IL:FUNCTIONS UNADVISE-FROM-RESTORE-CALLS FINISH-ADVISING FINISH-UNADVISING) (IL:* IL:|;;| "") (IL:* IL:|;;| "The advice database.") (IL:VARIABLES *ADVICE-HASH-TABLE*) (IL:FUNCTIONS ADD-ADVICE DELETE-ADVICE GET-ADVICE-MIDDLE-MAN SET-ADVICE-MIDDLE-MAN INSERT-ADVICE-FORM) (IL:SETFS GET-ADVICE-MIDDLE-MAN) (IL:* IL:|;;| "") (IL:* IL:|;;| "Hacking the actual advice forms.") (IL:FUNCTIONS CREATE-ADVISED-DEFINITION MAKE-AROUND-BODY) (IL:* IL:|;;| "") (IL:* IL:|;;| "Dealing with the File Manager") (IL:FILEPKGCOMS IL:ADVICE IL:ADVISE) (IL:FUNCTIONS XCL:REINSTALL-ADVICE) (IL:FUNCTIONS ADVICE-GETDEF ADVICE-PUTDEF ADVICE-DELDEF ADVICE-HASDEF ADVICE-NEWCOM ADVICE-FILE-DEFINITIONS ADVISE-CONTENTS ADVICE-ADDTOCOM) (IL:PROP IL:PROPTYPE IL:ADVISED) (IL:* IL:|;;| "") (IL:* IL:|;;| "Dealing with old-style advice") (IL:FUNCTIONS IL:READVISE1 ADD-OLD-STYLE-ADVICE CANONICALIZE-ADVICE-SYMBOL CANONICALIZE-ADVICE-WHEN-SPEC CANONICALIZE-ADVICE-WHERE-SPEC) (IL:DEFINE-TYPES XCL:ADVISED-FUNCTIONS) (IL:FUNCTIONS XCL:DEFADVICE) (IL:* IL:|;;| "Arrange for the proper package. Because of the DEFSTRUCT above, we must have the file dumped in the SYSTEM package.") (IL:PROP (IL:MAKEFILE-ENVIRONMENT IL:FILETYPE) IL:ADVISE) (IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS (IL:ADDVARS (IL:NLAMA) (IL:NLAML) (IL:LAMA IL:ADVISE)))))
(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:ADVISE)
)
(IL:PUTPROPS IL:ADVISE IL:COPYRIGHT ("Venue & Xerox Corporation" T 1978 1984 1986 1987 1988 1990 1992)
)
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL (2691 7263 (IL:ADVISE 2704 . 4833) (IL:UNADVISE 4835 . 5755) (IL:READVISE 5757 . 7261
)))))
IL:STOP

76
CLTL2/AERROR Normal file
View File

@@ -0,0 +1,76 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "13-Mar-92 14:41:54" {DSK}<usr>local>lde>lispcore>sources>AERROR.;2 7354
changes to%: (VARS AERRORCOMS)
previous date%: "16-May-90 11:58:35" {DSK}<usr>local>lde>lispcore>sources>AERROR.;1)
(* ; "
Copyright (c) 1982, 1983, 1986, 1987, 1988, 1989, 1990, 1992 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT AERRORCOMS)
(RPAQQ AERRORCOMS ((FNS ERRORSTRING SETERRORN LISPERROR \LISPERROR \ILLEGAL.ARG \ARG.NOT.LITATOM) (EXPORT (DECLARE%: EVAL@COMPILE (VARS \ERRORMESSAGELIST) DONTCOPY (OPTIMIZERS LISPERROR))) (VARIABLES *LAST-CONDITION*) (GLOBALVARS \ERRORMESSAGELIST) (FUNCTIONS ERRM-TO-CONDITION) (PROP FILETYPE AERROR) (LOCALVARS . T)))
(DEFINEQ
(ERRORSTRING
(LAMBDA (X) (* lmm "21-APR-80 15:46") (CAR (NTH \ERRORMESSAGELIST (ADD1 (OR (NUMBERP X) 17))))))
(SETERRORN
(LAMBDA (NUM MESS) (* amd "30-Jul-86 17:00") (CL:SETQ *LAST-CONDITION* (ERRM-TO-CONDITION NUM MESS))))
(LISPERROR
[LAMBDA (N X CONTINUEOKFLG) (* ; "Edited 1-Feb-89 09:38 by jds")
(* ;; "compiles open as call to \LISPERROR")
[COND
((STRINGP N)
(* ;; "Case where LISPERROR is called with one of the %"canonical error message%" strings from the old IL implementation. Need to translate it to a number. THIS CODE IS STOLEN IN SPIRIT FROM THE OPTIMIZER.")
(FOR MSG IN \ERRORMESSAGELIST AS I FROM 0 WHEN (CL:EQUAL MSG N)
DO (SETQ N I]
(\LISPERROR X N CONTINUEOKFLG])
(\LISPERROR
(LAMBDA (X N CONTINUEOKFLG) (* amd "11-Nov-86 12:09") (DECLARE (USEDFREE \INTERRUPTABLE)) (PROG NIL (SELECTQ N ((5 22) (* ; "File errors that can happen to files open for output") (* ;; "(\STOP.DRIBBLE? X)")) NIL) (OR \INTERRUPTABLE (\MP.ERROR \MP.UNINTERRUPTABLE "Error in uninterruptable system code -- ^N to continue into error handler" X)) RET (RETURN (PROG1 (COND ((SMALLP N) (ERRORX (LIST N X))) (T (ERROR N X))) (OR CONTINUEOKFLG (GO RET))))))
)
(\ILLEGAL.ARG
(LAMBDA (X) (* lmm "25-APR-80 18:02") (LISPERROR "ILLEGAL ARG" X)))
(\ARG.NOT.LITATOM
(LAMBDA (X) (* lmm "25-APR-80 18:02") (LISPERROR "ARG NOT LITATOM" X)))
)
(* "FOLLOWING DEFINITIONS EXPORTED")(DECLARE%: EVAL@COMPILE
(RPAQQ \ERRORMESSAGELIST ("SYSTEM ERROR" " " "STACK OVERFLOW" "ILLEGAL RETURN" "ARG NOT LIST" "HARD DISK ERROR" "ATTEMPT TO SET NIL OR T" "ATTEMPT TO RPLAC NIL" "UNDEFINED OR ILLEGAL GO" "FILE WON'T OPEN" "NON-NUMERIC ARG" "ATOM TOO LONG" "ATOM HASH TABLE FULL" "FILE NOT OPEN" "ARG NOT LITATOM" "! too many files open" "END OF FILE" "ERROR" "BREAK" "ILLEGAL STACK ARG" "FAULT IN EVAL" "ARRAYS FULL" "FILE SYSTEM RESOURCES EXCEEDED" "FILE NOT FOUND" "BAD SYSOUT FILE" "UNUSUAL CDR ARG LIST" "HASH TABLE FULL" "ILLEGAL ARG" "ARG NOT ARRAY" "ILLEGAL OR IMPOSSIBLE BLOCK" "STACK PTR HAS BEEN RELEASED" "STORAGE FULL" "ATTEMPT TO USE ITEM OF INCORRECT TYPE" "ILLEGAL DATA TYPE NUMBER" "DATA TYPES FULL" "ATTEMPT TO BIND NIL OR T" "! too many user interrupt characters" "! read-macro context error" "ILLEGAL READTABLE" "ILLEGAL TERMINAL TABLE" "! swapblock too big for buffer" "PROTECTION VIOLATION" "BAD FILE NAME" "USER BREAK" "UNBOUND ATOM" "UNDEFINED CAR OF FORM" "UNDEFINED FUNCTION" "CONTROL-E" "FLOATING UNDERFLOW" "FLOATING OVERFLOW" "OVERFLOW" "ARG NOT HARRAY" "TOO MANY ARGUMENTS"))
DONTCOPY
(DEFOPTIMIZER LISPERROR (MESSAGE ARG) (BQUOTE (\LISPERROR (\, ARG) (\, (CL:IF (CL:STRINGP MESSAGE) (FOR X IN \ERRORMESSAGELIST AS I FROM 0 WHEN (CL:EQUAL X MESSAGE) DO (RETURN I) FINALLY (RETURN (HELP "Unknown error message" (LIST MESSAGE ARG)))) MESSAGE)))))
)
(* "END EXPORTED DEFINITIONS")
(CL:DEFVAR *LAST-CONDITION* NIL "Last condition signalled. This gets rebound to itself in nested execs.")
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(GLOBALVARS \ERRORMESSAGELIST)
)
(CL:DEFUN ERRM-TO-CONDITION (NUM MESSAGE) (CL:IF (TYPEP NUM (QUOTE CONDITION)) NUM (CASE NUM (2 (* ; "STACK OVERFLOW") (MAKE-CONDITION (QUOTE STACK-OVERFLOW))) (3 (* ; "ILLEGAL RETURN") (MAKE-CONDITION (QUOTE ILLEGAL-RETURN) :TAG MESSAGE)) ((4 10 14 28 38 39 51) (* ; "ARG NOT x") (MAKE-CONDITION (QUOTE XCL:TYPE-MISMATCH) :NAME MESSAGE :VALUE MESSAGE :EXPECTED-TYPE (CL:ECASE NUM (4 (QUOTE LIST)) (10 (QUOTE CL:NUMBER)) (14 (QUOTE CL:SYMBOL)) (28 (QUOTE ARRAYP)) (38 (QUOTE READTABLEP)) (39 (QUOTE TERMTABLEP)) (51 (QUOTE CL:HASH-TABLE))))) (5 (* ; "HARD DISK ERROR") (MAKE-CONDITION (QUOTE XCL:SIMPLE-DEVICE-ERROR) :MESSAGE MESSAGE)) ((6 35) (* ; "ATTEMPT TO SET NIL, ATTEMPT TO BIND NIL OR T") (MAKE-CONDITION (QUOTE XCL:ATTEMPT-TO-CHANGE-CONSTANT) :NAME NIL)) (7 (* ; "ATTEMPT TO RPLAC NIL") (MAKE-CONDITION (QUOTE XCL:ATTEMPT-TO-RPLAC-NIL) :NAME MESSAGE)) (8 (* ; "UNDEFINED OR ILLEGAL GO") (MAKE-CONDITION (QUOTE ILLEGAL-GO) :TAG MESSAGE)) (9 (* ; "FILE WON'T OPEN") (MAKE-CONDITION (QUOTE XCL:FILE-WONT-OPEN) :PATHNAME MESSAGE)) (11 (* ; "ATOM TOO LONG") (MAKE-CONDITION (QUOTE XCL:SYMBOL-NAME-TOO-LONG))) (12 (* ; "ATOM HASH TABLE FULL") (MAKE-CONDITION (QUOTE XCL:SYMBOL-HT-FULL))) (13 (* ; "FILE NOT OPEN") (MAKE-CONDITION (QUOTE XCL:STREAM-NOT-OPEN) :STREAM MESSAGE)) (16 (* ; "END OF FILE") (MAKE-CONDITION (QUOTE END-OF-FILE) :STREAM MESSAGE)) (17 (* ; "ERROR") (MAKE-CONDITION (QUOTE INTERLISP-ERROR) :MESSAGE MESSAGE)) (19 (* ; "ILLEGAL STACK ARG") (MAKE-CONDITION (QUOTE ILLEGAL-STACK-ARG) :ARG MESSAGE)) (21 (* ; "ARRAYS FULL") (MAKE-CONDITION (QUOTE XCL:ARRAY-SPACE-FULL))) (22 (* ; "FILE SYSTEM RESOURCES EXCEEDED") (MAKE-CONDITION (QUOTE XCL:FS-RESOURCES-EXCEEDED) :PATHNAME MESSAGE)) (23 (* ; "FILE NOT FOUND") (MAKE-CONDITION (QUOTE XCL:FILE-NOT-FOUND) :PATHNAME MESSAGE)) ((25 27) (* ; "UNUSUAL CDR ARG LIST, ILLEGAL ARG") (MAKE-CONDITION (QUOTE INVALID-ARGUMENT-LIST) :ARGUMENT MESSAGE)) (26 (* ; "HASH TABLE FULL") (MAKE-CONDITION (QUOTE XCL:HASH-TABLE-FULL) :TABLE MESSAGE)) (30 (* ; "STACK PTR HAS BEEN RELEASED") (MAKE-CONDITION (QUOTE STACK-POINTER-RELEASED) :NAME MESSAGE)) (31 (* ; "STORAGE FULL") (MAKE-CONDITION (QUOTE XCL:STORAGE-EXHAUSTED))) (34 (* ; "DATA TYPES FULL") (MAKE-CONDITION (QUOTE XCL:DATA-TYPES-EXHAUSTED))) (41 (* ; "PROTECTION VIOLATION") (MAKE-CONDITION (QUOTE XCL:FS-PROTECTION-VIOLATION) :PATHNAME MESSAGE)) (42 (* ; "BAD FILE NAME") (MAKE-CONDITION (QUOTE XCL:INVALID-PATHNAME) :PATHNAME MESSAGE)) (44 (* ; "UNBOUND ATOM") (MAKE-CONDITION (QUOTE UNBOUND-VARIABLE) :NAME MESSAGE)) (45 (* ; "UNDEFINED CAR OF FORM") (MAKE-CONDITION (QUOTE UNDEFINED-CAR-OF-FORM) :FUNCTION MESSAGE)) (46 (* ; "UNDEFINED FUNCTION") (MAKE-CONDITION (QUOTE UNDEFINED-FUNCTION-IN-APPLY) :NAME (CL:FIRST MESSAGE) :ARGUMENTS (CL:SECOND MESSAGE))) (47 (* ; "CONTROL-E") (MAKE-CONDITION (QUOTE XCL:CONTROL-E-INTERRUPT))) (48 (* ; "FLOATING UNDERFLOW") (MAKE-CONDITION (QUOTE CL:FLOATING-POINT-UNDERFLOW))) (49 (* ; "FLOATING OVERFLOW") (MAKE-CONDITION (QUOTE CL:FLOATING-POINT-OVERFLOW))) (52 (* ; "TOO MANY ARGUMENTS") (MAKE-CONDITION (QUOTE TOO-MANY-ARGUMENTS) :CALLEE MESSAGE :MAXIMUM CL:CALL-ARGUMENTS-LIMIT)) (CL:OTHERWISE (CL:ERROR "Interlisp error number ~D (message: ~S) no longer supported" NUM MESSAGE)))))
(PUTPROPS AERROR FILETYPE CL:COMPILE-FILE)
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
(PUTPROPS AERROR COPYRIGHT ("Venue & Xerox Corporation" 1982 1983 1986 1987 1988 1989 1990 1992))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (773 2259 (ERRORSTRING 783 . 896) (SETERRORN 898 . 1015) (LISPERROR 1017 . 1604) (
\LISPERROR 1606 . 2075) (\ILLEGAL.ARG 2077 . 2162) (\ARG.NOT.LITATOM 2164 . 2257)))))
STOP

BIN
CLTL2/AERROR.LCOM Normal file

Binary file not shown.

1882
CLTL2/APRINT Normal file

File diff suppressed because it is too large Load Diff

BIN
CLTL2/APRINT.LCOM Normal file

Binary file not shown.

535
CLTL2/ATBL Normal file

File diff suppressed because one or more lines are too long

BIN
CLTL2/ATBL.LCOM Normal file

Binary file not shown.

341
CLTL2/ATERM Normal file

File diff suppressed because one or more lines are too long

BIN
CLTL2/ATERM.LCOM Normal file

Binary file not shown.

864
CLTL2/BOOTSTRAP Normal file
View File

@@ -0,0 +1,864 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "12-Oct-93 15:20:15" "{Pele:mv:envos}<LispCore>Sources>CLTL2>BOOTSTRAP.;1" 41500
changes to%: (VARS BOOTSTRAPCOMS)
(FNS \LOAD-STREAM)
previous date%: " 2-Nov-92 04:15:40" "{Pele:mv:envos}<LispCore>Sources>BOOTSTRAP.;4")
(* ; "
Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT BOOTSTRAPCOMS)
(RPAQQ BOOTSTRAPCOMS
[(COMS (* ; "Some basic fns. Note that several are redefined later. E.g., RPAQQ et al real definitions are on UNDO")
(FNS GETPROP SETATOMVAL RPAQQ RPAQ RPAQ? MOVD MOVD? SELECTQ SELECTQ1 NCONC1 PUTPROP
PROPNAMES ADDPROP REMPROP MEMB CLOSEF?))
(COMS (* ;
 "Need these in order to load even compiled files SYSLOAD")
(FNS LOAD \LOAD-STREAM FILECREATED FILECREATED1 PRETTYCOMPRINT BOOTSTRAP-NAMEFIELD
PUTPROPS DECLARE%: DECLARE%:1 ROOTFILENAME DEFINE-FILE-INFO \DO-DEFINE-FILE-INFO))
(INITVARS (EOLCHARCODE (CHCON1 "
"))
(PRETTYHEADER)
(DWIMFLG)
(UPDATEMAPFLG)
(DFNFLG)
(ADDSPELLFLG)
(BUILDMAPFLG)
(FILEPKGFLG)
(SYSFILES)
(NOTCOMPILEDFILES)
(RESETVARSLST)
[LOADPARAMETERS '((SEQUENTIAL T]
(LISPXHIST)
(LISPXPRINTFLG T)
(PRETTYHEADER "File created ")
(LOAD-VERBOSE-STREAM T)
(BELLS '"")
(LOADOPTIONS '(SYSLOAD NIL T PROP ALLPROP))
(PRETTYDEFMACROS NIL)
(PRETTYTYPELST NIL)
(FILEPKGTYPES NIL))
(ADDVARS (LOADEDFILELST))
(GLOBALVARS DWIMFLG UPDATEMAPFLG LOADOPTIONS LOADPARAMETERS FILERDTBL SYSFILES)
(DECLARE%: DONTEVAL@LOAD DOCOPY [P [MAPC '((PUTD . /PUTD)
(PUTPROP . /PUTPROP)
(PUTPROP . PUT)
(PUTPROP . SAVEPUT)
(ADDPROP . /ADDPROP)
(PUT . /PUT)
(PRIN1 . LISPXPRIN1)
(PRIN2 . LISPXPRIN2)
(PRINT . LISPXPRINT)
(TERPRI . LISPXTERPRI)
(SPACES . LISPXSPACES)
(GETPROP . GETP)
(SET . SAVESET)
(SET . /SET)
(NILL . MISSPELLED?)
(SETTOPVAL . /SETTOPVAL)
(BOOTSTRAP-NAMEFIELD . NAMEFIELD)
(BOOTSTRAP-NAMEFIELD . COMSNAME)
(NILL . RESETRESTORE))
(FUNCTION (LAMBDA (X)
(OR (CCODEP (CDR X))
(MOVD (CAR X)
(CDR X)
NIL T]
(AND (CCODEP 'BOOTSTRAP-NAMEFIELD)
(PUTD 'BOOTSTRAP-NAMEFIELD]
(P (RADIX 10)))
(DECLARE%: DOEVAL@COMPILE DONTCOPY (* ; "eventually imported from FASL")
(CONSTANTS FASL:SIGNATURE))
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDVARS (NLAMA DEFINE-FILE-INFO DECLARE%: PUTPROPS FILECREATED SELECTQ)
(NLAML PRETTYCOMPRINT RPAQ? RPAQ RPAQQ)
(LAMA])
(* ;
"Some basic fns. Note that several are redefined later. E.g., RPAQQ et al real definitions are on UNDO"
)
(DEFINEQ
(GETPROP
[LAMBDA (ATM PROP) (* lmm " 5-SEP-83 22:29")
(* ; "Used to be called GETP")
(AND (LITATOM ATM)
(PROG ((PLIST (GETPROPLIST ATM)))
LP [COND
((OR (NLISTP PLIST)
(NLISTP (CDR PLIST)))
(RETURN NIL))
((EQ (CAR PLIST)
PROP)
(RETURN (CADR PLIST]
(SETQ PLIST (CDDR PLIST))
(GO LP])
(SETATOMVAL
[LAMBDA (X Y) (* bvm%: "29-Sep-86 16:14")
(SETTOPVAL X Y])
(RPAQQ
[NLAMBDA (X Y)
(SETATOMVAL X Y])
(RPAQ
[NLAMBDA (RPAQX RPAQY) (* lmm "23-JUL-83 16:10")
(* ;
 "RPAQ and RPAQQ are used by PRETTYDEF to save VARS.")
(SETTOPVAL RPAQX (EVAL RPAQY])
(RPAQ?
[NLAMBDA (RPAQX RPAQY) (* lmm "23-JUL-83 16:12")
(* ;
 "RPAQ? and RPAQQ are used by PRETTYDEF to save VARS.")
(OR (NEQ (GETTOPVAL RPAQX)
'NOBIND)
(SETTOPVAL RPAQX (EVAL RPAQY])
(MOVD
[LAMBDA (FROM TO COPYFLG DONTCOPY) (* ;
 "Edited 2-Nov-92 03:50 by sybalsky:mv:envos")
(COND
((AND DONTCOPY (NULL COPYFLG))
(* ;; "He really wants NO copy made, not a renamed version.")
(* ;;
 "This is like MOVD, but absolutely no consing is done, frame names are not changed, etc.")
(LET ((FROMCELL (fetch (LITATOM DEFINITIONCELL) of FROM))
(TOCELL (fetch (LITATOM DEFINITIONCELL) of TO)))
(UNINTERRUPTABLY
(replace (DEFINITIONCELL DEFPOINTER) of TOCELL with (fetch
(DEFINITIONCELL
DEFPOINTER)
of FROMCELL))
(replace (DEFINITIONCELL DEFCELLFLAGS) of TOCELL with
(fetch (DEFINITIONCELL
DEFCELLFLAGS)
of FROMCELL))
(replace (DEFINITIONCELL AUXDEFCELLFLAGS) of TOCELL
with (fetch (DEFINITIONCELL AUXDEFCELLFLAGS) of FROMCELL))
TO)))
(T (LET [(NEWFLG (NULL (GETD TO]
(PUTD TO (COND
(COPYFLG (COPY (VIRGINFN FROM)))
(T (GETD FROM)))
DONTCOPY)
(AND FILEPKGFLG (EXPRP TO)
(MARKASCHANGED TO 'FNS NEWFLG))
TO])
(MOVD?
[LAMBDA (FROM TO COPYFLG DONTCOPY) (* bvm%: "10-Jul-85 13:00")
(* ;; "Like MOVD but only does it if TO is not defined.")
(COND
((NULL (GETD TO))
(PUTD TO (COND
(COPYFLG (COPY (VIRGINFN FROM)))
(T (GETD FROM)))
DONTCOPY)
(AND FILEPKGFLG (EXPRP TO)
(MARKASCHANGED TO 'FNS T))
TO])
(SELECTQ
[NLAMBDA SELCQ
(APPLY 'PROGN (SELECTQ1 (EVAL (CAR SELCQ)
'SELECTQ)
(CDR SELCQ))
'SELECTQ])
(SELECTQ1
[LAMBDA (M L)
(PROG (C)
LP (SETQ C L)
[COND
((NULL (SETQ L (CDR L)))
(RETURN C))
([OR (EQ (CAR (SETQ C (CAR C)))
M)
(AND (LISTP (CAR C))
(FMEMB M (CAR C]
(RETURN (CDR C]
(GO LP])
(NCONC1
[LAMBDA (LST X)
(* included in wtmisc so can make the call to nconc be linked.
 so that user can then break on nconc.)
(NCONC LST (FRPLACD (CONS X LST])
(PUTPROP
[LAMBDA (ATM PROP VAL) (* ; "Edited 28-May-87 09:16 by jop")
(* ;; "Included because it must be defined before the MOVD's in BOOTSTRAPCOMS that initialize /PUTPROP are executed.")
[COND
((NOT (LITATOM ATM))
(ERRORX (LIST 14 ATM]
(PROG ((X (GETPROPLIST ATM))
X0)
LP (COND
((NLISTP X)
(COND
((AND (NULL X)
X0) (* ;
 "typical case. property list ran out on an even parity position. e.g. (A B C D)")
(FRPLACD (CDR X0)
(LIST PROP VAL))
(RETURN VAL)))
(* ;; "propety list was initially NIL or a non-list, or else it ended in a non-list following an even parity position, e.g. (A B . C) fall through and add new property at beginning")
)
((NLISTP (CDR X))
(* ;; "property list runs out on an odd parity, or ends in an odd list following an odd parity, e.g. (A B C) or (A B C . D) fall through and add at beginning")
)
((EQ (CAR X)
PROP)
(FRPLACA (CDR X)
VAL)
(RETURN VAL))
(T (SETQ X (CDDR (SETQ X0 X)))
(GO LP)))
[SETPROPLIST ATM (CONS PROP (CONS VAL (GETPROPLIST ATM]
(RETURN VAL])
(PROPNAMES
[LAMBDA (ATM) (* wt%: " 3-AUG-78 01:23")
(MAPLIST (GETPROPLIST ATM)
(FUNCTION CAR)
(FUNCTION CDDR])
(ADDPROP
[LAMBDA (ATM PROP NEW FLG) (* ;
 "If FLG is T, NEW is consed onto the front, otherwise NCONCED onto the end.")
(* ; "Value is new PROP value.")
[COND
[(NULL ATM)
(ERRORX (LIST 7 (LIST PROP NEW]
((NOT (LITATOM ATM))
(ERRORX (LIST 14 ATM]
(PROG ((X (GETPROPLIST ATM))
X0)
LP (COND
((NLISTP X)
(COND
((AND (NULL X)
X0) (* ;
 "typical case. property list ran out on an even parity position.")
[FRPLACD (CDR X0)
(LIST PROP (SETQ NEW (LIST NEW]
(RETURN NEW)))
(* ;; "proprty list was initially NIL or a non-lit, or ele it ended in a non-list following an even parity position, e.g. (A B . C) fall through and add property at beginning of property list.")
)
((NLISTP (CDR X))
(* ;; "property list runs out on an odd parity, or else ends in a non-list following an odd parity, e.g. (A B C) or (A B C . D) fall through and add at beginning")
)
((EQ (CAR X)
PROP) (* ; "PROP found")
[FRPLACA (CDR X)
(SETQ NEW (COND
(FLG (CONS NEW (CADR X)))
(T (NCONC1 (CADR X)
NEW]
(RETURN NEW))
(T (SETQ X (CDDR (SETQ X0 X)))
(GO LP))) (* ;
 "Add to beginning of property list.")
[SETPROPLIST ATM (CONS PROP (CONS (SETQ NEW (LIST NEW))
(GETPROPLIST ATM]
(RETURN NEW])
(REMPROP
[LAMBDA (ATM PROP) (* bvm%: "17-Sep-86 17:29")
[COND
((NULL (LITATOM ATM))
(ERRORX (LIST 14 ATM]
(PROG ((X (GETPROPLIST ATM))
X0 VAL)
LP [COND
((OR (NLISTP X)
(NLISTP (CDR X)))
(RETURN VAL))
((EQ (CAR X)
PROP)
(SETQ VAL (OR PROP T)) (* ; "T in case indicator is NIL")
[COND
(X0 (FRPLACD (CDR X0)
(CDDR X)))
(T (SETPROPLIST ATM (CDDR X] (* ; "iterate in case there are more occurrences. Shouldn't happen unless users manually clobber prop list")
(SETQ X (CDDR X)))
(T (SETQ X (CDDR (SETQ X0 X]
(GO LP])
(MEMB
[LAMBDA (X Y)
(PROG NIL
LP (RETURN (COND
((NLISTP Y)
NIL)
((EQ X (CAR Y))
Y)
(T (SETQ Y (CDR Y))
(GO LP])
(CLOSEF?
[LAMBDA (FL) (* wt%: 18-MAR-77 12 20)
(* ;
 "useful for resetsaves, in case somebody else might close the file.")
(AND FL (OPENP FL)
(CLOSEF FL])
)
(* ; "Need these in order to load even compiled files SYSLOAD")
(DEFINEQ
(LOAD
[LAMBDA (FILE LDFLG PRINTFLG PACKAGE) (* ; "Edited 9-Apr-87 18:44 by bvm:")
(RESETLST (PROG (STREAM TEM)
TOP (if (FMEMB LDFLG LOADOPTIONS)
elseif (AND DWIMFLG (SETQ TEM (FIXSPELL LDFLG NIL LOADOPTIONS T)))
then (SETQ LDFLG TEM)
else (SETQ LDFLG (ERROR "unrecognized load option" LDFLG))
(GO TOP))
[if (AND PACKAGE (NOT (CL:PACKAGEP PACKAGE)))
then (* ;
 "Make sure package arg is ok, too")
(SETQ PACKAGE (OR (CL:FIND-PACKAGE PACKAGE)
(\DTEST PACKAGE 'PACKAGE]
[RESETSAVE NIL (LIST 'CLOSEF? (SETQ STREAM (OPENSTREAM FILE 'INPUT 'OLD
LOADPARAMETERS]
(RETURN (\LOAD-STREAM STREAM LDFLG PRINTFLG (AND PRETTYHEADER T)
PACKAGE])
(\LOAD-STREAM
[LAMBDA (STREAM LDFLG PRINTFLG LOAD-VERBOSE-STREAM PACKAGE)
(DECLARE (SPECVARS LDFLG PRINTFLG LOAD-VERBOSE-STREAM))
(* ; "Edited 29-Jan-88 19:02 by jop")
(* ;;; "Internal function that loads from an already open stream. LOAD-VERBOSE-STREAM if non-nil is the stream to which to print %"file created%" messages and such. Similarly, PRINTFLG, if non-nil, is the stream to which to print the value of each expression.")
(PROG ((*STANDARD-INPUT* STREAM)
(FILE (FULLNAME STREAM))
(*PACKAGE* *PACKAGE*)
(*READTABLE* (PROG1 FILERDTBL (* ; "This initial value important for SKIPSEPRCODES below, but *READTABLE* gets reset appropriately before anything else is read")
))
(DFNFLG DFNFLG)
(BUILDMAPFLG BUILDMAPFLG)
(FILEPKGFLG FILEPKGFLG)
(ADDSPELLFLG ADDSPELLFLG)
(LISPXHIST LISPXHIST)
(PRLST (AND FILEPKGFLG (FILEPKGCHANGES)))
(FILECREATEDENV *OLD-INTERLISP-READ-ENVIRONMENT*)
FILEMAP FNADRLST ROOTNAME TEM FILECREATEDLST LOADA MAYBEWANTFILEMAP INTERLISP-P
FILECREATEDLOC)
(DECLARE (SPECVARS DFNFLG BUILDMAPFLG FILEPKGFLG ADDSPELLFLG LISPXHIST FILECREATEDLST
FILECREATEDENV FILECREATEDLOC FILE))
(if (AND LOAD-VERBOSE-STREAM FILE)
then (LISPXTERPRI LOAD-VERBOSE-STREAM)
(if (NEQ LOAD-VERBOSE-STREAM T)
then (* ;
 "CL:LOAD says to prefix this stuff with comment marker")
(PRIN1 "; Loading " LOAD-VERBOSE-STREAM))
(* ;
 "Might use EXEC-FORMAT here except that it isn't defined early in loadup")
(LISPXPRIN1 FILE LOAD-VERBOSE-STREAM)
(LISPXTERPRI LOAD-VERBOSE-STREAM))
(if (EQ (SETQ DFNFLG LDFLG)
'SYSLOAD)
then (SETQ DFNFLG T)
(SETQ ADDSPELLFLG NIL)
(SETQ BUILDMAPFLG NIL)
(SETQ FILEPKGFLG NIL)
(SETQ LISPXHIST NIL))
(if LISPXHIST
then (* ;
 "Want UNDOSAVE to keep saving regardless of how many undosaves are involved")
(if (SETQ LOADA (FMEMB 'SIDE LISPXHIST))
then (FRPLACA (CADR LOADA)
-1)
else (LISPXPUT 'SIDE (LIST -1)
NIL LISPXHIST)))
[if (EQ (SETQ TEM (SKIPSEPRCODES STREAM))
FASL:SIGNATURE)
then (* ;
 "FASL file handled by FASL loader")
(FASL:PROCESS-FILE STREAM)
[LET [(MANAGED-FILE-P (GET (SETQ ROOTNAME (ROOTFILENAME FILE T))
'FILEDATES]
(if (NOT (MEMB FILE LOADEDFILELST))
then (* ;
 "Keep track of every file loaded.")
(SETQ LOADEDFILELST (CONS FILE LOADEDFILELST)))
(if MANAGED-FILE-P
then (if (EQ LDFLG 'SYSLOAD)
then
(* ;;
 "Don't notice DFASL's when you are coming from CL:LOAD, and the user didn't specify a load flag")
(if (NOT (MEMB ROOTNAME SYSFILES))
then (SETQ SYSFILES (NCONC1 SYSFILES
ROOTNAME)))
(SMASHFILECOMS ROOTNAME)
elseif FILEPKGFLG
then (ADDFILE ROOTNAME 'Compiled]
(RETURN FILE)
elseif (NEQ TEM (CHARCODE "("))
then (RETURN (\CML-LOAD STREAM PRINTFLG LOAD-VERBOSE-STREAM (CL::DEFAULT-IO-PACKAGE
PACKAGE]
(if (AND BUILDMAPFLG (RANDACCESSP STREAM))
then (SETQ MAYBEWANTFILEMAP T))
(WITH-READER-ENVIRONMENT FILECREATEDENV
(PROG (ADR)
LP (if FILEMAP
then (* ;
 "need to build map, so read carefully")
(SETQ LOADA (SKIPSEPRCODES STREAM))
(if (OR (SYNTAXP LOADA 'LEFTPAREN)
(SYNTAXP LOADA 'LEFTBRACKET))
then (* ; "See if we have a DEFINEQ")
(SETQ ADR (GETFILEPTR STREAM))
(READCCODE STREAM) (* ; "Eat paren")
(if (EQ (RATOM STREAM)
'DEFINEQ)
then (SETQ FNADRLST (TCONC NIL ADR))
(TCONC FNADRLST NIL)
(TCONC FILEMAP (CAR FNADRLST))
(GO DEFQLP))
(* ; "Not a DEFINEQ, so back out")
(SETFILEPTR STREAM ADR)))
(SELECTQ (SETQ LOADA (READ STREAM))
((STOP NIL)
(if (EQ LDFLG 'SYSLOAD)
then (if (NOT (MEMB (SETQ ROOTNAME
(ROOTFILENAME FILE
(CDR FILECREATEDLST)))
SYSFILES))
then (SETQ SYSFILES (NCONC1 SYSFILES
ROOTNAME)))
(SMASHFILECOMS ROOTNAME)
elseif FILEPKGFLG
then
(* ;; "Do not want any items that are added to FILEPKGCHANGES as a result of being mentioned in this file to remain on FILEPKGCHANGES. Also, we want items mentioned earlier to be deleted if they are taken care of by this file. The extra argument to ADDFILE allows it to restore FILEPKGCHANGES to the intersection of its current value and its previous value.")
(ADDFILE FILE T PRLST FILECREATEDLST))
[if FILEMAP
then (PUTFILEMAP FILE (CAR FILEMAP)
FILECREATEDLST FILECREATEDENV NIL
FILECREATEDLOC)
(if UPDATEMAPFLG
then (SETFILEPTR STREAM ADR)
(* ;
 "address of last expression read. good hint for finding filemap")
(UPDATEFILEMAP STREAM (CAR FILEMAP]
(if (NOT (MEMB FILE LOADEDFILELST))
then (/SETTOPVAL 'LOADEDFILELST (CONS FILE LOADEDFILELST)))
(RETURN))
NIL)
[if (LISTP LOADA)
then
(SELECTQ (CAR LOADA)
(DEFINE-FILE-INFO (* ;
 "Handle this specially, since we want to remember the environment")
(SETQ FILECREATEDLOC (GETFILEPTR STREAM))
[SET-READER-ENVIRONMENT (SETQ LOADA
(SETQ FILECREATEDENV
(\DO-DEFINE-FILE-INFO
NIL
(CDR LOADA]
(if PACKAGE
then (* ;
 "Caller better really mean it--overrides what's on file!")
(replace REPACKAGE of
FILECREATEDENV
with (SETQ *PACKAGE*
(OR (CL:FIND-PACKAGE *PACKAGE*
)
(CL:CERROR
"Use current *PACKAGE*"
"~s does not name a package"
*PACKAGE*)
*PACKAGE*)))
(LISTPUT (fetch RESPEC of
FILECREATEDENV
)
:PACKAGE
(CL:PACKAGE-NAME *PACKAGE*))))
(FILECREATED (if MAYBEWANTFILEMAP
then (* ; "See if we have a valid file map")
(SETQ ADR (GETFILEPTR STREAM))
(if [AND (FIXP (SETQ TEM (CADDDR LOADA)))
[SETQ TEM (CAR (NLSETQ (SETFILEPTR STREAM
TEM)
(READ STREAM]
(EQ (CAR TEM)
'FILEMAP)
(NULL (CAR (SETQ TEM (CADR TEM]
then (* ; "Has ok map")
(PUTFILEMAP FILE TEM NIL FILECREATEDENV)
else (* ;
 "Need to build a file map as we go")
(SETQ FILEMAP (TCONC NIL NIL)))
(SETFILEPTR STREAM ADR)
(SETQ MAYBEWANTFILEMAP NIL))
(SETQ LOADA (\EVAL LOADA)))
(SETQ LOADA (\EVAL LOADA)))
else (* ;
 "Atom found. Compiled code definition.")
(if ADDSPELLFLG
then (ADDSPELL LOADA))
(if FILEMAP
then (SETQ ADR (GETFILEPTR STREAM)))
(LAPRD LOADA)
(if FILEMAP
then (TCONC FILEMAP (CONS ADR (CONS (GETFILEPTR STREAM)
LOADA]
LP1 (if PRINTFLG
then (PRINT LOADA PRINTFLG))
(GO LP)
DEFQLP
(SELCHARQ (SKIPSEPRCODES STREAM)
((%) %]) (* ; "Closes DEFINEQ.")
(READCCODE STREAM)
(if FNADRLST
then (RPLACA (CDAR FNADRLST)
(GETFILEPTR STREAM)))
(* ;
 "FNADRLST is a TCONC format list, hence want to RPLACA CDAR, not just CDR.")
(SETQ LOADA (DEFINE (DREVERSE LOADA)))
(GO LP1))
((%( %[) (* ;
 "another function/definition pair")
(SETQ ADR (GETFILEPTR STREAM))
(SETQ LOADA (CONS (READ STREAM)
LOADA))
[if FNADRLST
then (TCONC FNADRLST (CONS (CAAR LOADA)
(CONS ADR (GETFILEPTR STREAM]
(GO DEFQLP))
NIL)
(ERROR "illegal argument in defineq")))
(RETURN FILE])
(FILECREATED
[NLAMBDA X (* ; "Edited 12-Jan-88 10:44 by bvm")
(DECLARE (USEDFREE FILECREATEDLST LOAD-VERBOSE-STREAM))
(PROG ((FILEDATE (CAR X))
(FILE (CADR X)))
(SETQ FILECREATEDLST (NCONC1 FILECREATEDLST X))
(COND
(LOAD-VERBOSE-STREAM
(* ;; "Presumably if user sets prettyheader to NIL, he doesnt want to see any file created messages, even those frm compiled files.")
(if (NEQ LOAD-VERBOSE-STREAM T)
then (* ;
 "CL:LOAD says to prefix this stuff with comment marker")
(PRIN1 "; " LOAD-VERBOSE-STREAM))
(LISPXPRIN1 (FILECREATED1 X)
LOAD-VERBOSE-STREAM)
(LISPXPRIN1 FILEDATE LOAD-VERBOSE-STREAM)
(LISPXTERPRI LOAD-VERBOSE-STREAM)))
(COND
((AND FILE (NLISTP FILE))
(* ;; "This is just temporary, primarily for keeping dates of system files which are loaded with FILEPKGFLG=NIL. The real setting up of file property lists is done when ADDFILE is called.")
(/PUT (ROOTFILENAME FILE)
'FILEDATES
(LIST (CONS FILEDATE FILE])
(FILECREATED1
[LAMBDA (X) (* ; "Edited 12-Jan-88 10:44 by bvm")
(* ;; "performs error checking on filecreated expressions. returns the thing to be printed. used by filecreated, and loadfns.")
(* ;; "FILECREATED expression for source file is of form (FILECREATED date filename mapaddress . historyinfo). For compiled file, is of form (FILECREATED date (%"compiled on%" sourceFile)). ")
(LET ((FILE (CADR X)))
(COND
((AND NIL (STRINGP FILE)) (* ;
 "old way of doing COMPILED ON -- we no longer have such files, and the file name can be a string.")
FILE)
((LISTP FILE) (* ;
 "New. also used for printing COMPILED ON message. CDR is a list of files that were compiled.")
(CAR FILE))
(T (* ;
 "FILE is atomic, the name of the file")
PRETTYHEADER])
(PRETTYCOMPRINT
[NLAMBDA (X) (* bvm%: "22-Sep-86 17:02")
(if LOAD-VERBOSE-STREAM
then (if (NEQ LOAD-VERBOSE-STREAM T)
then (* ;
 "CL:LOAD says to prefix this stuff with comment marker")
(PRIN1 "; " LOAD-VERBOSE-STREAM))
(LISPXPRINT X LOAD-VERBOSE-STREAM])
(BOOTSTRAP-NAMEFIELD
[LAMBDA (FILE SUFFIXFLG) (* bvm%: " 2-Aug-86 14:50")
(* ;; "BOOTSTRAP VERSION -- this is replaced by real version from MACHINEINDEPENDENT")
(PROG ((START 1)
POS END)
(while (SETQ POS (OR (STRPOS '} FILE START)
(STRPOS '> FILE START)
(STRPOS '/ FILE START))) do (SETQ START (ADD1 POS)))
[COND
((SETQ POS (STRPOS '; FILE))
(SETQ END (SUB1 POS))
(COND
((EQ (NTHCHARCODE FILE END)
(CHARCODE ".")) (* ; "eliminates null suffix")
(SETQ END (SUB1 END]
[COND
((SETQ POS (STRPOS '%. FILE START))
(COND
((NULL SUFFIXFLG)
(SETQ END (SUB1 POS]
(RETURN (SUBATOM FILE START END])
(PUTPROPS
[NLAMBDA X (* bvm%: " 8-Sep-86 11:20")
(* ;; "Later in the loadup, the PUTPROP is changed to SAVEPUT")
(MAP (CDR X)
[FUNCTION (LAMBDA (Y)
(PUTPROP (CAR X)
(CAR Y)
(CADR Y]
(FUNCTION CDDR])
(DECLARE%:
[NLAMBDA X (* wt%: "20-OCT-77 13:00")
(DECLARE%:1 X T])
(DECLARE%:1
[LAMBDA (X EVALFLG) (* wt%: "20-OCT-77 13:09")
(PROG NIL
LP (COND
((NLISTP X)
(RETURN))
[(LISTP (CAR X))
(AND EVALFLG (COND
((EQ (CAAR X)
'DECLARE%:)
(DECLARE%:1 (CDAR X)
T))
(T (EVAL (CAR X]
(T (SELECTQ (CAR X)
((EVAL@LOAD DOEVAL@LOAD)
(SETQ EVALFLG T))
(EVAL@LOADWHEN (SETQ EVALFLG (EVAL (CADR X)))
(SETQ X (CDR X)))
(DONTEVAL@LOAD (SETQ EVALFLG NIL))
NIL)))
(SETQ X (CDR X))
(GO LP])
(ROOTFILENAME
[LAMBDA (NAME COMPFLG) (* ; "Edited 22-May-92 11:59 by jds")
(* ;; "Returns the root of the filename NAME, the atom that all file package properties will be associated with. If NAME names a compiled file, then COMPFLG~=NIL and we assume that the extension is COMPILE.EXT, which is to be stripped off. We thus have something of an anomaly: We can keep track of 2 symbolic files whose names differ only in extension, but we confuse them when we deal with their compiled versions.")
(* ;; "The name is always returned in upper case, so that file-system case dependencies don't carry over into Medley, where source file names are NOT case dependent. JDS, fixing AR 11518 5/21/92")
(U-CASE (NAMEFIELD (COND
((TYPEP NAME 'STREAM)
(FULLNAME NAME))
(T NAME))
(NOT COMPFLG])
(DEFINE-FILE-INFO
[NLAMBDA ARGS (* bvm%: "13-Oct-86 17:24")
(* ;; "Evaluated when it appears at top of file. Caller (e.g., LOAD) binds reader environment, so we just set it. Also return the env in case someone wants it.")
(DECLARE (USEDFREE FILECREATEDLOC))
(SETQ FILECREATEDLOC (GETFILEPTR))
(SET-READER-ENVIRONMENT (\DO-DEFINE-FILE-INFO NIL ARGS])
(\DO-DEFINE-FILE-INFO
[LAMBDA (STREAM ARGS) (* bvm%: "14-Oct-86 00:28")
(* ;;; "Processes the (DEFINE-FILE-INFO . ARGS) at the front of STREAM")
(LET (PACKAGE READTABLE BASE VALUE)
[for TAIL on ARGS by (CDDR TAIL)
do (SETQ VALUE (CADR TAIL))
(SELECTQ (CAR TAIL)
(:PACKAGE (SETQ PACKAGE
(OR (if (LISTP VALUE)
then (LET ((P (EVAL VALUE)))
(if (TYPEP P 'PACKAGE)
then P
else (CL:FIND-PACKAGE P)))
else (CL:FIND-PACKAGE VALUE))
(ERROR "Can't find package for reader environment" VALUE))))
(:READTABLE (SETQ READTABLE (OR (if (LISTP VALUE)
then (\DTEST (EVAL VALUE)
'READTABLEP)
else (FIND-READTABLE VALUE))
(ERROR
"Can't find read table for reader environment"
VALUE))))
(:BASE (SETQ BASE (OR (\CHECKRADIX (if (LISTP VALUE)
then (EVAL VALUE)
else VALUE))
(ERROR "Bad read base for reader environment" VALUE))))
(ERROR "Unrecognized file info key" (CAR TAIL]
(create READER-ENVIRONMENT
REPACKAGE _ (OR PACKAGE *INTERLISP-PACKAGE*)
REREADTABLE _ (OR READTABLE FILERDTBL)
REBASE _ (OR BASE 10)
RESPEC _ ARGS])
)
(RPAQ? EOLCHARCODE (CHCON1 "
"))
(RPAQ? PRETTYHEADER )
(RPAQ? DWIMFLG )
(RPAQ? UPDATEMAPFLG )
(RPAQ? DFNFLG )
(RPAQ? ADDSPELLFLG )
(RPAQ? BUILDMAPFLG )
(RPAQ? FILEPKGFLG )
(RPAQ? SYSFILES )
(RPAQ? NOTCOMPILEDFILES )
(RPAQ? RESETVARSLST )
(RPAQ? LOADPARAMETERS '((SEQUENTIAL T)))
(RPAQ? LISPXHIST )
(RPAQ? LISPXPRINTFLG T)
(RPAQ? PRETTYHEADER "File created ")
(RPAQ? LOAD-VERBOSE-STREAM T)
(RPAQ? BELLS '"")
(RPAQ? LOADOPTIONS '(SYSLOAD NIL T PROP ALLPROP))
(RPAQ? PRETTYDEFMACROS NIL)
(RPAQ? PRETTYTYPELST NIL)
(RPAQ? FILEPKGTYPES NIL)
(ADDTOVAR LOADEDFILELST )
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(GLOBALVARS DWIMFLG UPDATEMAPFLG LOADOPTIONS LOADPARAMETERS FILERDTBL SYSFILES)
)
(DECLARE%: DONTEVAL@LOAD DOCOPY
[MAPC '((PUTD . /PUTD)
(PUTPROP . /PUTPROP)
(PUTPROP . PUT)
(PUTPROP . SAVEPUT)
(ADDPROP . /ADDPROP)
(PUT . /PUT)
(PRIN1 . LISPXPRIN1)
(PRIN2 . LISPXPRIN2)
(PRINT . LISPXPRINT)
(TERPRI . LISPXTERPRI)
(SPACES . LISPXSPACES)
(GETPROP . GETP)
(SET . SAVESET)
(SET . /SET)
(NILL . MISSPELLED?)
(SETTOPVAL . /SETTOPVAL)
(BOOTSTRAP-NAMEFIELD . NAMEFIELD)
(BOOTSTRAP-NAMEFIELD . COMSNAME)
(NILL . RESETRESTORE))
(FUNCTION (LAMBDA (X)
(OR (CCODEP (CDR X))
(MOVD (CAR X)
(CDR X)
NIL T]
(AND (CCODEP 'BOOTSTRAP-NAMEFIELD)
(PUTD 'BOOTSTRAP-NAMEFIELD))
(RADIX 10)
)
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(DECLARE%: EVAL@COMPILE
(RPAQQ FASL:SIGNATURE 145)
(CONSTANTS FASL:SIGNATURE)
)
)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA DEFINE-FILE-INFO DECLARE%: PUTPROPS FILECREATED SELECTQ)
(ADDTOVAR NLAML PRETTYCOMPRINT RPAQ? RPAQ RPAQQ)
(ADDTOVAR LAMA )
)
(PUTPROPS BOOTSTRAP COPYRIGHT ("Venue & Xerox Corporation" 1983 1984 1985 1986 1987 1988 1989 1990
1992 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (4584 14256 (GETPROP 4594 . 5166) (SETATOMVAL 5168 . 5297) (RPAQQ 5299 . 5352) (RPAQ
5354 . 5666) (RPAQ? 5668 . 6038) (MOVD 6040 . 7904) (MOVD? 7906 . 8336) (SELECTQ 8338 . 8525) (
SELECTQ1 8527 . 8869) (NCONC1 8871 . 9067) (PUTPROP 9069 . 10553) (PROPNAMES 10555 . 10746) (ADDPROP
10748 . 12811) (REMPROP 12813 . 13667) (MEMB 13669 . 13928) (CLOSEF? 13930 . 14254)) (14329 39341 (
LOAD 14339 . 15508) (\LOAD-STREAM 15510 . 30380) (FILECREATED 30382 . 31800) (FILECREATED1 31802 .
32910) (PRETTYCOMPRINT 32912 . 33397) (BOOTSTRAP-NAMEFIELD 33399 . 34359) (PUTPROPS 34361 . 34729) (
DECLARE%: 34731 . 34863) (DECLARE%:1 34865 . 35737) (ROOTFILENAME 35739 . 36687) (DEFINE-FILE-INFO
36689 . 37124) (\DO-DEFINE-FILE-INFO 37126 . 39339)))))
STOP

BIN
CLTL2/BOOTSTRAP.LCOM Normal file

Binary file not shown.

902
CLTL2/BREAK-AND-TRACE Normal file
View File

@@ -0,0 +1,902 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "SYSTEM")
(IL:FILECREATED "13-Oct-93 18:35:41" "{Pele:mv:envos}<LispCore>Sources>CLTL2>BREAK-AND-TRACE.;2" 48661
IL:|previous| IL:|date:| " 4-Feb-92 10:31:42"
"{Pele:mv:envos}<LispCore>Sources>CLTL2>BREAK-AND-TRACE.;1")
; Copyright (c) 1987, 1988, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
(IL:PRETTYCOMPRINT IL:BREAK-AND-TRACECOMS)
(IL:RPAQQ IL:BREAK-AND-TRACECOMS
(
(IL:* IL:|;;;| "Support for tracing.")
(IL:VARIABLES XCL:*TRACE-DEPTH* XCL::*TRACED-FNS* IL:TRACEREGION)
(IL:FUNCTIONS XCL:CREATE-TRACE-WINDOW)
(IL:FUNCTIONS CREATE-TRACED-DEFINITION CONSTRUCT-ENTRY-PRINTING-CODE
PRINT-TRACE-ENTRY-INFO PRINT-TRACE-EXIT-INFO PRINT-TRACED-ARGUMENT
PRINT-TRACED-CL-ARGLIST)
(IL:VARIABLES XCL:*TRACE-LEVEL* XCL:*TRACE-LENGTH* XCL:*TRACE-VERBOSE* *TRACE-OUTPUT*)
(IL:FNS TRACE UNTRACE)
(IL:FUNCTIONS XCL:TRACE-FUNCTION)
(IL:* IL:|;;;| "Support for breaking.")
(IL:FUNCTIONS XCL:BREAK-FUNCTION XCL:UNBREAK-FUNCTION XCL:REBREAK-FUNCTION
CREATE-BROKEN-DEFINITION UNBREAK-FROM-RESTORE-CALLS FINISH-UNBREAKING)
(IL:VARIABLES IL:BROKENFNS XCL::*BREAK-HASH-TABLE* XCL::*UNBROKEN-FNS*)
(IL:PROP IL:PROPTYPE IL:BROKEN)
(IL:* IL:|;;| "The old Interlisp interface to breaking.")
(IL:FNS IL:BREAK IL:BREAK0 IL:REBREAK XCL:UNBREAK IL:UNBREAK0)
(IL:FNS IL:BREAK1)
(IL:SPECIAL-FORMS IL:BREAK1)
(XCL:OPTIMIZERS IL:BREAK1)
(IL:* IL:|;;| "Arrange for the proper compiler and package")
(IL:PROP (IL:FILETYPE IL:MAKEFILE-ENVIRONMENT)
IL:BREAK-AND-TRACE)
(IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS
(IL:ADDVARS (IL:NLAMA)
(IL:NLAML IL:BREAK1)
(IL:LAMA)))))
(IL:* IL:|;;;| "Support for tracing.")
(DEFVAR XCL:*TRACE-DEPTH* 0)
(DEFVAR XCL::*TRACED-FNS* NIL
(IL:* IL:|;;;| "A subset of the entries on IL:BROKENFNS, being those that resulted from calls to TRACE as opposed to calls to BREAK-FUNCTION.")
)
(DEFVAR IL:TRACEREGION (IL:|create| IL:REGION
IL:LEFT IL:_ 8
IL:BOTTOM IL:_ 3
IL:WIDTH IL:_ 547
IL:HEIGHT IL:_ 310))
(DEFUN XCL:CREATE-TRACE-WINDOW (&KEY (XCL::REGION IL:TRACEREGION)
(XCL::OPEN? NIL)
(XCL::TITLE "*Trace-Output*"))
(IL:* IL:\;
 "Edited 29-Jan-92 13:14 by jrb:")
(IL:* IL:|;;;| "Create and return a display stream associated with a window suitable for use as the value of *TRACE-OUTPUT*.")
(IL:* IL:|;;;|
"REGION is the initial region of the window. It defaults to the value of IL:TRACEREGION.")
(IL:* IL:|;;;| "OPEN? is true if the newly-created window should be left opened on the screen. If false, the window will be closed and will open the first time any output is sent to it.")
(IL:* IL:|;;;| "Because display streams only have an xpointer back to their windows, we give the stream a STREAMPROP pointer to the window; this makes them reference each other circularly, so they'll NEVER be GCed (*sigh*).")
(LET* ((XCL::WINDOW (IL:CREATEW XCL::REGION XCL::TITLE NIL (NOT XCL::OPEN?)))
(STREAM (IL:GETSTREAM XCL::WINDOW)))
(IL:DSPSCROLL 'IL:ON XCL::WINDOW)
(IL:STREAMPROP STREAM 'IL:WINDOW XCL::WINDOW)
STREAM))
(DEFUN CREATE-TRACED-DEFINITION (TRACED-FN IN-FN FN-TO-CALL)
(MULTIPLE-VALUE-BIND
(LAMBDA-CAR ARG-LIST CALLING-FORM)
(FUNCTION-WRAPPER-INFO TRACED-FN FN-TO-CALL)
`(,LAMBDA-CAR ,(IF (EQ LAMBDA-CAR 'LAMBDA)
'(&REST XCL:ARGLIST)
ARG-LIST)
,@(AND ARG-LIST (MEMBER LAMBDA-CAR '(IL:LAMBDA IL:NLAMBDA))
`((DECLARE (SPECIAL ,@(IF (SYMBOLP ARG-LIST)
(LIST ARG-LIST)
ARG-LIST)))))
(IL:\\CALLME '(:TRACED ,(IF (NULL IN-FN)
TRACED-FN
`(,TRACED-FN :IN ,IN-FN))))
(LET* (($THE-REAL-TRACE-OUTPUT$ (XCL:FOLLOW-SYNONYM-STREAMS (IL:\\GETSTREAM
*TRACE-OUTPUT*)))
($IMAGE-STREAM?$ (IL:IMAGESTREAMP $THE-REAL-TRACE-OUTPUT$)))
(LET ((*STANDARD-OUTPUT* $THE-REAL-TRACE-OUTPUT$)
(IL:FONTCHANGEFLG $IMAGE-STREAM?$))
(DECLARE (SPECIAL IL:FONTCHANGEFLG))
,@(CONSTRUCT-ENTRY-PRINTING-CODE TRACED-FN IN-FN LAMBDA-CAR ARG-LIST))
(LET (($TRACED-FN-VALUES$ (MULTIPLE-VALUE-LIST (LET ((XCL:*TRACE-DEPTH*
(1+ XCL:*TRACE-DEPTH*)))
,CALLING-FORM))))
(LET ((*STANDARD-OUTPUT* $THE-REAL-TRACE-OUTPUT$)
(IL:FONTCHANGEFLG $IMAGE-STREAM?$))
(DECLARE (SPECIAL IL:FONTCHANGEFLG))
(PRINT-TRACE-EXIT-INFO ',TRACED-FN ',IN-FN $TRACED-FN-VALUES$))
(VALUES-LIST $TRACED-FN-VALUES$))))))
(DEFUN CONSTRUCT-ENTRY-PRINTING-CODE (TRACED-FN IN-FN LAMBDA-CAR ARG-LIST)
`((PRINT-TRACE-ENTRY-INFO ',TRACED-FN ',IN-FN)
(LET
((*PRINT-LEVEL* XCL:*TRACE-LEVEL*)
(*PRINT-LENGTH* XCL:*TRACE-LENGTH*))
,@(CASE LAMBDA-CAR
((IL:LAMBDA IL:NLAMBDA)
(IL:IF (LISTP ARG-LIST)
IL:THEN
(IL:* IL:|;;|
 "Interlisp spread function. The ARG-LIST is, in fact, a list of argument names.")
`((LET (($$INDENT$$ (+ 10 (* XCL:*TRACE-DEPTH* 4))))
,@(IL:FOR VAR IL:IN ARG-LIST
IL:COLLECT `(PRINT-TRACED-ARGUMENT ',VAR ,VAR $$INDENT$$
))))
IL:ELSEIF (EQ LAMBDA-CAR 'IL:LAMBDA)
IL:THEN
(IL:* IL:|;;|
 "Interlisp Lambda no-spread function. Print out at most *TRACE-LENGTH* arguments.")
`((IL:BIND ($$INDENT$$ IL:_ (+ 10 (* XCL:*TRACE-DEPTH* 4))) IL:FOR
$ARG-COUNTER$
IL:FROM 1 IL:TO (IF (NULL XCL:*TRACE-LENGTH*)
,ARG-LIST
(MIN XCL:*TRACE-LENGTH* ,ARG-LIST))
IL:DO (PRINT-TRACED-ARGUMENT $ARG-COUNTER$ (IL:ARG ,ARG-LIST
$ARG-COUNTER$
)
$$INDENT$$)))
IL:ELSE
(IL:* IL:|;;| "Interlisp NLambda no-spread function. Print out at most *TRACE-LENGTH* arguments. Also, be careful to check that the argument list is really a list.")
`((LET (($$INDENT$$ (+ 10 (* XCL:*TRACE-DEPTH* 4))))
(IF (LISTP ,ARG-LIST)
(IL:FOR $ARGUMENT$ IL:IN ,ARG-LIST IL:AS $ARG-COUNTER$
IL:FROM 1 IL:WHILE (OR (NULL XCL:*TRACE-LENGTH*)
(<= $ARG-COUNTER$
XCL:*TRACE-LENGTH*))
IL:DO (PRINT-TRACED-ARGUMENT $ARG-COUNTER$ $ARGUMENT$
$$INDENT$$))
(PRINT-TRACED-ARGUMENT ',ARG-LIST ,ARG-LIST $$INDENT$$))))))
((LAMBDA)
(IL:* IL:|;;| "A Common Lisp function.")
(MULTIPLE-VALUE-BIND (REQUIRED OPTIONAL REST KEY KEY-APPEARED? ALLOW-OTHER-KEYS)
(PARSE-CL-ARGLIST ARG-LIST)
`((PRINT-TRACED-CL-ARGLIST XCL:ARGLIST ',REQUIRED ',OPTIONAL
',REST
',KEY
,KEY-APPEARED?
,ALLOW-OTHER-KEYS
(+ 8 (* XCL:*TRACE-DEPTH* 4))
XCL:*TRACE-VERBOSE*))))))))
(DEFUN PRINT-TRACE-ENTRY-INFO (TRACED-FN IN-FN)
(DECLARE (SPECIAL IL:BOLDFONT IL:DEFAULTFONT))
(SETQ TRACED-FN (OR (GET TRACED-FN 'TRUE-NAME)
TRACED-FN))
(SETQ IN-FN (OR (GET IN-FN 'TRUE-NAME)
IN-FN))
(IL:SPACES (* XCL:*TRACE-DEPTH* 4))
(PRINC (1+ XCL:*TRACE-DEPTH*))
(PRINC " - Enter ")
(IL:CHANGEFONT IL:BOLDFONT)
(PRIN1 TRACED-FN)
(IL:CHANGEFONT IL:DEFAULTFONT)
(WHEN (NOT (NULL IN-FN))
(PRINC " in ")
(IL:CHANGEFONT IL:BOLDFONT)
(PRIN1 IN-FN)
(IL:CHANGEFONT IL:DEFAULTFONT))
(PRINC ":")
(TERPRI))
(DEFUN PRINT-TRACE-EXIT-INFO (TRACED-FN IN-FN FN-VALUES)
(DECLARE (SPECIAL IL:BOLDFONT IL:DEFAULTFONT))
(SETQ TRACED-FN (OR (GET TRACED-FN 'TRUE-NAME)
TRACED-FN))
(SETQ IN-FN (OR (GET IN-FN 'TRUE-NAME)
IN-FN))
(IL:SPACES (* XCL:*TRACE-DEPTH* 4))
(PRINC (1+ XCL:*TRACE-DEPTH*))
(PRINC " - Exit ")
(IL:CHANGEFONT IL:BOLDFONT)
(PRIN1 TRACED-FN)
(IL:CHANGEFONT IL:DEFAULTFONT)
(WHEN (NOT (NULL IN-FN))
(PRINC " in ")
(IL:CHANGEFONT IL:BOLDFONT)
(PRIN1 IN-FN)
(IL:CHANGEFONT IL:DEFAULTFONT))
(PRINC " =>")
(TERPRI)
(IL:FOR VALUE IL:IN FN-VALUES IL:DO (IL:SPACES (+ 10 (* XCL:*TRACE-DEPTH* 4)))
(PRIN1 VALUE)
(TERPRI)))
(DEFUN PRINT-TRACED-ARGUMENT (NAME VALUE INDENT &OPTIONAL PRIN1-THE-NAME?)
(IL:SPACES INDENT)
(WHEN (TYPEP NAME 'FIXNUM)
(PRINC "Arg "))
(IF PRIN1-THE-NAME?
(PRIN1 NAME)
(PRINC NAME))
(PRINC " = ")
(PRIN1 VALUE)
(TERPRI))
(DEFUN PRINT-TRACED-CL-ARGLIST (ARGS REQUIRED OPTIONAL REST KEY KEY-APPEARED? ALLOW-OTHER-KEYS
SMALL-INDENT VERBOSE?)
(DECLARE (SPECIAL IL:BOLDFONT IL:DEFAULTFONT))
(LET* ((INDENT (+ SMALL-INDENT 2)))
(WHEN REQUIRED
(IL:FOR VAR IL:IN REQUIRED IL:DO (COND
((NULL ARGS)
(IL:SPACES INDENT)
(PRINC VAR)
(IL:CHANGEFONT IL:BOLDFONT)
(PRINC " ** NOT SUPPLIED **")
(IL:CHANGEFONT IL:DEFAULTFONT)
(TERPRI))
(T (PRINT-TRACED-ARGUMENT
VAR
(POP ARGS)
INDENT)))))
(WHEN OPTIONAL
(WHEN VERBOSE?
(IL:SPACES SMALL-INDENT)
(PRINC '&OPTIONAL)
(TERPRI))
(IL:FOR VAR IL:IN OPTIONAL IL:DO (IF (NULL ARGS)
(WHEN VERBOSE?
(IL:SPACES INDENT)
(PRINC VAR)
(PRINC " not supplied")
(TERPRI))
(PRINT-TRACED-ARGUMENT VAR
(POP ARGS)
INDENT))))
(WHEN REST
(WHEN VERBOSE?
(IL:SPACES SMALL-INDENT)
(PRINC '&REST)
(TERPRI))
(PRINT-TRACED-ARGUMENT REST ARGS INDENT))
(WHEN KEY
(WHEN VERBOSE?
(IL:SPACES SMALL-INDENT)
(PRINC '&KEY)
(TERPRI))
(IL:FOR VAR IL:IN KEY IL:DO (IL:FOR TAIL IL:ON ARGS IL:BY CDDR
IL:DO (WHEN (EQ VAR (CAR TAIL))
(PRINT-TRACED-ARGUMENT
VAR
(CADR TAIL)
INDENT T)
(RETURN)))))
(WHEN KEY-APPEARED?
(LET (TEMP)
(COND
((ODDP (LENGTH ARGS))
(IL:SPACES SMALL-INDENT)
(IL:CHANGEFONT IL:BOLDFONT)
(PRINC "** Odd-length &KEY argument list: **")
(IL:CHANGEFONT IL:DEFAULTFONT)
(TERPRI)
(IL:SPACES INDENT)
(PRIN1 ARGS)
(TERPRI))
((SETQ TEMP (IL:FIND KEYWORD IL:IN ARGS IL:BY (CDDR KEYWORD)
IL:SUCHTHAT (IF ALLOW-OTHER-KEYS
(NOT (KEYWORDP KEYWORD))
(NOT (MEMBER KEYWORD KEY :TEST 'EQ)))))
(IL:SPACES SMALL-INDENT)
(IL:CHANGEFONT IL:BOLDFONT)
(PRINC "** Illegal &KEY argument: **")
(IL:CHANGEFONT IL:DEFAULTFONT)
(TERPRI)
(IL:SPACES INDENT)
(PRIN1 TEMP)
(TERPRI)))))
(WHEN (AND (NOT REST)
(NOT KEY-APPEARED?)
(NOT (NULL ARGS)))
(IL:SPACES SMALL-INDENT)
(IL:CHANGEFONT IL:BOLDFONT)
(PRINC "** Extra arguments: **")
(IL:CHANGEFONT IL:DEFAULTFONT)
(TERPRI)
(IL:SPACES INDENT)
(PRIN1 ARGS)
(TERPRI))))
(DEFVAR XCL:*TRACE-LEVEL* NIL
(IL:* IL:|;;;| "What to bind *PRINT-LEVEL* to when printing argument values in TRACE output.")
)
(DEFVAR XCL:*TRACE-LENGTH* NIL
(IL:* IL:|;;;| "What to bind *PRINT-LENGTH* to during the printing of argument values in TRACE output. Also controls the number of arguments to no-spread functions that will be printed.")
)
(DEFVAR XCL:*TRACE-VERBOSE* T
(IL:* IL:|;;;| "Controls whether or not various parts of TRACE output are printed:")
(IL:* IL:|;;| "The lambda-list keywords &OPTIONAL, &REST, and &KEY.")
(IL:* IL:|;;| "Trailing unsupplied &OPTIONAL arguments.")
)
(DEFVAR *TRACE-OUTPUT* (XCL:CREATE-TRACE-WINDOW))
(IL:DEFINEQ
(TRACE
(IL:NLAMBDA LISP::FNS (IL:* IL:\;
 "Edited 2-Apr-87 16:10 by Pavel")
(SETQ LISP::FNS (IL:NLAMBDA.ARGS LISP::FNS))
(IF (NULL LISP::FNS)
XCL::*TRACED-FNS*
(IL:FOR LISP::FN IL:IN LISP::FNS IL:JOIN (IF (CONSP LISP::FN)
(XCL:TRACE-FUNCTION (FIRST
LISP::FN)
:IN
(THIRD LISP::FN))
(XCL:TRACE-FUNCTION LISP::FN))))
))
(UNTRACE
(IL:NLAMBDA LISP::FNS (IL:* IL:\;
 "Edited 2-Apr-87 16:39 by Pavel")
(SETQ LISP::FNS (IL:NLAMBDA.ARGS LISP::FNS))
(FLET ((LISP::UNTRACE-ENTRY (LISP::ENTRY)
(IF (CONSP LISP::ENTRY)
(XCL:UNBREAK-FUNCTION (FIRST LISP::ENTRY)
:IN
(SECOND LISP::ENTRY))
(XCL:UNBREAK-FUNCTION LISP::ENTRY))))
(COND
((NULL LISP::FNS)
(IL:FOR LISP::ENTRY IL:IN (REVERSE XCL::*TRACED-FNS*) IL:JOIN (
LISP::UNTRACE-ENTRY
LISP::ENTRY)
))
((EQUAL LISP::FNS '(T))
(WHEN XCL::*TRACED-FNS*
(LISP::UNTRACE-ENTRY (CAR XCL::*TRACED-FNS*))))
(T (IL:FOR LISP::FN IL:IN LISP::FNS IL:JOIN (IF (CONSP LISP::FN)
(XCL:UNBREAK-FUNCTION
(FIRST LISP::FN)
:IN
(THIRD LISP::FN))
(XCL:UNBREAK-FUNCTION
LISP::FN))))))))
)
(DEFUN XCL:TRACE-FUNCTION (XCL::FN-TO-TRACE &KEY ((:IN XCL::IN-FN))
XCL::REBREAK?)
(MULTIPLE-VALUE-BIND (XCL::EXECUTABLE-TO-TRACE XCL::NO-IN-FN)
(XCL::NAME-OF-EXECUTABLE XCL::FN-TO-TRACE)
(COND
((AND (CONSP XCL::FN-TO-TRACE)
(NOT XCL::EXECUTABLE-TO-TRACE))
(IL:FOR XCL::FN IL:IN XCL::FN-TO-TRACE IL:JOIN (XCL:TRACE-FUNCTION
XCL::FN :IN XCL::IN-FN)))
((AND (CONSP XCL::IN-FN)
(NOT (XCL::NAME-OF-EXECUTABLE XCL::IN-FN)))
(IL:FOR XCL::FN IL:IN XCL::IN-FN IL:JOIN (XCL:TRACE-FUNCTION
XCL::FN-TO-TRACE :IN
XCL::FN)))
(T
(IL:* IL:|;;| "General philosophy here: all external functions take the \"real\" names and not the names of the executables; the \"real\" names are the ones that are published on *TRACED-FNS* and the like.")
(IL:* IL:|;;| "One exception: the BROKEN property is placed on the name of the executable, since that is guaranteed to be a symbol")
(COND
((NULL (IL:GETD XCL::EXECUTABLE-TO-TRACE))
(ERROR 'XCL:UNDEFINED-FUNCTION :NAME XCL::FN-TO-TRACE)
NIL)
((IL:UNSAFE.TO.MODIFY XCL::FN-TO-TRACE "trace")
(FORMAT *ERROR-OUTPUT* "~S not traced.~%" XCL::FN-TO-TRACE)
NIL)
(T (XCL:UNBREAK-FUNCTION XCL::FN-TO-TRACE :IN XCL::IN-FN :NO-ERROR T)
(UNLESS XCL::REBREAK? (IL:* IL:\; "Save the breaking information for REBREAK, but don't save it if we're being called from REBREAK itself.")
(SETF (GETHASH (IF (NULL XCL::IN-FN)
XCL::FN-TO-TRACE
`(,XCL::FN-TO-TRACE :IN ,XCL::IN-FN))
XCL::*BREAK-HASH-TABLE*)
(LIST XCL::FN-TO-TRACE :IN XCL::IN-FN :TRACE? T :REBREAK? T)))
(IF (NULL XCL::IN-FN)
(LET ((XCL::ORIGINAL (LET ((*PRINT-CASE* :UPCASE))
(MAKE-SYMBOL (FORMAT NIL "Original ~A"
XCL::EXECUTABLE-TO-TRACE)))))
(IL:PUTD XCL::ORIGINAL (IL:GETD XCL::EXECUTABLE-TO-TRACE)
T)
(IL:PUTD XCL::EXECUTABLE-TO-TRACE (COMPILE NIL (
 CREATE-TRACED-DEFINITION
XCL::EXECUTABLE-TO-TRACE
NIL XCL::ORIGINAL))
T)
(SETF (GET XCL::EXECUTABLE-TO-TRACE 'IL:BROKEN)
XCL::ORIGINAL)
(PUSH XCL::FN-TO-TRACE IL:BROKENFNS)
(PUSH XCL::FN-TO-TRACE XCL::*TRACED-FNS*)
(SETQ XCL::*UNBROKEN-FNS* (DELETE XCL::FN-TO-TRACE XCL::*UNBROKEN-FNS*
:TEST 'EQUAL))
(LIST XCL::FN-TO-TRACE))
(IF XCL::NO-IN-FN
(ERROR "~S can't be selectively traced :IN ~S" XCL::FN-TO-TRACE
XCL::IN-FN)
(LET* ((XCL::EXECUTABLE-TO-TRACE-IN (XCL::NAME-OF-EXECUTABLE XCL::IN-FN
))
(XCL::MIDDLE-MAN (CONSTRUCT-MIDDLE-MAN XCL::EXECUTABLE-TO-TRACE
XCL::EXECUTABLE-TO-TRACE-IN)))
(IF (NOT (HAS-CALLS XCL::EXECUTABLE-TO-TRACE-IN
XCL::EXECUTABLE-TO-TRACE))
(ERROR "~S is not called from ~S." XCL::FN-TO-TRACE
XCL::IN-FN))
(COMPILE XCL::MIDDLE-MAN (CREATE-TRACED-DEFINITION
XCL::EXECUTABLE-TO-TRACE
XCL::EXECUTABLE-TO-TRACE-IN
XCL::EXECUTABLE-TO-TRACE))
(CHANGE-CALLS XCL::EXECUTABLE-TO-TRACE XCL::MIDDLE-MAN
XCL::EXECUTABLE-TO-TRACE-IN 'UNBREAK-FROM-RESTORE-CALLS)
(LET ((XCL::ENTRY (LIST XCL::FN-TO-TRACE XCL::IN-FN
XCL::MIDDLE-MAN)))
(PUSH XCL::ENTRY IL:BROKENFNS)
(PUSH XCL::ENTRY XCL::*TRACED-FNS*))
(SETQ XCL::*UNBROKEN-FNS* (DELETE `(,XCL::FN-TO-TRACE
:IN
,XCL::IN-FN)
XCL::*UNBROKEN-FNS* :TEST
'EQUAL))
(LIST `(,XCL::FN-TO-TRACE :IN ,XCL::IN-FN)))))))))))
(IL:* IL:|;;;| "Support for breaking.")
(DEFUN XCL:BREAK-FUNCTION (XCL::FN-TO-BREAK &KEY ((:IN XCL::IN-FN))
((:WHEN XCL::WHEN-EXPR)
T)
XCL::TRACE? XCL::REBREAK?)
(MULTIPLE-VALUE-BIND
(XCL::EXECUTABLE-TO-BREAK XCL::NO-IN-FN)
(XCL::NAME-OF-EXECUTABLE XCL::FN-TO-BREAK)
(COND
(XCL::TRACE? (XCL:TRACE-FUNCTION XCL::FN-TO-BREAK :IN XCL::IN-FN :REBREAK? XCL::REBREAK?))
((AND (CONSP XCL::FN-TO-BREAK)
(NOT XCL::EXECUTABLE-TO-BREAK))
(IL:FOR XCL::FN IL:IN XCL::FN-TO-BREAK
IL:JOIN (XCL:BREAK-FUNCTION XCL::FN :IN XCL::IN-FN :WHEN XCL::WHEN-EXPR :REBREAK?
XCL::REBREAK?)))
((AND (CONSP XCL::IN-FN)
(NOT (XCL::NAME-OF-EXECUTABLE XCL::IN-FN)))
(IL:FOR XCL::FN IL:IN XCL::IN-FN
IL:JOIN (XCL:BREAK-FUNCTION XCL::FN-TO-BREAK :IN XCL::FN :WHEN XCL::WHEN-EXPR
:REBREAK? XCL::REBREAK?)))
(T
(IF (IL:UNSAFE.TO.MODIFY XCL::FN-TO-BREAK "break")
(PROGN (FORMAT *ERROR-OUTPUT* "~S not broken." XCL::FN-TO-BREAK)
NIL)
(PROGN (UNLESS XCL::REBREAK? (IL:* IL:\; "Save the breaking information for REBREAK. Don't do it, though, if we're being called from REBREAK.")
(SETF (GETHASH (IF (NULL XCL::IN-FN)
XCL::FN-TO-BREAK
`(,XCL::FN-TO-BREAK :IN ,XCL::IN-FN))
XCL::*BREAK-HASH-TABLE*)
(LIST XCL::FN-TO-BREAK :IN XCL::IN-FN :WHEN XCL::WHEN-EXPR :REBREAK? T)))
(WHEN (EQ XCL::WHEN-EXPR :ONCE)
(SETQ XCL::WHEN-EXPR
`(FUNCALL ',(LET ((XCL::TRIGGERED-YET? NIL))
#'(LAMBDA NIL (IF XCL::TRIGGERED-YET?
NIL
(SETQ XCL::TRIGGERED-YET? T)))))))
(XCL:UNBREAK-FUNCTION XCL::FN-TO-BREAK :IN XCL::IN-FN :NO-ERROR T)
(IF (NULL XCL::IN-FN)
(LET* ((XCL::ORIGINAL-DEF (OR (IL:GETD XCL::EXECUTABLE-TO-BREAK)
(ERROR 'XCL:UNDEFINED-FUNCTION :NAME
XCL::FN-TO-BREAK)))
(XCL::ORIGINAL (LET ((*PRINT-CASE* :UPCASE))
(MAKE-SYMBOL (FORMAT NIL "Original ~A"
XCL::FN-TO-BREAK)))))
(IL:PUTD XCL::ORIGINAL XCL::ORIGINAL-DEF T)
(IL:PUTD XCL::EXECUTABLE-TO-BREAK (COMPILE NIL
(CREATE-BROKEN-DEFINITION
XCL::EXECUTABLE-TO-BREAK
XCL::EXECUTABLE-TO-BREAK
XCL::ORIGINAL XCL::WHEN-EXPR
XCL::EXECUTABLE-TO-BREAK))
T)
(SETF (GET XCL::EXECUTABLE-TO-BREAK 'IL:BROKEN)
XCL::ORIGINAL)
(PUSH XCL::FN-TO-BREAK IL:BROKENFNS)
(SETQ XCL::*UNBROKEN-FNS* (DELETE XCL::FN-TO-BREAK XCL::*UNBROKEN-FNS*
:TEST 'EQUAL))
(LIST XCL::FN-TO-BREAK))
(IF XCL::NO-IN-FN
(ERROR "~S can't be selectively broken :IN ~S" XCL::FN-TO-BREAK XCL::IN-FN
)
(LET* ((XCL::EXECUTABLE-TO-BREAK-IN (XCL::NAME-OF-EXECUTABLE XCL::IN-FN))
(XCL::MIDDLE-MAN (CONSTRUCT-MIDDLE-MAN XCL::EXECUTABLE-TO-BREAK
XCL::EXECUTABLE-TO-BREAK-IN)))
(IF (NOT (HAS-CALLS XCL::EXECUTABLE-TO-BREAK-IN
XCL::EXECUTABLE-TO-BREAK))
(IF (MACRO-FUNCTION XCL::FN-TO-BREAK)
(ERROR "Macros can't be selectively traced: sorry")
(ERROR "~S is not called from ~S." XCL::FN-TO-BREAK
XCL::IN-FN)))
(XCL:UNADVISE-FUNCTION XCL::FN-TO-BREAK :IN XCL::IN-FN :NO-ERROR T)
(COMPILE XCL::MIDDLE-MAN (CREATE-BROKEN-DEFINITION
XCL::EXECUTABLE-TO-BREAK XCL::MIDDLE-MAN
XCL::EXECUTABLE-TO-BREAK XCL::WHEN-EXPR
`(,XCL::EXECUTABLE-TO-BREAK :IN
,XCL::EXECUTABLE-TO-BREAK-IN)))
(CHANGE-CALLS XCL::EXECUTABLE-TO-BREAK XCL::MIDDLE-MAN
XCL::EXECUTABLE-TO-BREAK-IN 'UNBREAK-FROM-RESTORE-CALLS)
(PUSH (LIST XCL::FN-TO-BREAK XCL::IN-FN XCL::MIDDLE-MAN)
IL:BROKENFNS)
(SETQ XCL::*UNBROKEN-FNS* (DELETE `(,XCL::FN-TO-BREAK :IN
,XCL::IN-FN)
XCL::*UNBROKEN-FNS* :TEST
'EQUAL))
(LIST `(,XCL::FN-TO-BREAK :IN ,XCL::IN-FN)))))))))))
(DEFUN XCL:UNBREAK-FUNCTION (XCL::BROKEN-FN &KEY ((:IN XCL::IN-FN))
XCL::NO-ERROR)
(MULTIPLE-VALUE-BIND
(XCL::EXECUTABLE-TO-UNBREAK XCL::NO-IN-FN)
(XCL::NAME-OF-EXECUTABLE XCL::BROKEN-FN)
(COND
((AND (CONSP XCL::BROKEN-FN)
(NOT XCL::EXECUTABLE-TO-UNBREAK))
(IL:FOR XCL::FN IL:IN XCL::BROKEN-FN IL:JOIN (XCL:UNBREAK-FUNCTION XCL::FN
:IN XCL::IN-FN)))
((AND (CONSP XCL::IN-FN)
(NOT (XCL::NAME-OF-EXECUTABLE XCL::IN-FN)))
(IL:FOR XCL::FN IL:IN XCL::IN-FN IL:JOIN (XCL:UNBREAK-FUNCTION XCL::BROKEN-FN
:IN XCL::FN)))
(T (IF (NULL XCL::IN-FN)
(LET ((XCL::ORIGINAL (GET XCL::EXECUTABLE-TO-UNBREAK 'IL:BROKEN)))
(COND
((NULL XCL::ORIGINAL)
(UNLESS XCL::NO-ERROR (FORMAT *ERROR-OUTPUT* "~S is not broken.~%"
XCL::BROKEN-FN))
NIL)
(T (IL:PUTD XCL::EXECUTABLE-TO-UNBREAK (IL:GETD XCL::ORIGINAL)
T)
(REMPROP XCL::EXECUTABLE-TO-UNBREAK 'IL:BROKEN)
(SETQ IL:BROKENFNS (DELETE XCL::BROKEN-FN IL:BROKENFNS :TEST 'EQUAL))
(SETQ XCL::*TRACED-FNS* (DELETE XCL::BROKEN-FN XCL::*TRACED-FNS* :TEST
'EQUAL))
(PUSH XCL::BROKEN-FN XCL::*UNBROKEN-FNS*)
(LIST XCL::BROKEN-FN))))
(IF XCL::NO-IN-FN
(ERROR "~s can't be selectively unbroken :IN ~s" XCL::BROKEN-FN XCL::IN-FN)
(LET* ((XCL::EXECUTABLE-TO-UNBREAK-IN (XCL::NAME-OF-EXECUTABLE XCL::IN-FN))
(XCL::ENTRY (FIND-IF #'(LAMBDA (XCL::ENTRY)
(AND (CONSP XCL::ENTRY)
(EQUAL (FIRST XCL::ENTRY)
XCL::BROKEN-FN)
(EQUAL (SECOND XCL::ENTRY)
XCL::IN-FN)))
IL:BROKENFNS))
(XCL::MIDDLE-MAN (THIRD XCL::ENTRY)))
(COND
((NULL XCL::ENTRY)
(UNLESS XCL::NO-ERROR (FORMAT *ERROR-OUTPUT* "~S :IN ~S is not broken.~%"
XCL::BROKEN-FN XCL::IN-FN))
NIL)
(T (CHANGE-CALLS XCL::MIDDLE-MAN XCL::EXECUTABLE-TO-UNBREAK
XCL::EXECUTABLE-TO-UNBREAK-IN)
(FINISH-UNBREAKING XCL::EXECUTABLE-TO-UNBREAK
XCL::EXECUTABLE-TO-UNBREAK-IN XCL::MIDDLE-MAN XCL::ENTRY)
(LIST `(,XCL::BROKEN-FN :IN ,XCL::IN-FN)))))))))))
(DEFUN XCL:REBREAK-FUNCTION (XCL::FN-TO-REBREAK &KEY ((:IN XCL::IN-FN)))
(COND
((CONSP XCL::FN-TO-REBREAK)
(IL:FOR XCL::FN IL:IN XCL::FN-TO-REBREAK IL:JOIN (XCL:REBREAK-FUNCTION XCL::FN
:IN XCL::IN-FN)))
((CONSP XCL::IN-FN)
(IL:FOR XCL::FN IL:IN XCL::IN-FN IL:JOIN (XCL:REBREAK-FUNCTION
XCL::FN-TO-REBREAK :IN XCL::FN)))
(T (LET* ((XCL::NAME (IF (NULL XCL::IN-FN)
XCL::FN-TO-REBREAK
`(,XCL::FN-TO-REBREAK :IN ,XCL::IN-FN)))
(XCL::INFO (GETHASH XCL::NAME XCL::*BREAK-HASH-TABLE*)))
(COND
((NULL XCL::INFO)
(FORMAT *ERROR-OUTPUT* "~S has never been broken.~%" XCL::NAME)
NIL)
(T (APPLY 'XCL:BREAK-FUNCTION XCL::INFO)))))))
(DEFUN CREATE-BROKEN-DEFINITION (WRAPPED-FN-NAME BROKEN-FN-NAME FN-TO-CALL WHEN-EXPR
BREAKPOINT-NAME)
(IL:* IL:|;;;|
"WRAPPED-FN-NAME must be the symbol naming the function that will break when it is called.")
(IL:* IL:|;;;| "BROKEN-FN-NAME is the symbol in whose function cell our lambda-form will be put.")
(IL:* IL:|;;;| "FN-TO-CALL is the function-object to be FUNCALL'ed when we want to call the unbroken version of the wrapped function.")
(IL:* IL:|;;;| "BREAKPOINT-NAME is the value the debugger will use for BRKFN.")
(IL:* IL:|;;;|
"We return a lambda-form suitable for being called in order to (possibly) activate the breakpoint.")
(MULTIPLE-VALUE-BIND
(LAMBDA-CAR ARG-LIST CALLING-FORM)
(FUNCTION-WRAPPER-INFO WRAPPED-FN-NAME FN-TO-CALL)
`(,LAMBDA-CAR ,(IF (EQ LAMBDA-CAR 'LAMBDA)
'(&REST XCL:ARGLIST)
ARG-LIST)
,@(AND ARG-LIST (MEMBER LAMBDA-CAR '(IL:LAMBDA IL:NLAMBDA))
`((DECLARE (SPECIAL ,@(IF (SYMBOLP ARG-LIST)
(LIST ARG-LIST)
ARG-LIST)))))
(IL:\\CALLME '(:BROKEN ,BREAKPOINT-NAME))
(IF ,WHEN-EXPR
(LET (($POS$ (IL:STKNTH -1)))
(UNWIND-PROTECT
(XCL:DEBUGGER :FORM `(FUNCALL ',#'(LAMBDA NIL ,CALLING-FORM))
:ENVIRONMENT NIL :STACK-POSITION $POS$ :CONDITION
',(XCL:MAKE-CONDITION 'BREAKPOINT :FUNCTION BREAKPOINT-NAME))
(IL:RELSTK $POS$)))
,CALLING-FORM))))
(DEFUN UNBREAK-FROM-RESTORE-CALLS (FROM TO FN)
(IL:* IL:|;;;| "Somebody has restored all of the changed calls in FN, including one we made, changing calls to FROM into calls to TO. This came about from breaking (FROM :IN FN), where TO was the middle-man. Undo that breaking.")
(LET ((ENTRY (FIND-IF #'(LAMBDA (ENTRY)
(AND (CONSP ENTRY)
(EQ (FIRST ENTRY)
FROM)
(EQ (SECOND ENTRY)
FN)))
IL:BROKENFNS)))
(ASSERT (EQ TO (THIRD ENTRY))
NIL "BUG: Inconsistency in SI::UNBREAK-FROM-RESTORE-CALLS")
(FINISH-UNBREAKING FROM FN TO ENTRY)
(FORMAT *TERMINAL-IO* "(~S :IN ~S) unbroken.~%" FROM FN)))
(DEFUN FINISH-UNBREAKING (BROKEN-FN IN-FN MIDDLE-MAN ENTRY)
(SETQ IL:BROKENFNS (DELETE ENTRY IL:BROKENFNS))
(SETQ XCL::*TRACED-FNS* (DELETE ENTRY XCL::*TRACED-FNS*))
(PUSH `(,BROKEN-FN :IN ,IN-FN)
XCL::*UNBROKEN-FNS*))
(DEFVAR IL:BROKENFNS NIL)
(DEFVAR XCL::*BREAK-HASH-TABLE* (MAKE-HASH-TABLE :TEST 'EQUAL))
(DEFVAR XCL::*UNBROKEN-FNS* NIL)
(IL:PUTPROPS IL:BROKEN IL:PROPTYPE IGNORE)
(IL:* IL:|;;| "The old Interlisp interface to breaking.")
(IL:DEFINEQ
(IL:BREAK
(IL:NLAMBDA IL:X (IL:* IL:\;
 "Edited 13-Apr-87 13:51 by Pavel")
(IL:FOR IL:X IL:IN (IL:NLAMBDA.ARGS IL:X)
IL:JOIN (IL:IF (OR (IL:LITATOM IL:X)
(IL:STRING.EQUAL (CADR IL:X)
"IN"))
IL:THEN (IL:BREAK0 IL:X T)
IL:ELSE (IL:APPLY 'IL:BREAK0 IL:X)))))
(IL:BREAK0
(IL:LAMBDA (IL:FN IL:WHEN IL:COMS IL:BRKFN) (IL:* IL:\;
 "Edited 18-Apr-87 18:56 by Pavel")
(WHEN IL:COMS (CERROR "Ignore COMS" "Break 'commands' ~S no longer supported." IL:COMS))
(WHEN (AND IL:BRKFN (IL:NEQ IL:BRKFN 'IL:BREAK1))
(CERROR "Ignore BRKFN" "Unexpected BRKFN passed to BREAK0: ~S" IL:BRKFN))
(WHEN (NULL IL:WHEN)
(IL:SETQ IL:WHEN T))
(COND
((IL:LISTP IL:FN)
(COND
((IL:STRING.EQUAL (SECOND IL:FN)
"IN")
(XCL:BREAK-FUNCTION (FIRST IL:FN)
:IN
(THIRD IL:FN)
:WHEN IL:WHEN))
(T (IL:FOR IL:X IL:IN IL:FN IL:JOIN (IL:BREAK0 IL:X IL:WHEN)))))
(T (XCL:BREAK-FUNCTION IL:FN :WHEN IL:WHEN)))))
(IL:REBREAK
(IL:NLAMBDA IL:FNS (IL:* IL:\;
 "Edited 3-Apr-87 12:07 by Pavel")
(IL:SETQ IL:FNS (IL:NLAMBDA.ARGS IL:FNS))
(FLET ((IL:REBREAK-FN (IL:FN)
(IL:IF (IL:LISTP IL:FN)
IL:THEN (XCL:REBREAK-FUNCTION (FIRST IL:FN)
:IN
(THIRD IL:FN))
IL:ELSE (XCL:REBREAK-FUNCTION IL:FN))))
(COND
((NULL IL:FNS)
(IL:FOR IL:FN IL:IN XCL::*UNBROKEN-FNS* IL:JOIN (IL:REBREAK-FN IL:FN)))
((IL:EQUAL IL:FNS '(T))
(AND (NOT (NULL XCL::*UNBROKEN-FNS*))
(IL:REBREAK-FN (CAR XCL::*UNBROKEN-FNS*))))
(T (IL:FOR IL:FN IL:IN IL:FNS IL:JOIN (IL:REBREAK-FN IL:FN)))))))
(XCL:UNBREAK
(IL:NLAMBDA XCL::FNS (IL:* IL:\;
 "Edited 2-Apr-87 16:39 by Pavel")
(SETQ XCL::FNS (IL:NLAMBDA.ARGS XCL::FNS))
(FLET ((XCL::UNBREAK-ENTRY (XCL::ENTRY)
(IF (CONSP XCL::ENTRY)
(XCL:UNBREAK-FUNCTION (FIRST XCL::ENTRY)
:IN
(SECOND XCL::ENTRY))
(XCL:UNBREAK-FUNCTION XCL::ENTRY))))
(COND
((NULL XCL::FNS)
(IL:FOR XCL::ENTRY IL:IN (REVERSE IL:BROKENFNS) IL:JOIN (XCL::UNBREAK-ENTRY
XCL::ENTRY)))
((EQUAL XCL::FNS '(T))
(WHEN IL:BROKENFNS
(XCL::UNBREAK-ENTRY (CAR IL:BROKENFNS))))
(T (IL:FOR XCL::FN IL:IN XCL::FNS IL:JOIN (IF (CONSP XCL::FN)
(XCL:UNBREAK-FUNCTION
(FIRST XCL::FN)
:IN
(THIRD XCL::FN))
(XCL:UNBREAK-FUNCTION
XCL::FN))))))))
(IL:UNBREAK0
(IL:LAMBDA (IL:FN) (IL:* IL:\;
 "Edited 1-Apr-87 22:12 by Pavel")
(IL:IF (IL:LISTP IL:FN)
IL:THEN (XCL:UNBREAK-FUNCTION (CAR IL:FN)
:IN
(CADDR IL:FN))
IL:ELSE (XCL:UNBREAK-FUNCTION IL:FN))))
)
(IL:DEFINEQ
(IL:BREAK1
(IL:NLAMBDA (IL:BRKEXP IL:BRKWHEN IL:BRKFN IL:BRKCOMS IL:BRKTYPE XCL:CONDITION)
(IL:* IL:\;
 "Edited 24-Mar-87 16:07 by amd")
(IL:|if| (EVAL IL:BRKWHEN)
IL:|then|
(IL:* IL:|;;|
 "should probably default CONDITION depending on BRKTYPE to interrupt, breakpoint error, etc.")
(WHEN IL:BRKCOMS (IL:PRINTOUT T "BRKCOMS no longer supported:" IL:BRKCOMS T))
(LET ((IL:POS (IL:STKNTH 0 IL:BRKFN)))
(UNWIND-PROTECT
(XCL:DEBUGGER :FORM IL:BRKEXP :ENVIRONMENT NIL :STACK-POSITION IL:POS
:CONDITION (OR XCL:CONDITION (XCL:MAKE-CONDITION 'BREAKPOINT :FUNCTION
IL:BRKFN)))
(IL:RELSTK IL:POS)))
IL:|else| (EVAL IL:BRKEXP))))
)
(XCL:DEFINE-SPECIAL-FORM IL:BREAK1 (&OPTIONAL IL:EXP IL:WHEN IL:FN IL:COMS TYPE XCL:CONDITION
&ENVIRONMENT IL:ENV)
(IL:IF (EVAL IL:WHEN IL:ENV)
IL:THEN (WHEN IL:COMS (IL:PRINTOUT T "BRKCOMS no longer supported:" IL:COMS T))
(LET ((IL:POS (IL:STKNTH 0 IL:FN)))
(UNWIND-PROTECT
(XCL:DEBUGGER :FORM IL:EXP :ENVIRONMENT IL:ENV :STACK-POSITION IL:POS
:CONDITION (OR XCL:CONDITION (XCL:MAKE-CONDITION 'BREAKPOINT :FUNCTION
IL:FN)))
(IL:RELSTK IL:POS)))
IL:ELSE (EVAL IL:EXP IL:ENV)))
(XCL:DEFOPTIMIZER IL:BREAK1 (&OPTIONAL IL:EXP IL:WHEN IL:FN IL:COMS TYPE XCL:CONDITION)
(WHEN IL:COMS (IL:PRINTOUT T "BRKCOMS no longer supported:" IL:COMS T
))
`(FLET
(($BRKEXP$ NIL ,IL:EXP))
(IL:IF ,IL:WHEN
IL:THEN
(LET
(($POS$ (IL:STKNTH 0 ',IL:FN)))
(UNWIND-PROTECT
(XCL:DEBUGGER
:FORM
`(FUNCALL ',#'$BRKEXP$)
:ENVIRONMENT NIL :STACK-POSITION $POS$ :CONDITION
,(OR XCL:CONDITION
`(IL:LOADTIMECONSTANT (XCL:MAKE-CONDITION
'BREAKPOINT :FUNCTION
',IL:FN))))
(IL:RELSTK $POS$)))
IL:ELSE ($BRKEXP$))))
(IL:* IL:|;;| "Arrange for the proper compiler and package")
(IL:PUTPROPS IL:BREAK-AND-TRACE IL:FILETYPE :COMPILE-FILE)
(IL:PUTPROPS IL:BREAK-AND-TRACE IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "SYSTEM"))
(IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS
(IL:ADDTOVAR IL:NLAMA )
(IL:ADDTOVAR IL:NLAML IL:BREAK1)
(IL:ADDTOVAR IL:LAMA )
)
(IL:PRETTYCOMPRINT IL:BREAK-AND-TRACECOMS)
(IL:RPAQQ IL:BREAK-AND-TRACECOMS
(
(IL:* IL:|;;;| "Support for tracing.")
(IL:VARIABLES XCL:*TRACE-DEPTH* XCL::*TRACED-FNS* IL:TRACEREGION)
(IL:FUNCTIONS XCL:CREATE-TRACE-WINDOW)
(IL:FUNCTIONS CREATE-TRACED-DEFINITION CONSTRUCT-ENTRY-PRINTING-CODE
PRINT-TRACE-ENTRY-INFO PRINT-TRACE-EXIT-INFO PRINT-TRACED-ARGUMENT
PRINT-TRACED-CL-ARGLIST)
(IL:VARIABLES XCL:*TRACE-LEVEL* XCL:*TRACE-LENGTH* XCL:*TRACE-VERBOSE* *TRACE-OUTPUT*)
(IL:FNS TRACE UNTRACE)
(IL:FUNCTIONS XCL:TRACE-FUNCTION)
(IL:* IL:|;;;| "Support for breaking.")
(IL:FUNCTIONS XCL:BREAK-FUNCTION XCL:UNBREAK-FUNCTION XCL:REBREAK-FUNCTION
CREATE-BROKEN-DEFINITION UNBREAK-FROM-RESTORE-CALLS FINISH-UNBREAKING)
(IL:VARIABLES IL:BROKENFNS XCL::*BREAK-HASH-TABLE* XCL::*UNBROKEN-FNS*)
(IL:PROP IL:PROPTYPE IL:BROKEN)
(IL:* IL:|;;| "The old Interlisp interface to breaking.")
(IL:FNS IL:BREAK IL:BREAK0 IL:REBREAK XCL:UNBREAK IL:UNBREAK0)
(IL:FNS IL:BREAK1)
(IL:SPECIAL-FORMS IL:BREAK1)
(XCL:OPTIMIZERS IL:BREAK1)
(IL:* IL:|;;| "Arrange for the proper compiler and package")
(IL:PROP (IL:FILETYPE IL:MAKEFILE-ENVIRONMENT)
IL:BREAK-AND-TRACE)
(IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS
(IL:ADDVARS (IL:NLAMA XCL:UNBREAK IL:REBREAK IL:BREAK UNTRACE TRACE)
(IL:NLAML IL:BREAK1)
(IL:LAMA)))))
(IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS
(IL:ADDTOVAR IL:NLAMA XCL:UNBREAK IL:REBREAK IL:BREAK UNTRACE TRACE)
(IL:ADDTOVAR IL:NLAML IL:BREAK1)
(IL:ADDTOVAR IL:LAMA )
)
(IL:PUTPROPS IL:BREAK-AND-TRACE IL:COPYRIGHT ("Venue & Xerox Corporation" 1987 1988 1990 1991 1992
1993))
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL (16480 19023 (TRACE 16493 . 17332) (UNTRACE 17334 . 19021)) (38743 43068 (IL:BREAK
38756 . 39284) (IL:BREAK0 39286 . 40173) (IL:REBREAK 40175 . 41120) (XCL:UNBREAK 41122 . 42655) (
IL:UNBREAK0 42657 . 43066)) (43069 44089 (IL:BREAK1 43082 . 44087)))))
IL:STOP

BIN
CLTL2/BREAK-AND-TRACE.DFASL Normal file

Binary file not shown.

5679
CLTL2/BYTECOMPILER Normal file

File diff suppressed because it is too large Load Diff

BIN
CLTL2/BYTECOMPILER.LCOM Normal file

Binary file not shown.

1053
CLTL2/CL-ERROR Normal file

File diff suppressed because it is too large Load Diff

BIN
CLTL2/CL-ERROR.DFASL Normal file

Binary file not shown.

1313
CLTL2/CLSTREAMS Normal file

File diff suppressed because it is too large Load Diff

BIN
CLTL2/CLSTREAMS.LCOM Normal file

Binary file not shown.

944
CLTL2/CMLARITH Normal file

File diff suppressed because one or more lines are too long

92
CLTL2/CMLARITH.LCOM Normal file

File diff suppressed because one or more lines are too long

2434
CLTL2/CMLARRAY Normal file

File diff suppressed because it is too large Load Diff

727
CLTL2/CMLARRAY-SUPPORT Normal file
View File

@@ -0,0 +1,727 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10)
(FILECREATED "18-Oct-93 10:31:44" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLARRAY-SUPPORT.;2" 32489
|previous| |date:| "12-Oct-93 16:33:46"
"{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLARRAY-SUPPORT.;1")
; Copyright (c) 1986, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
(PRETTYCOMPRINT CMLARRAY-SUPPORTCOMS)
(RPAQQ CMLARRAY-SUPPORTCOMS
(
(* |;;| "Record def's")
(RECORDS ARRAY-HEADER GENERAL-ARRAY ONED-ARRAY TWOD-ARRAY)
(* |;;| "Cmlarray support macros and functions")
(* \; "Fast predicates")
(FUNCTIONS %ARRAYP %SIMPLE-ARRAY-P %SIMPLE-STRING-P %STRINGP %VECTORP)
(FUNCTIONS %CHECK-CIRCLE-PRINT %CHECK-INDICES %CHECK-NOT-WRITEABLE %EXPAND-BIT-OP
%GENERAL-ARRAY-ADJUST-BASE %GET-ARRAY-OFFSET %GET-BASE-ARRAY)
(FUNCTIONS %BIT-TYPE-P %CHAR-TYPE-P %CML-TYPE-TO-TYPENUMBER-EXPANDER %FAT-CHAR-TYPE-P
%FAT-STRING-CHAR-P %GET-TYPE-TABLE-ENTRY %LIT-SIZE-TO-SIZE %LIT-TYPE-TO-TYPE
%LLARRAY-MAKE-ACCESSOR-EXPR %LLARRAY-MAKE-SETTOR-EXPR %LLARRAY-TYPED-GET
%LLARRAY-TYPED-PUT %LLARRAY-TYPEP %MAKE-ARRAY-TYPE-TABLE %MAKE-CML-TYPE-TABLE
%PACK-TYPENUMBER %SMALLFIXP-SMALLPOSP %SMALLPOSP-SMALLFIXP %THIN-CHAR-TYPE-P
%THIN-STRING-CHAR-P %TYPE-SIZE-TO-TYPENUMBER %TYPENUMBER-TO-BITS-PER-ELEMENT
%TYPENUMBER-TO-CML-TYPE %TYPENUMBER-TO-DEFAULT-VALUE %TYPENUMBER-TO-GC-TYPE
%TYPENUMBER-TO-SIZE %TYPENUMBER-TO-TYPE \\GETBASESMALL-FIXP \\GETBASESTRING-CHAR
\\GETBASETHINSTRING-CHAR \\PUTBASESMALL-FIXP \\PUTBASESTRING-CHAR
\\PUTBASETHINSTRING-CHAR)
(* |;;;| "Describes each entry of \\ARRAY-TYPE-TABLE")
(STRUCTURES ARRAY-TABLE-ENTRY)
(* |;;;| "These vars contain all the necessary info for typed arrays")
(VARIABLES %LIT-ARRAY-SIZES %LIT-ARRAY-TABLE %LIT-ARRAY-TYPES)
(* |;;;| "Tables that drives various macros")
(VARIABLES %ARRAY-TYPE-TABLE %CANONICAL-CML-TYPES)
(* |;;;| "Constants for (SIGNED-BYTE 16)")
(VARIABLES MAX.SMALLFIXP MIN.SMALLFIXP)
(* |;;;| "Constants for STRING-CHARS")
(VARIABLES %CHAR-TYPE %BIT-TYPE %THIN-CHAR-TYPENUMBER %FAT-CHAR-TYPENUMBER %MAXTHINCHAR)
(* |;;;| "Array data-type numbers")
(VARIABLES %GENERAL-ARRAY %ONED-ARRAY %TWOD-ARRAY)
(* |;;;| "Compiler options")
(DECLARE\: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (LOCALVARS . T))
(PROP FILETYPE CMLARRAY-SUPPORT)))
(* |;;| "Record def's")
(DECLARE\: EVAL@COMPILE
(BLOCKRECORD ARRAY-HEADER (
(* |;;;| "Describes common slots of all array headers")
(NIL BITS 4) (* \; "First 8 bits are unused")
(BASE POINTER) (* \;
 "24 bits of pointer. Points at raw storage or, in the indirect case, at another array header")
(* \; "8 bits of flags")
(READ-ONLY-P FLAG) (* \;
 "Used for headers pointing at symbols pnames")
(INDIRECT-P FLAG) (* \;
 "Points at an array header rather than a raw storage block")
(BIT-P FLAG) (* \; "Is a bit array")
(STRING-P FLAG) (* \;
 "Is a string (implies is a vector)")
(* \;
 "If any of the following flags are set, the array in non-simple")
(ADJUSTABLE-P FLAG)
(DISPLACED-P FLAG)
(FILL-POINTER-P FLAG)
(EXTENDABLE-P FLAG)
(TYPE-NUMBER BITS 8) (* \; "8 bits of type + size")
(OFFSET WORD) (* \; "For oned and general arrays")
(FILL-POINTER FIXP) (* \; "For oned and general arrays")
(TOTAL-SIZE FIXP))
(BLOCKRECORD ARRAY-HEADER ((NIL POINTER)
(FLAGS BITS 8)
(TYPE BITS 4)
(SIZE BITS 4)))
(ACCESSFNS (SIMPLE-P (EQ 0 (LOGAND (|fetch| (ARRAY-HEADER FLAGS)
|of| DATUM)
15))))
(SYSTEM))
(DATATYPE GENERAL-ARRAY ((NIL BITS 4) (* \; "For alignment")
(STORAGE POINTER) (* \; "24 bits of pointer")
(READ-ONLY-P FLAG) (* \; "8 bits of flags")
(INDIRECT-P FLAG)
(BIT-P FLAG)
(STRING-P FLAG)
(ADJUSTABLE-P FLAG)
(DISPLACED-P FLAG)
(FILL-POINTER-P FLAG)
(EXTENDABLE-P FLAG)
(TYPE-NUMBER BITS 8) (* \; "8 bits of typenumber")
(OFFSET WORD)
(FILL-POINTER FIXP) (* \;
 "As of 2.1, these 2 fields are fixp's.")
(TOTAL-SIZE FIXP)
(DIMS POINTER)))
(DATATYPE ONED-ARRAY ((NIL BITS 4) (* \; "Don't use high 8 bits")
(BASE POINTER) (* \; "The raw storage base")
(READ-ONLY-P FLAG) (* \; "8 bits worth of flags")
(NIL BITS 1) (* \;
 "Oned array's cann't be indirect")
(BIT-P FLAG)
(STRING-P FLAG)
(NIL BITS 1) (* \;
 "Oned-array's cann't be adjustable")
(DISPLACED-P FLAG)
(FILL-POINTER-P FLAG)
(EXTENDABLE-P FLAG)
(TYPE-NUMBER BITS 8) (* \;
 "4 bits of type and 4 bits of size")
(OFFSET WORD) (* \; "For displaced arrays")
(FILL-POINTER FIXP) (* \; "For filled arrays")
(TOTAL-SIZE FIXP) (* \; "Total number of elements")
))
(DATATYPE TWOD-ARRAY ((NIL BITS 4) (* \; "For alignmnet")
(BASE POINTER) (* \; "Raw storage pointer")
(READ-ONLY-P FLAG) (* \; "8 bits of flags")
(NIL BITS 1) (* \; "Twod arrays cann't be indirect")
(BIT-P FLAG)
(NIL BITS 4) (* \;
 "Twod arrays cann't be strings, nor can they be adjustable, displaced, or have fill pointers")
(EXTENDABLE-P FLAG)
(TYPE-NUMBER BITS 8)
(BOUND0 FIXP) (* \; "Zero dimension bound")
(BOUND1 FIXP) (* \; "One dimension bound")
(TOTAL-SIZE FIXP)))
)
(/DECLAREDATATYPE 'GENERAL-ARRAY '((BITS 4)
POINTER FLAG FLAG FLAG FLAG FLAG FLAG FLAG FLAG (BITS 8)
WORD FIXP FIXP POINTER)
'((GENERAL-ARRAY 0 (BITS . 3))
(GENERAL-ARRAY 0 POINTER)
(GENERAL-ARRAY 2 (FLAGBITS . 0))
(GENERAL-ARRAY 2 (FLAGBITS . 16))
(GENERAL-ARRAY 2 (FLAGBITS . 32))
(GENERAL-ARRAY 2 (FLAGBITS . 48))
(GENERAL-ARRAY 2 (FLAGBITS . 64))
(GENERAL-ARRAY 2 (FLAGBITS . 80))
(GENERAL-ARRAY 2 (FLAGBITS . 96))
(GENERAL-ARRAY 2 (FLAGBITS . 112))
(GENERAL-ARRAY 2 (BITS . 135))
(GENERAL-ARRAY 3 (BITS . 15))
(GENERAL-ARRAY 4 FIXP)
(GENERAL-ARRAY 6 FIXP)
(GENERAL-ARRAY 8 POINTER))
'10)
(/DECLAREDATATYPE 'ONED-ARRAY '((BITS 4)
POINTER FLAG (BITS 1)
FLAG FLAG (BITS 1)
FLAG FLAG FLAG (BITS 8)
WORD FIXP FIXP)
'((ONED-ARRAY 0 (BITS . 3))
(ONED-ARRAY 0 POINTER)
(ONED-ARRAY 2 (FLAGBITS . 0))
(ONED-ARRAY 2 (BITS . 16))
(ONED-ARRAY 2 (FLAGBITS . 32))
(ONED-ARRAY 2 (FLAGBITS . 48))
(ONED-ARRAY 2 (BITS . 64))
(ONED-ARRAY 2 (FLAGBITS . 80))
(ONED-ARRAY 2 (FLAGBITS . 96))
(ONED-ARRAY 2 (FLAGBITS . 112))
(ONED-ARRAY 2 (BITS . 135))
(ONED-ARRAY 3 (BITS . 15))
(ONED-ARRAY 4 FIXP)
(ONED-ARRAY 6 FIXP))
'8)
(/DECLAREDATATYPE 'TWOD-ARRAY '((BITS 4)
POINTER FLAG (BITS 1)
FLAG
(BITS 4)
FLAG
(BITS 8)
FIXP FIXP FIXP)
'((TWOD-ARRAY 0 (BITS . 3))
(TWOD-ARRAY 0 POINTER)
(TWOD-ARRAY 2 (FLAGBITS . 0))
(TWOD-ARRAY 2 (BITS . 16))
(TWOD-ARRAY 2 (FLAGBITS . 32))
(TWOD-ARRAY 2 (BITS . 51))
(TWOD-ARRAY 2 (FLAGBITS . 112))
(TWOD-ARRAY 2 (BITS . 135))
(TWOD-ARRAY 3 FIXP)
(TWOD-ARRAY 5 FIXP)
(TWOD-ARRAY 7 FIXP))
'10)
(* |;;| "Cmlarray support macros and functions")
(* \; "Fast predicates")
(DEFMACRO %ARRAYP (ARRAY)
(LISP:IF (LISP:SYMBOLP ARRAY)
`(OR (%ONED-ARRAY-P ,ARRAY)
(%TWOD-ARRAY-P ,ARRAY)
(%GENERAL-ARRAY-P ,ARRAY))
(LET ((SYM (GENSYM)))
`(LET ((,SYM ,ARRAY))
(OR (%ONED-ARRAY-P ,SYM)
(%TWOD-ARRAY-P ,SYM)
(%GENERAL-ARRAY-P ,SYM))))))
(DEFMACRO %SIMPLE-ARRAY-P (ARRAY)
(LISP:IF (LISP:SYMBOLP ARRAY)
`(AND (%ARRAYP ,ARRAY)
(|fetch| (ARRAY-HEADER SIMPLE-P) |of| ,ARRAY))
(LET ((SYM (GENSYM)))
`(LET ((,SYM ,ARRAY))
(AND (%ARRAYP ,SYM)
(|fetch| (ARRAY-HEADER SIMPLE-P) |of| ,SYM))))))
(DEFMACRO %SIMPLE-STRING-P (STRING)
(LISP:IF (LISP:SYMBOLP STRING)
`(AND (%ONED-ARRAY-P ,STRING)
(|fetch| (ARRAY-HEADER SIMPLE-P) |of| ,STRING)
(|fetch| (ARRAY-HEADER STRING-P) |of| ,STRING))
(LET ((SYM (GENSYM)))
`(LET ((,SYM ,STRING))
(AND (%ONED-ARRAY-P ,SYM)
(|fetch| (ARRAY-HEADER SIMPLE-P) |of| ,SYM)
(|fetch| (ARRAY-HEADER STRING-P) |of| ,SYM))))))
(DEFMACRO %STRINGP (STRING)
(LISP:IF (LISP:SYMBOLP STRING)
`(AND (OR (%ONED-ARRAY-P ,STRING)
(%GENERAL-ARRAY-P ,STRING))
(|fetch| (ARRAY-HEADER STRING-P) |of| ,STRING))
(LET ((SYM (GENSYM)))
`(LET ((,SYM ,STRING))
(AND (OR (%ONED-ARRAY-P ,SYM)
(%GENERAL-ARRAY-P ,SYM))
(|fetch| (ARRAY-HEADER STRING-P) |of| ,SYM))))))
(DEFMACRO %VECTORP (VECTOR)
(LISP:IF (LISP:SYMBOLP VECTOR)
`(OR (%ONED-ARRAY-P ,VECTOR)
(AND (%GENERAL-ARRAY-P ,VECTOR)
(EQL 1 (LENGTH (|ffetch| (GENERAL-ARRAY DIMS) |of| ,VECTOR)))))
(LET ((SYM (GENSYM)))
`(LET ((,SYM ,VECTOR))
(OR (%ONED-ARRAY-P ,SYM)
(AND (%GENERAL-ARRAY-P ,SYM)
(EQL 1 (LENGTH (|ffetch| (GENERAL-ARRAY DIMS) |of| ,SYM)))))))))
(DEFMACRO %CHECK-CIRCLE-PRINT (OBJECT STREAM &REST PRINT-FORMS)
(* |;;| "If A has a circle label, print it. If it's not the first time or it has no label, print the contents")
`(LET (CIRCLELABEL FIRSTTIME)
(AND *PRINT-CIRCLE-HASHTABLE* (LISP:MULTIPLE-VALUE-SETQ (CIRCLELABEL FIRSTTIME)
(PRINT-CIRCLE-LOOKUP ,OBJECT)))
(LISP:WHEN CIRCLELABEL
(.SPACECHECK. ,STREAM (VECTOR-LENGTH CIRCLELABEL))
(LET (*PRINT-CIRCLE-HASHTABLE*)
(DECLARE (LISP:SPECIAL *PRINT-CIRCLE-HASHTABLE*))
(* \;
 "No need to print-circle this string (dangerous if we do, in fact)")
(LISP:WRITE-STRING CIRCLELABEL ,STREAM))
(LISP:WHEN FIRSTTIME
(.SPACECHECK. ,STREAM 1)
(LISP:WRITE-CHAR #\Space ,STREAM)))
(LISP:WHEN (OR (NOT CIRCLELABEL)
FIRSTTIME)
,@PRINT-FORMS)))
(DEFMACRO %CHECK-INDICES (ARRAY START-ARG ARGS)
`(LISP:DO ((I ,START-ARG (LISP:1+ I))
(DIM 0 (LISP:1+ DIM))
INDEX)
((> I ,ARGS)
T)
(SETQ INDEX (ARG ,ARGS I))
(LISP:IF (OR (< INDEX 0)
(>= INDEX (LISP:ARRAY-DIMENSION ,ARRAY DIM)))
(RETURN NIL))))
(DEFMACRO %CHECK-NOT-WRITEABLE (ARRAY TYPE-NUMBER NEWVALUE)
`(COND
((|fetch| (ARRAY-HEADER READ-ONLY-P) |of| ,ARRAY)
(%MAKE-ARRAY-WRITEABLE ,ARRAY))
((AND (%THIN-CHAR-TYPE-P ,TYPE-NUMBER)
(%FAT-STRING-CHAR-P ,NEWVALUE))
(%MAKE-STRING-ARRAY-FAT ,ARRAY))))
(DEFMACRO %EXPAND-BIT-OP (OP BIT-ARRAY1 BIT-ARRAY2 RESULT-BIT-ARRAY)
`(PROGN (LISP:IF (NOT (BIT-ARRAY-P ,BIT-ARRAY1))
(LISP:ERROR "BIT-ARRAY1 not a bit array: ~S" ,BIT-ARRAY1))
(LISP:IF (NOT (BIT-ARRAY-P ,BIT-ARRAY2))
(LISP:ERROR "BIT-ARRAY2 not a bit array: ~S" ,BIT-ARRAY2))
(LISP:IF (NOT (EQUAL-DIMENSIONS-P ,BIT-ARRAY1 ,BIT-ARRAY2))
(LISP:ERROR "Bit-arrays not of same dimensions"))
(COND
((NULL ,RESULT-BIT-ARRAY)
(SETQ ,RESULT-BIT-ARRAY (LISP:MAKE-ARRAY (LISP:ARRAY-DIMENSIONS ,BIT-ARRAY1)
:ELEMENT-TYPE
'BIT)))
((EQ ,RESULT-BIT-ARRAY T)
(SETQ ,RESULT-BIT-ARRAY ,BIT-ARRAY1))
((NOT (AND (BIT-ARRAY-P ,RESULT-BIT-ARRAY)
(EQUAL-DIMENSIONS-P ,BIT-ARRAY1 ,RESULT-BIT-ARRAY)))
(LISP:ERROR "Illegal result array")))
,(LISP:ECASE OP
((AND IOR XOR ANDC2 ORC2) `(OR (EQ ,BIT-ARRAY1 ,RESULT-BIT-ARRAY)
(%DO-LOGICAL-OP 'COPY ,BIT-ARRAY1 ,RESULT-BIT-ARRAY)))
((EQV NAND NOR ANDC1 ORC1) `(%DO-LOGICAL-OP 'NOT ,BIT-ARRAY1 ,RESULT-BIT-ARRAY)))
,(LISP:ECASE OP
(AND `(%DO-LOGICAL-OP 'AND ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(IOR `(%DO-LOGICAL-OP 'OR ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(XOR `(%DO-LOGICAL-OP 'XOR ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(EQV `(%DO-LOGICAL-OP 'XOR ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(NAND `(%DO-LOGICAL-OP 'COR ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(NOR `(%DO-LOGICAL-OP 'CAND ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(ANDC1 `(%DO-LOGICAL-OP 'AND ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(ANDC2 `(%DO-LOGICAL-OP 'CAND ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(ORC1 `(%DO-LOGICAL-OP 'OR ,BIT-ARRAY2 ,RESULT-BIT-ARRAY))
(ORC2 `(%DO-LOGICAL-OP 'COR ,BIT-ARRAY2 ,RESULT-BIT-ARRAY)))
,RESULT-BIT-ARRAY))
(DEFMACRO %GENERAL-ARRAY-ADJUST-BASE (ARRAY ROW-MAJOR-INDEX)
`(LISP:IF (|ffetch| (GENERAL-ARRAY INDIRECT-P) |of| ,ARRAY)
(LET ((%OFFSET 0))
(SETQ ,ARRAY (%GET-BASE-ARRAY ,ARRAY %OFFSET))
(SETQ ,ROW-MAJOR-INDEX (+ ,ROW-MAJOR-INDEX %OFFSET))
(LISP:IF (NOT (< ,ROW-MAJOR-INDEX (|fetch| (ARRAY-HEADER TOTAL-SIZE)
|of| ,ARRAY)))
(LISP:ERROR "Row-major-index out of bounds (displaced to adjustable?)")))))
(DEFMACRO %GET-ARRAY-OFFSET (ARRAY)
`(COND
((OR (%ONED-ARRAY-P ,ARRAY)
(%GENERAL-ARRAY-P ,ARRAY))
(|fetch| (ARRAY-HEADER OFFSET) |of| ,ARRAY))
((%TWOD-ARRAY-P ,ARRAY)
0)))
(DEFMACRO %GET-BASE-ARRAY (ARRAY OFFSET)
`(LISP:DO ((%BASE-ARRAY ,ARRAY (|fetch| (ARRAY-HEADER BASE) |of| %BASE-ARRAY)))
((NOT (|fetch| (ARRAY-HEADER INDIRECT-P) |of| %BASE-ARRAY))
%BASE-ARRAY)
(SETQ ,OFFSET (+ ,OFFSET (%GET-ARRAY-OFFSET %BASE-ARRAY)))))
(DEFMACRO %BIT-TYPE-P (TYPE-NUMBER)
`(EQ ,TYPE-NUMBER %BIT-TYPE))
(DEFMACRO %CHAR-TYPE-P (TYPE-NUMBER)
`(EQ (%TYPENUMBER-TO-TYPE ,TYPE-NUMBER)
%CHAR-TYPE))
(DEFMACRO %CML-TYPE-TO-TYPENUMBER-EXPANDER (CML-TYPE)
(* *)
(LET
((SIMPLE-TYPES (REMOVE T (LISP:MAPCAN #'(LISP:LAMBDA (ENTRY)
(LISP:IF (NOT (LISTP (CAR ENTRY)))
(LIST (CAR ENTRY))))
%CANONICAL-CML-TYPES)))
(COMPOUND-TYPES (LISP:REMOVE-DUPLICATES (LISP:MAPCAN #'(LISP:LAMBDA (ENTRY)
(LISP:IF (LISTP (CAR ENTRY))
(LIST (CAAR ENTRY))))
%CANONICAL-CML-TYPES))))
`(LISP:IF (EQ ,CML-TYPE T)
,(CADR (LISP:ASSOC T %CANONICAL-CML-TYPES))
(LISP:IF (LISTP ,CML-TYPE)
(LISP:ECASE (CAR ,CML-TYPE)
(\\\,@
(LISP:MAPCAR
#'(LISP:LAMBDA
(TYPE)
`(,TYPE (LISP:ECASE (CADR ,CML-TYPE)
(\\\,@ (LISP:MAPCAN
#'(LISP:LAMBDA (ENTRY)
(LISP:IF (AND (LISTP (CAR ENTRY))
(EQ (CAAR ENTRY)
TYPE))
(LIST (LIST (CADAR ENTRY)
(CADR ENTRY)))))
%CANONICAL-CML-TYPES)))))
COMPOUND-TYPES)))
(LISP:ECASE ,CML-TYPE
(\\\,@ (LISP:MAPCAR #'(LISP:LAMBDA (TYPE)
(LISP:ASSOC TYPE %CANONICAL-CML-TYPES))
SIMPLE-TYPES)))))))
(DEFMACRO %FAT-CHAR-TYPE-P (TYPE-NUMBER)
`(EQ ,TYPE-NUMBER %FAT-CHAR-TYPENUMBER))
(DEFMACRO %FAT-STRING-CHAR-P (OBJECT)
`(> (LISP:CHAR-CODE ,OBJECT)
%MAXTHINCHAR))
(LISP:DEFUN %GET-TYPE-TABLE-ENTRY (TYPENUMBER)
(CADR (LISP:ASSOC TYPENUMBER %ARRAY-TYPE-TABLE)))
(LISP:DEFUN %LIT-SIZE-TO-SIZE (LIT-SIZE)
(CADR (LISP:ASSOC LIT-SIZE %LIT-ARRAY-SIZES)))
(LISP:DEFUN %LIT-TYPE-TO-TYPE (LIT-TYPE)
(CADR (LISP:ASSOC LIT-TYPE %LIT-ARRAY-TYPES)))
(LISP:DEFUN %LLARRAY-MAKE-ACCESSOR-EXPR (TYPENUMBER BASE OFFSET)
(LET* ((ENTRY (%GET-TYPE-TABLE-ENTRY TYPENUMBER))
(ACCESSOR (ARRAY-TABLE-ENTRY-ACCESSOR ENTRY))
(BITS-PER-ELEMENT (ARRAY-TABLE-ENTRY-BITS-PER-ELEMENT ENTRY))
(NEEDS-SHIFT-P (ARRAY-TABLE-ENTRY-NEEDS-SHIFT-P ENTRY)))
`(,ACCESSOR ,BASE ,(LISP:IF NEEDS-SHIFT-P
`(LLSH ,OFFSET ,NEEDS-SHIFT-P)
OFFSET))))
(LISP:DEFUN %LLARRAY-MAKE-SETTOR-EXPR (TYPENUMBER BASE OFFSET NEWVALUE)
(LET* ((ENTRY (%GET-TYPE-TABLE-ENTRY TYPENUMBER))
(SETTOR (ARRAY-TABLE-ENTRY-SETTOR ENTRY))
(BITS-PER-ELEMENT (ARRAY-TABLE-ENTRY-BITS-PER-ELEMENT ENTRY))
(NEEDS-SHIFT-P (ARRAY-TABLE-ENTRY-NEEDS-SHIFT-P ENTRY)))
`(,SETTOR ,BASE ,(LISP:IF NEEDS-SHIFT-P
`(LLSH ,OFFSET ,NEEDS-SHIFT-P)
OFFSET)
,NEWVALUE)))
(DEFMACRO %LLARRAY-TYPED-GET (BASE TYPENUMBER OFFSET)
`(LISP:ECASE ,TYPENUMBER
(\\\,@ (LISP:MAPCAR #'(LISP:LAMBDA (TYPEENTRY)
`(,(CAR TYPEENTRY)
,(%LLARRAY-MAKE-ACCESSOR-EXPR (CAR TYPEENTRY)
BASE OFFSET)))
%ARRAY-TYPE-TABLE))))
(DEFMACRO %LLARRAY-TYPED-PUT (BASE TYPENUMBER OFFSET NEWVALUE)
`(LISP:ECASE ,TYPENUMBER
(\\\,@ (LISP:MAPCAR #'(LISP:LAMBDA (TYPEENTRY)
`(,(CAR TYPEENTRY)
,(%LLARRAY-MAKE-SETTOR-EXPR (CAR TYPEENTRY)
BASE OFFSET NEWVALUE)))
%ARRAY-TYPE-TABLE))))
(DEFMACRO %LLARRAY-TYPEP (TYPENUMBER VALUE)
`(LISP:ECASE ,TYPENUMBER
(\\\,@ (LISP:MAPCAR #'(LISP:LAMBDA (TYPEENTRY)
`(,(CAR TYPEENTRY)
(,(ARRAY-TABLE-ENTRY-TYPE-TEST (CADR TYPEENTRY))
,VALUE)))
%ARRAY-TYPE-TABLE))))
(LISP:DEFUN %MAKE-ARRAY-TYPE-TABLE (LIT-TABLE TYPES SIZES)
(LISP:MAPCAN #'(LISP:LAMBDA (TYPE-ENTRY)
(LET ((LIT-TYPE (CAR TYPE-ENTRY)))
(LISP:MAPCAR #'(LISP:LAMBDA (SIZE-ENTRY)
(LIST (%TYPE-SIZE-TO-TYPENUMBER LIT-TYPE
(CAR SIZE-ENTRY))
(CADR SIZE-ENTRY)))
(CADR TYPE-ENTRY))))
LIT-TABLE))
(LISP:DEFUN %MAKE-CML-TYPE-TABLE (ARRAY-TABLE)
(LISP:MAPCAR #'(LISP:LAMBDA (TYPE-ENTRY)
(LET ((CMLTYPE (ARRAY-TABLE-ENTRY-CML-TYPE (CADR TYPE-ENTRY))))
(LIST CMLTYPE (CAR TYPE-ENTRY))))
ARRAY-TABLE))
(DEFMACRO %PACK-TYPENUMBER (ELTTYPE ELTSIZE)
`(\\ADDBASE (LLSH ,ELTTYPE 4)
,ELTSIZE))
(DEFMACRO %SMALLFIXP-SMALLPOSP (NUM)
`(\\LOLOC ,NUM))
(DEFMACRO %SMALLPOSP-SMALLFIXP (NUM)
(LET ((SYM (GENSYM)))
`(LET ((,SYM ,NUM))
(LISP:IF (> ,SYM MAX.SMALLFIXP)
(\\VAG2 |\\SmallNegHi| ,SYM)
,SYM))))
(DEFMACRO %THIN-CHAR-TYPE-P (TYPE-NUMBER)
`(EQ ,TYPE-NUMBER %THIN-CHAR-TYPENUMBER))
(DEFMACRO %THIN-STRING-CHAR-P (OBJECT)
`(<= (LISP:CHAR-CODE ,OBJECT)
%MAXTHINCHAR))
(LISP:DEFUN %TYPE-SIZE-TO-TYPENUMBER (LIT-TYPE LIT-SIZE)
(LET ((TYPE (CADR (LISP:ASSOC LIT-TYPE %LIT-ARRAY-TYPES)))
(SIZE (CADR (LISP:ASSOC LIT-SIZE %LIT-ARRAY-SIZES))))
(%PACK-TYPENUMBER TYPE SIZE)))
(DEFMACRO %TYPENUMBER-TO-BITS-PER-ELEMENT (TYPE-NUMBER)
`(LISP:ECASE ,TYPE-NUMBER
(\\\,@ (LISP:MAPCAR #'(LISP:LAMBDA (TYPEENTRY)
`(,(CAR TYPEENTRY)
,(ARRAY-TABLE-ENTRY-BITS-PER-ELEMENT (CADR TYPEENTRY))))
%ARRAY-TYPE-TABLE))))
(DEFMACRO %TYPENUMBER-TO-CML-TYPE (TYPE-NUMBER)
`(LISP:ECASE ,TYPE-NUMBER
(\\\,@ (LISP:MAPCAR #'(LISP:LAMBDA (TYPEENTRY)
`(,(CAR TYPEENTRY)
',(ARRAY-TABLE-ENTRY-CML-TYPE (CADR TYPEENTRY))))
%ARRAY-TYPE-TABLE))))
(DEFMACRO %TYPENUMBER-TO-DEFAULT-VALUE (TYPE-NUMBER)
`(LISP:ECASE ,TYPE-NUMBER
(\\\,@ (LISP:MAPCAR #'(LISP:LAMBDA (TYPEENTRY)
`(,(CAR TYPEENTRY)
,(ARRAY-TABLE-ENTRY-DEFAULT-VALUE (CADR TYPEENTRY))))
%ARRAY-TYPE-TABLE))))
(DEFMACRO %TYPENUMBER-TO-GC-TYPE (TYPE-NUMBER)
`(LISP:ECASE ,TYPE-NUMBER
(\\\,@ (LISP:MAPCAR #'(LISP:LAMBDA (TYPEENTRY)
`(,(CAR TYPEENTRY)
,(ARRAY-TABLE-ENTRY-GC-TYPE (CADR TYPEENTRY))))
%ARRAY-TYPE-TABLE))))
(DEFMACRO %TYPENUMBER-TO-SIZE (TYPE-NUMBER)
`(LOGAND ,TYPE-NUMBER 15))
(DEFMACRO %TYPENUMBER-TO-TYPE (TYPE-NUMBER)
`(LRSH ,TYPE-NUMBER 4))
(DEFMACRO \\GETBASESMALL-FIXP (BASE OFFSET)
`(%SMALLPOSP-SMALLFIXP (\\GETBASE ,BASE ,OFFSET)))
(DEFMACRO \\GETBASESTRING-CHAR (PTR DISP)
`(LISP:CODE-CHAR (\\GETBASE ,PTR ,DISP)))
(DEFMACRO \\GETBASETHINSTRING-CHAR (PTR DISP)
`(LISP:CODE-CHAR (\\GETBASEBYTE ,PTR ,DISP)))
(DEFMACRO \\PUTBASESMALL-FIXP (BASE OFFSET VALUE)
`(\\PUTBASE ,BASE ,OFFSET (%SMALLFIXP-SMALLPOSP ,VALUE)))
(DEFMACRO \\PUTBASESTRING-CHAR (PTR DISP CHAR)
`(\\PUTBASE ,PTR ,DISP (LISP:CHAR-CODE ,CHAR)))
(DEFMACRO \\PUTBASETHINSTRING-CHAR (PTR DISP CHAR)
`(\\PUTBASEBYTE ,PTR ,DISP (LISP:CHAR-CODE ,CHAR)))
(* |;;;| "Describes each entry of \\ARRAY-TYPE-TABLE")
(LISP:DEFSTRUCT (ARRAY-TABLE-ENTRY (:TYPE LIST)
(:CONSTRUCTOR NIL)
(:COPIER NIL)
(:PREDICATE NIL))
CML-TYPE
ACCESSOR
SETTOR
BITS-PER-ELEMENT
GC-TYPE
DEFAULT-VALUE
NEEDS-SHIFT-P
TYPE-TEST)
(* |;;;| "These vars contain all the necessary info for typed arrays")
(LISP:DEFPARAMETER %LIT-ARRAY-SIZES '((1BIT 0)
(8BIT 3)
(16BIT 4)
(32BIT 6))
"Size codes")
(LISP:DEFPARAMETER %LIT-ARRAY-TABLE
'((LISP:BASE-CHARACTER ((8BIT (LISP:BASE-CHARACTER \\GETBASETHINSTRING-CHAR
\\PUTBASETHINSTRING-CHAR 8 UNBOXEDBLOCK.GCT #\Null NIL
(LISP:LAMBDA (OBJECT)
(%THIN-STRING-CHAR-P OBJECT))))))
(LISP:EXTENDED-CHARACTER ((16BIT (LISP:EXTENDED-CHARACTER \\GETBASESTRING-CHAR
\\PUTBASESTRING-CHAR 16 UNBOXEDBLOCK.GCT #\Null NIL
(LISP:LAMBDA (OBJECT)
(LISP:STRING-CHAR-P OBJECT))))))
(T ((32BIT (T \\GETBASEPTR \\RPLPTR 32 PTRBLOCK.GCT NIL 1 (LISP:LAMBDA (OBJECT)
T)))))
(XPOINTER ((32BIT (XPOINTER \\GETBASEPTR \\PUTBASEPTR 32 UNBOXEDBLOCK.GCT NIL 1 (LISP:LAMBDA
(OBJECT)
T)))))
(LISP:SINGLE-FLOAT ((32BIT (LISP:SINGLE-FLOAT \\GETBASEFLOATP \\PUTBASEFLOATP 32
UNBOXEDBLOCK.GCT 0.0 1 (LISP:LAMBDA (OBJECT)
(FLOATP OBJECT))))))
(LISP:UNSIGNED-BYTE ((1BIT ((LISP:UNSIGNED-BYTE 1)
\\GETBASEBIT \\PUTBASEBIT 1 UNBOXEDBLOCK.GCT 0 NIL
(LISP:LAMBDA (OBJECT)
(AND (>= OBJECT 0)
(<= OBJECT 1)))))
(8BIT ((LISP:UNSIGNED-BYTE 8)
\\GETBASEBYTE \\PUTBASEBYTE 8 UNBOXEDBLOCK.GCT 0 NIL
(LISP:LAMBDA (OBJECT)
(AND (>= OBJECT 0)
(< OBJECT 256)))))
(16BIT ((LISP:UNSIGNED-BYTE 16)
\\GETBASE \\PUTBASE 16 UNBOXEDBLOCK.GCT 0 NIL (LISP:LAMBDA
(OBJECT)
(SMALLPOSP OBJECT)
)))))
(LISP:SIGNED-BYTE ((16BIT ((LISP:SIGNED-BYTE 16)
\\GETBASESMALL-FIXP \\PUTBASESMALL-FIXP 16 UNBOXEDBLOCK.GCT 0 NIL
(LISP:LAMBDA (OBJECT)
(AND (>= OBJECT MIN.SMALLFIXP)
(<= OBJECT MAX.SMALLFIXP)))))
(32BIT ((LISP:SIGNED-BYTE 32)
\\GETBASEFIXP \\PUTBASEFIXP 32 UNBOXEDBLOCK.GCT 0 1
(LISP:LAMBDA (OBJECT)
(AND (>= OBJECT MIN.FIXP)
(<= OBJECT MAX.FIXP))))))))
"Fields described by record ARRAY-TYPE-TABLE-ENTRY")
(LISP:DEFPARAMETER %LIT-ARRAY-TYPES
'((LISP:UNSIGNED-BYTE 0)
(LISP:SIGNED-BYTE 1)
(T 2)
(LISP:SINGLE-FLOAT 3)
(LISP:BASE-CHARACTER 4)
(LISP:EXTENDED-CHARACTER 4)
(XPOINTER 5))
"Type codes")
(* |;;;| "Tables that drives various macros")
(LISP:DEFPARAMETER %ARRAY-TYPE-TABLE (%MAKE-ARRAY-TYPE-TABLE %LIT-ARRAY-TABLE
%LIT-ARRAY-TYPES %LIT-ARRAY-SIZES)
"Drives various macros")
(LISP:DEFPARAMETER %CANONICAL-CML-TYPES (%MAKE-CML-TYPE-TABLE %ARRAY-TYPE-TABLE))
(* |;;;| "Constants for (SIGNED-BYTE 16)")
(LISP:DEFCONSTANT MAX.SMALLFIXP (LISP:1- (EXPT 2 15)))
(LISP:DEFCONSTANT MIN.SMALLFIXP (- (EXPT 2 15)))
(* |;;;| "Constants for STRING-CHARS")
(LISP:DEFCONSTANT %CHAR-TYPE (%LIT-TYPE-TO-TYPE 'LISP:BASE-CHARACTER))
(LISP:DEFCONSTANT %BIT-TYPE (%TYPE-SIZE-TO-TYPENUMBER 'LISP:UNSIGNED-BYTE '1BIT))
(LISP:DEFCONSTANT %THIN-CHAR-TYPENUMBER (%TYPE-SIZE-TO-TYPENUMBER 'LISP:BASE-CHARACTER
'8BIT))
(LISP:DEFCONSTANT %FAT-CHAR-TYPENUMBER (%TYPE-SIZE-TO-TYPENUMBER 'LISP:BASE-CHARACTER
'16BIT))
(LISP:DEFCONSTANT %MAXTHINCHAR (LISP:1- (EXPT 2 8)))
(* |;;;| "Array data-type numbers")
(LISP:DEFCONSTANT %GENERAL-ARRAY 16
"General-array-type-number")
(LISP:DEFCONSTANT %ONED-ARRAY 14
"ONED-ARRAY type number")
(LISP:DEFCONSTANT %TWOD-ARRAY 15
"TWOD-ARRAY type number")
(* |;;;| "Compiler options")
(DECLARE\: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY
(DECLARE\: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
)
(PUTPROPS CMLARRAY-SUPPORT FILETYPE LISP:COMPILE-FILE)
(PUTPROPS CMLARRAY-SUPPORT COPYRIGHT ("Venue & Xerox Corporation" 1986 1990 1991 1992 1993))
(DECLARE\: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLARRAY-SUPPORT.LCOM Normal file

Binary file not shown.

BIN
CLTL2/CMLARRAY.LCOM Normal file

Binary file not shown.

901
CLTL2/CMLCHARACTER Normal file
View File

@@ -0,0 +1,901 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 10:35:22" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLCHARACTER.;2" 39407
previous date%: "24-Mar-92 14:42:50" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLCHARACTER.;1"
)
(* ; "
Copyright (c) 1985, 1986, 1987, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLCHARACTERCOMS)
(RPAQQ CMLCHARACTERCOMS
[(COMS (* ;
 "Interlisp CHARCODE; Some is here, the rest is in LLREAD.")
(FNS CHARCODE CHARCODE.UNDECODE)
(PROP MACRO SELCHARQ ALPHACHARP DIGITCHARP UCASECODE)
(OPTIMIZERS CHARCODE)
(ALISTS (DWIMEQUIVLST SELCHARQ)
(PRETTYEQUIVLST SELCHARQ)))
(COMS (* ; "Common Lisp CHARACTER type")
(DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS CHARACTER))
(VARIABLES \CHARHI)
(VARIABLES LISP:CHAR-BITS-LIMIT LISP:CHAR-CODE-LIMIT LISP:CHAR-CONTROL-BIT
LISP:CHAR-FONT-LIMIT LISP:CHAR-HYPER-BIT LISP:CHAR-META-BIT LISP:CHAR-SUPER-BIT)
)
(COMS (* ; "Basic character fns")
(FNS LISP:CHAR-CODE LISP:CHAR-INT LISP:INT-CHAR)
(FUNCTIONS LISP:CODE-CHAR)
(OPTIMIZERS LISP:CHAR-CODE LISP:CHAR-INT LISP:CODE-CHAR LISP:INT-CHAR))
[COMS (* ;
 "I/O; Some is here, the rest is in LLREAD.")
(FNS CHARACTER.PRINT)
(DECLARE%: DONTEVAL@LOAD DOCOPY (P (SETTOPVAL (\TYPEGLOBALVARIABLE 'CHARACTER T)
(NTYPX (LISP:CODE-CHAR 0 0 0)))
(DEFPRINT 'CHARACTER 'CHARACTER.PRINT]
(COMS
(* ;; "Common lisp character functions")
(FNS LISP:CHAR-BIT LISP:CHAR-BITS LISP:CHAR-DOWNCASE LISP:CHAR-FONT LISP:CHAR-NAME
LISP:CHAR-UPCASE LISP:CHARACTER LISP:NAME-CHAR LISP:SET-CHAR-BIT)
(FUNCTIONS LISP:DIGIT-CHAR LISP:MAKE-CHAR LISP::BASE-CHARACTER-P
LISP::EXTENDED-CHARACTER-P)
(OPTIMIZERS LISP:CHAR-UPCASE LISP:CHAR-DOWNCASE LISP:MAKE-CHAR))
(COMS
(* ;; "Predicates")
(FNS LISP:ALPHA-CHAR-P LISP:ALPHANUMERICP LISP:BOTH-CASE-P LISP:CHARACTERP
LISP:GRAPHIC-CHAR-P LISP:LOWER-CASE-P LISP:STANDARD-CHAR-P LISP:STRING-CHAR-P
LISP:UPPER-CASE-P)
(FNS LISP:CHAR-EQUAL LISP:CHAR-GREATERP LISP:CHAR-LESSP LISP:CHAR-NOT-EQUAL
LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-LESSP LISP:CHAR/= LISP:CHAR< LISP:CHAR<=
LISP:CHAR= LISP:CHAR> LISP:CHAR>=)
(FUNCTIONS LISP:DIGIT-CHAR-P)
(OPTIMIZERS LISP:CHAR-EQUAL LISP:CHAR-GREATERP LISP:CHAR-LESSP LISP:CHAR-NOT-EQUAL
LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-LESSP LISP:CHAR/= LISP:CHAR< LISP:CHAR<=
LISP:CHAR= LISP:CHAR> LISP:CHAR>= LISP:CHARACTERP LISP:LOWER-CASE-P
LISP:STRING-CHAR-P LISP:UPPER-CASE-P))
(COMS
(* ;; "Internals")
(FUNCTIONS %%CHAR-DOWNCASE-CODE %%CHAR-UPCASE-CODE %%CODE-CHAR))
(COMS
(* ;; "Compiler options")
(PROP FILETYPE CMLCHARACTER)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (LOCALVARS . T)))
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDVARS (NLAMA)
(NLAML)
(LAMA LISP:CHAR>= LISP:CHAR> LISP:CHAR= LISP:CHAR<= LISP:CHAR< LISP:CHAR/=
LISP:CHAR-NOT-LESSP LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-EQUAL
LISP:CHAR-LESSP LISP:CHAR-GREATERP LISP:CHAR-EQUAL])
(* ; "Interlisp CHARCODE; Some is here, the rest is in LLREAD.")
(DEFINEQ
(CHARCODE
[NLAMBDA (CHAR)
(CHARCODE.DECODE CHAR])
(CHARCODE.UNDECODE
[LAMBDA (CODE) (* jop%: "26-Aug-86 14:27")
(LET [(NAME (LISP:CHAR-NAME (LISP:CODE-CHAR CODE]
(AND NAME (MKSTRING NAME])
)
(PUTPROPS SELCHARQ MACRO [F (CONS 'SELECTQ (CONS (CAR F)
(MAPLIST (CDR F)
(FUNCTION (LAMBDA (I)
(COND
((CDR I)
(CONS
(CHARCODE.DECODE
(CAAR I))
(CDAR I)))
(T (CAR I])
(PUTPROPS ALPHACHARP MACRO ((CHAR)
([LAMBDA (UCHAR)
(DECLARE (LOCALVARS UCHAR))
(AND (IGEQ UCHAR (CHARCODE A))
(ILEQ UCHAR (CHARCODE Z]
(LOGAND CHAR 95))))
(PUTPROPS DIGITCHARP MACRO [LAMBDA (CHAR)
(AND (IGEQ CHAR (CHARCODE 0))
(ILEQ CHAR (CHARCODE 9])
(PUTPROPS UCASECODE MACRO (OPENLAMBDA (CHAR)
(COND
((AND (IGEQ CHAR (CHARCODE a))
(ILEQ CHAR (CHARCODE z)))
(LOGAND CHAR 95))
(T CHAR))))
(DEFOPTIMIZER CHARCODE (C)
(KWOTE (CHARCODE.DECODE C T)))
(ADDTOVAR DWIMEQUIVLST (SELCHARQ . SELECTQ))
(ADDTOVAR PRETTYEQUIVLST (SELCHARQ . SELECTQ))
(* ; "Common Lisp CHARACTER type")
(DECLARE%: EVAL@COMPILE DONTCOPY
(DECLARE%: EVAL@COMPILE
(ACCESSFNS CHARACTER [(CODE (\LOLOC (\DTEST DATUM 'CHARACTER]
(CREATE (\VAG2 \CHARHI CODE)))
)
)
(LISP:DEFCONSTANT \CHARHI 7)
(LISP:DEFCONSTANT LISP:CHAR-BITS-LIMIT 1)
(LISP:DEFCONSTANT LISP:CHAR-CODE-LIMIT 65536)
(LISP:DEFCONSTANT LISP:CHAR-CONTROL-BIT 0)
(LISP:DEFCONSTANT LISP:CHAR-FONT-LIMIT 1)
(LISP:DEFCONSTANT LISP:CHAR-HYPER-BIT 0)
(LISP:DEFCONSTANT LISP:CHAR-META-BIT 0)
(LISP:DEFCONSTANT LISP:CHAR-SUPER-BIT 0)
(* ; "Basic character fns")
(DEFINEQ
(LISP:CHAR-CODE
[LAMBDA (CHAR) (* jop%: "25-Aug-86 17:30")
(\LOLOC (\DTEST CHAR 'CHARACTER])
(LISP:CHAR-INT
[LAMBDA (CHAR)
(LISP:CHAR-CODE CHAR])
(LISP:INT-CHAR
[LAMBDA (INTEGER) (* lmm " 7-Jul-85 16:50")
(LISP:CODE-CHAR INTEGER])
)
(LISP:DEFUN LISP:CODE-CHAR (CODE &OPTIONAL (BITS 0)
(FONT 0))
(LISP:IF (AND (EQ BITS 0)
(EQ FONT 0)
(* ;; "This checks for smallposp")
(EQ (\HILOC CODE)
\SmallPosHi)
(* ;; "Character 255 is undefined in all char sets")
(NOT (EQ (LDB (BYTE 8 0)
CODE)
255)))
(%%CODE-CHAR CODE)))
(DEFOPTIMIZER LISP:CHAR-CODE (CHAR)
[LET [(CONSTANT-CHAR (AND (LISP:CONSTANTP CHAR)
(LISP:EVAL CHAR]
(LISP:IF (LISP:CHARACTERP CONSTANT-CHAR)
(\LOLOC CONSTANT-CHAR)
`(\LOLOC (\DTEST ,CHAR 'CHARACTER)))])
(DEFOPTIMIZER LISP:CHAR-INT (CHAR)
`(LISP:CHAR-CODE ,CHAR))
(DEFOPTIMIZER LISP:CODE-CHAR (CODE &OPTIONAL (BITS 0)
(FONT 0))
(LISP:IF (AND (EQ BITS 0)
(EQ FONT 0))
[LET
[(CONSTANT-CODE (AND (LISP:CONSTANTP CODE)
(LISP:EVAL CODE]
(LISP:IF (EQ (\HILOC CONSTANT-CODE)
\SmallPosHi)
(LISP:IF (NOT (EQ (LDB (BYTE 8 0)
CONSTANT-CODE)
255))
(%%CODE-CHAR CONSTANT-CODE))
`(LET ((%%CODE ,CODE))
(AND (EQ (\HILOC %%CODE)
,\SmallPosHi)
(NOT (EQ (LDB (BYTE 8 0)
%%CODE)
255))
(%%CODE-CHAR %%CODE))))]
'COMPILER:PASS))
(DEFOPTIMIZER LISP:INT-CHAR (INTEGER)
`(LISP:CODE-CHAR ,INTEGER))
(* ; "I/O; Some is here, the rest is in LLREAD.")
(DEFINEQ
(CHARACTER.PRINT
[LAMBDA (CHAR STREAM) (* ; "Edited 23-Sep-91 21:09 by jrb:")
[COND
[*PRINT-ESCAPE* (* ; "Name that can be read back")
(LET ((PNAME (LISP:CHAR-NAME CHAR))
LPN)
[.SPACECHECK. STREAM (+ 2 (COND
(PNAME (SETQ LPN (LISP:LENGTH PNAME)))
(T 1] (* ;
 "Print as #\ followed by charcter name")
(\OUTCHAR STREAM (fetch (READTABLEP HASHMACROCHAR) of *READTABLE*))
(\OUTCHAR STREAM (CHARCODE "\"))
(COND
(PNAME (WRITE-STRING* PNAME STREAM 0 LPN))
(T (\OUTCHAR STREAM (LISP:CHAR-CODE CHAR]
(T (* ; "Character as character")
(\OUTCHAR STREAM (LISP:CHAR-CODE CHAR]
T])
)
(DECLARE%: DONTEVAL@LOAD DOCOPY
(SETTOPVAL (\TYPEGLOBALVARIABLE 'CHARACTER T)
(NTYPX (LISP:CODE-CHAR 0 0 0)))
(DEFPRINT 'CHARACTER 'CHARACTER.PRINT)
)
(* ;; "Common lisp character functions")
(DEFINEQ
(LISP:CHAR-BIT
[LAMBDA (CHAR NAME) (* jop%: "26-Aug-86 15:01")
(LISP:ERROR "Bit ~A not supported" NAME])
(LISP:CHAR-BITS
[LAMBDA (CHAR) (* jop%: "25-Aug-86 17:35")
(AND (LISP:CHARACTERP CHAR)
0])
(LISP:CHAR-DOWNCASE
[LAMBDA (CHAR) (* jop%: "25-Aug-86 18:01")
(%%CODE-CHAR (%%CHAR-DOWNCASE-CODE (LISP:CHAR-CODE CHAR])
(LISP:CHAR-FONT
[LAMBDA (CHAR) (* jop%: "25-Aug-86 17:35")
(AND (LISP:CHARACTERP CHAR)
0])
(LISP:CHAR-NAME
[LAMBDA (CHAR) (* ; "Edited 19-Mar-87 15:49 by bvm:")
(DECLARE (GLOBALVARS CHARACTERNAMES CHARACTERSETNAMES))
(COND
((EQ CHAR #\Space) (* ;
 "Space is special because it is graphic but has a name")
"Space")
((LISP:GRAPHIC-CHAR-P CHAR) (* ; "graphics have no special names")
NIL)
(T (LET ((CODE (LISP:CHAR-CODE CHAR))
CSET)
(COND
[(for X in CHARACTERNAMES when (EQ (CADR X)
CODE)
do (RETURN (CAR X]
(T (SETQ CSET (LRSH CODE 8))
(SETQ CODE (LOGAND CODE 255))
(COND
[(AND (EQ CSET 0)
(<= CODE (CHARCODE "^Z"))) (* ;
 "represent ascii control chars nicely")
(CONCAT "^" (LISP:CODE-CHAR (LOGOR CODE (- (CHARCODE "A")
(CHARCODE "^A"]
(T (* ; "Else charset-charcode")
(CONCAT (for X in CHARACTERSETNAMES
when (EQ (CADR X)
CSET) do (RETURN (CAR X))
finally (RETURN (OCTALSTRING CSET)))
"-"
(OCTALSTRING CODE])
(LISP:CHAR-UPCASE
[LAMBDA (CHAR) (* jop%: "25-Aug-86 18:01")
(%%CODE-CHAR (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE CHAR])
(LISP:CHARACTER
[LAMBDA (OBJECT) (* jop%: "14-Nov-86 16:22")
(COND
((TYPEP OBJECT 'LISP:CHARACTER)
OBJECT)
((AND (NOT *CLTL2-PEDANTIC*)
(TYPEP OBJECT 'LISP:FIXNUM))
(LISP:INT-CHAR OBJECT))
([AND (OR (TYPEP OBJECT 'STRING)
(TYPEP OBJECT 'LISP:SYMBOL))
(EQL 1 (LISP:LENGTH (SETQ OBJECT (STRING OBJECT]
(LISP:CHAR OBJECT 0))
(T (LISP:ERROR "Object cannot be coerced to a character: ~S" OBJECT])
(LISP:NAME-CHAR
[LAMBDA (NAME) (* ; "Edited 18-Feb-87 22:05 by bvm:")
(LET ((CODE (CHARCODE.DECODE (STRING NAME)
T)))
(AND CODE (LISP:CODE-CHAR CODE])
(LISP:SET-CHAR-BIT
[LAMBDA (CHAR NAME NEWVALUE) (* jop%: "26-Aug-86 15:02")
(LISP:ERROR "Bit ~A not supported" NAME])
)
(LISP:DEFUN LISP:DIGIT-CHAR (WEIGHT &OPTIONAL (RADIX 10)
(FONT 0))
[AND (EQ FONT 0)
(< -1 WEIGHT RADIX 37)
(LISP:IF (< WEIGHT 10)
(%%CODE-CHAR (+ (CONSTANT (LISP:CHAR-CODE #\0))
WEIGHT))
(%%CODE-CHAR (+ (CONSTANT (LISP:CHAR-CODE #\A))
(- WEIGHT 10))))])
(LISP:DEFUN LISP:MAKE-CHAR (CHAR &OPTIONAL (BITS 0)
(FONT 0))
(LISP:IF (AND (EQL BITS 0)
(EQL FONT 0))
CHAR))
(LISP:DEFUN LISP::BASE-CHARACTER-P (LISP::OBJECT) (* ; "Edited 13-Feb-92 19:51 by jrb:")
(AND (LISP:CHARACTERP LISP::OBJECT)
(* ;; "Same as (NOT (%%%%FAT-STRING-CHAR-P object))")
(ILEQ (\LOLOC LISP::OBJECT)
%%MAXTHINCHAR)))
(LISP:DEFUN LISP::EXTENDED-CHARACTER-P (LISP::OBJECT) (* ; "Edited 13-Feb-92 20:18 by jrb:")
(AND (LISP:CHARACTERP LISP::OBJECT)
(* ;; "Same as (%%%%FAT-STRING-CHAR-P object)")
(IGREATERP (\LOLOC LISP::OBJECT)
%%MAXTHINCHAR)))
(DEFOPTIMIZER LISP:CHAR-UPCASE (CHAR)
`[%%CODE-CHAR (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE
,CHAR])
(DEFOPTIMIZER LISP:CHAR-DOWNCASE (CHAR)
`[%%CODE-CHAR (%%CHAR-DOWNCASE-CODE (LISP:CHAR-CODE
,CHAR])
(DEFOPTIMIZER LISP:MAKE-CHAR (CHAR &OPTIONAL BITS FONT)
(LISP:IF (AND (OR (NULL BITS)
(EQL BITS 0))
(OR (NULL FONT)
(EQL FONT 0)))
CHAR
'COMPILER:PASS))
(* ;; "Predicates")
(DEFINEQ
(LISP:ALPHA-CHAR-P
[LAMBDA (CHAR) (* raf "23-Oct-85 15:03")
(LET ((CODE (LISP:CHAR-CODE CHAR))) (* ;
 "Might want to make this true for Greek char sets, etc.")
(OR (<= (CONSTANT (LISP:CHAR-CODE #\A))
CODE
(CONSTANT (LISP:CHAR-CODE #\Z)))
(<= (CONSTANT (LISP:CHAR-CODE #\a))
CODE
(CONSTANT (LISP:CHAR-CODE #\z])
(LISP:ALPHANUMERICP
[LAMBDA (CHAR) (* lmm "28-Oct-85 20:40")
(OR (LISP:ALPHA-CHAR-P CHAR)
(NOT (NULL (LISP:DIGIT-CHAR-P CHAR])
(LISP:BOTH-CASE-P
[LAMBDA (CHAR)
(OR (LISP:UPPER-CASE-P CHAR)
(LISP:LOWER-CASE-P CHAR])
(LISP:CHARACTERP
[LAMBDA (OBJECT) (* lmm " 1-Aug-85 22:45")
(TYPENAMEP OBJECT 'CHARACTER])
(LISP:GRAPHIC-CHAR-P
[LAMBDA (CHAR) (* bvm%: "14-May-86 16:19")
(* ;;;
"True if CHAR represents a graphic (printing) character. Definition follows NS character standard")
(LET* ((CODE (LISP:CHAR-CODE CHAR))
(CSET (LRSH CODE 8)))
(AND [PROGN (* ;
 "Graphic charsets are zero, 41 thru 176, 241 thru 276")
(OR (EQ CSET 0)
(AND (> (SETQ CSET (LOGAND CSET 127))
32)
(NOT (EQ CSET 127]
(PROGN (* ;
 "Printing chars within a character set are SPACE thru 176 and 241 thru 276")
(OR (EQ (SETQ CODE (LOGAND CODE 255))
(CONSTANT (LISP:CHAR-CODE #\Space)))
(AND (> (SETQ CODE (LOGAND CODE 127))
32)
(NOT (EQ CODE 127])
(LISP:LOWER-CASE-P
[LAMBDA (CHAR)
(<= (CONSTANT (LISP:CHAR-CODE #\a))
(LISP:CHAR-CODE CHAR)
(CONSTANT (LISP:CHAR-CODE #\z])
(LISP:STANDARD-CHAR-P
[LAMBDA (CHAR) (* ; "Edited 7-Jan-87 11:42 by jop")
(AND (LISP:MEMBER CHAR
'(#\! #\" #\# #\$ #\% #\& #\' #\( #\) #\* #\+ #\, #\- #\. #\/ #\0 #\1 #\2 #\3 #\4 #\5
#\6 #\7 #\8 #\9 #\: #\; #\< #\= #\> #\? #\@ #\A #\B #\C #\D #\E #\F #\G #\H #\I
#\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X #\Y #\Z #\[ #\\ #\]
#\^ #\_ #\` #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k #\l #\m #\n #\o #\p #\q
#\r #\s #\t #\u #\v #\w #\x #\y #\z #\{ #\| #\} #\~ #\Space #\Newline))
T])
(LISP:STRING-CHAR-P
[LAMBDA (CHAR)
(\DTEST CHAR 'CHARACTER])
(LISP:UPPER-CASE-P
[LAMBDA (CHAR)
(<= (CONSTANT (LISP:CHAR-CODE #\A))
(LISP:CHAR-CODE CHAR)
(CONSTANT (LISP:CHAR-CODE #\Z])
)
(DEFINEQ
(LISP:CHAR-EQUAL
[LAMBDA N (* jop%: "25-Aug-86 16:03")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR-EQUAL takes at least one arg"))
(LISP:DO ((TEST (LISP:CHAR-UPCASE (ARG N 1)))
(I 2 (LISP:1+ I)))
((> I N)
T)
(LISP:IF [NOT (EQ TEST (LISP:CHAR-UPCASE (ARG N I]
(RETURN NIL)))])
(LISP:CHAR-GREATERP
[LAMBDA N (* jop%: "25-Aug-86 17:15")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR-LESSP takes at least one arg"))
(LISP:DO ([LAST (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE (ARG N 1]
NEXT
(I 2 (LISP:1+ I)))
((> I N)
T)
[SETQ NEXT (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE (ARG N I]
(LISP:IF (NOT (> LAST NEXT))
(RETURN NIL)
(SETQ LAST NEXT)))])
(LISP:CHAR-LESSP
[LAMBDA N (* jop%: "25-Aug-86 17:17")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR-LESSP takes at least one arg"))
(LISP:DO ([LAST (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE (ARG N 1]
NEXT
(I 2 (LISP:1+ I)))
((> I N)
T)
[SETQ NEXT (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE (ARG N I]
(LISP:IF (NOT (< LAST NEXT))
(RETURN NIL)
(SETQ LAST NEXT)))])
(LISP:CHAR-NOT-EQUAL
[LAMBDA N (* jop%: "25-Aug-86 16:02")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR-NOT-EQUAL takes at least one arg"))
(LISP:DO ((I 1 (LISP:1+ I))
TEST)
((> I N)
T)
(SETQ TEST (LISP:CHAR-UPCASE (ARG N I)))
(LISP:IF (LISP:DO ((J (LISP:1+ I)
(LISP:1+ J)))
((> J N)
NIL)
(LISP:IF (EQ TEST (LISP:CHAR-UPCASE (ARG N J)))
(RETURN T)))
(RETURN NIL)))])
(LISP:CHAR-NOT-GREATERP
[LAMBDA N (* jop%: "25-Aug-86 17:18")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR-LESSP takes at least one arg"))
(LISP:DO ([LAST (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE (ARG N 1]
NEXT
(I 2 (LISP:1+ I)))
((> I N)
T)
[SETQ NEXT (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE (ARG N I]
(LISP:IF (NOT (<= LAST NEXT))
(RETURN NIL)
(SETQ LAST NEXT)))])
(LISP:CHAR-NOT-LESSP
[LAMBDA N (* jop%: "25-Aug-86 17:19")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR-LESSP takes at least one arg"))
(LISP:DO ([LAST (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE (ARG N 1]
NEXT
(I 2 (LISP:1+ I)))
((> I N)
T)
[SETQ NEXT (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE (ARG N I]
(LISP:IF (NOT (>= LAST NEXT))
(RETURN NIL)
(SETQ LAST NEXT)))])
(LISP:CHAR/=
[LAMBDA N (* jop%: "25-Aug-86 17:07")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR/= takes at least one arg"))
(LISP:DO ((I 1 (LISP:1+ I))
TEST)
((> I N)
T)
(SETQ TEST (LISP:CHAR-CODE (ARG N I)))
(LISP:IF (LISP:DO ((J (LISP:1+ I)
(LISP:1+ J)))
((> J N)
NIL)
(LISP:IF (EQ TEST (LISP:CHAR-CODE (ARG N J)))
(RETURN T)))
(RETURN NIL)))])
(LISP:CHAR<
[LAMBDA N (* jop%: "25-Aug-86 14:29")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR< takes at least one arg"))
(LISP:DO ((LAST (LISP:CHAR-CODE (ARG N 1)))
NEXT
(I 2 (LISP:1+ I)))
((> I N)
T)
(SETQ NEXT (LISP:CHAR-CODE (ARG N I)))
(LISP:IF (NOT (< LAST NEXT))
(RETURN NIL)
(SETQ LAST NEXT)))])
(LISP:CHAR<=
[LAMBDA N (* jop%: "25-Aug-86 14:38")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR< takes at least one arg"))
(LISP:DO ((LAST (LISP:CHAR-CODE (ARG N 1)))
NEXT
(I 2 (LISP:1+ I)))
((> I N)
T)
(SETQ NEXT (LISP:CHAR-CODE (ARG N I)))
(LISP:IF (NOT (<= LAST NEXT))
(RETURN NIL)
(SETQ LAST NEXT)))])
(LISP:CHAR=
[LAMBDA N (* jop%: "25-Aug-86 17:05")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR= takes at least one arg"))
(LISP:DO ((TEST (LISP:CHAR-CODE (ARG N 1)))
(I 2 (LISP:1+ I)))
((> I N)
T)
(LISP:IF [NOT (EQ TEST (LISP:CHAR-CODE (ARG N I]
(RETURN NIL)))])
(LISP:CHAR>
[LAMBDA N (* jop%: "25-Aug-86 14:34")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR< takes at least one arg"))
(LISP:DO ((LAST (LISP:CHAR-CODE (ARG N 1)))
NEXT
(I 2 (LISP:1+ I)))
((> I N)
T)
(SETQ NEXT (LISP:CHAR-CODE (ARG N I)))
(LISP:IF (NOT (> LAST NEXT))
(RETURN NIL)
(SETQ LAST NEXT)))])
(LISP:CHAR>=
[LAMBDA N (* jop%: "25-Aug-86 14:40")
(LISP:IF (< N 1)
(LISP:ERROR "CHAR< takes at least one arg"))
(LISP:DO ((LAST (LISP:CHAR-CODE (ARG N 1)))
NEXT
(I 2 (LISP:1+ I)))
((> I N)
T)
(SETQ NEXT (LISP:CHAR-CODE (ARG N I)))
(LISP:IF (NOT (>= LAST NEXT))
(RETURN NIL)
(SETQ LAST NEXT)))])
)
(LISP:DEFUN LISP:DIGIT-CHAR-P (CHAR &OPTIONAL (RADIX 10))
"Returns the weigh of CHAR in radix RADIX, or NIL if CHAR is not a digit char in that radix."
(LET* [(CODE (LISP:CHAR-CODE CHAR))
(VAL (COND
[(<= (CONSTANT (LISP:CHAR-CODE #\0))
CODE
(CONSTANT (LISP:CHAR-CODE #\9)))
(- CODE (CONSTANT (LISP:CHAR-CODE #\0]
[(<= (CONSTANT (LISP:CHAR-CODE #\A))
CODE
(CONSTANT (LISP:CHAR-CODE #\Z)))
(+ 10 (- CODE (CONSTANT (LISP:CHAR-CODE #\A]
((<= (CONSTANT (LISP:CHAR-CODE #\a))
CODE
(CONSTANT (LISP:CHAR-CODE #\z)))
(+ 10 (- CODE (CONSTANT (LISP:CHAR-CODE #\a]
(AND VAL (< VAL RADIX)
VAL)))
(DEFOPTIMIZER LISP:CHAR-EQUAL (CHAR &REST MORE-CHARS)
(LISP:IF (EQL 1 (LISP:LENGTH MORE-CHARS))
`[EQ (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE ,CHAR))
(%%CHAR-UPCASE-CODE (LISP:CHAR-CODE
,(CAR MORE-CHARS]
'COMPILER:PASS))
(DEFOPTIMIZER LISP:CHAR-GREATERP (CHAR &REST MORE-CHARS)
`(> (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE ,CHAR))
,@(LISP:MAPCAR [FUNCTION (LISP:LAMBDA
(FORM)
`(%%CHAR-UPCASE-CODE
(LISP:CHAR-CODE ,FORM]
MORE-CHARS)))
(DEFOPTIMIZER LISP:CHAR-LESSP (CHAR &REST MORE-CHARS)
`(< (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE ,CHAR))
,@(LISP:MAPCAR [FUNCTION (LISP:LAMBDA
(FORM)
`(%%CHAR-UPCASE-CODE
(LISP:CHAR-CODE ,FORM]
MORE-CHARS)))
(DEFOPTIMIZER LISP:CHAR-NOT-EQUAL (CHAR &REST MORE-CHARS)
(LISP:IF (EQL 1 (LISP:LENGTH MORE-CHARS))
`[NOT (EQ (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE
,CHAR))
(%%CHAR-UPCASE-CODE
(LISP:CHAR-CODE ,(CAR MORE-CHARS]
'COMPILER:PASS))
(DEFOPTIMIZER LISP:CHAR-NOT-GREATERP (CHAR &REST MORE-CHARS)
`(<=
(%%CHAR-UPCASE-CODE (LISP:CHAR-CODE ,CHAR))
,@(LISP:MAPCAR [FUNCTION (LISP:LAMBDA
(FORM)
`(%%CHAR-UPCASE-CODE
(LISP:CHAR-CODE
,FORM]
MORE-CHARS)))
(DEFOPTIMIZER LISP:CHAR-NOT-LESSP (CHAR &REST MORE-CHARS)
`(>= (%%CHAR-UPCASE-CODE (LISP:CHAR-CODE ,CHAR))
,@(LISP:MAPCAR [FUNCTION (LISP:LAMBDA
(FORM)
`(%%CHAR-UPCASE-CODE
(LISP:CHAR-CODE
,FORM]
MORE-CHARS)))
(DEFOPTIMIZER LISP:CHAR/= (CHAR &REST MORE-CHARS)
(LISP:IF (CDR MORE-CHARS)
'COMPILER:PASS
`(NEQ ,CHAR ,(CAR MORE-CHARS))))
(DEFOPTIMIZER LISP:CHAR< (CHAR &REST MORE-CHARS)
`(< (LISP:CHAR-CODE ,CHAR)
,@(LISP:MAPCAR [FUNCTION (LISP:LAMBDA (FORM)
`(LISP:CHAR-CODE ,FORM]
MORE-CHARS)))
(DEFOPTIMIZER LISP:CHAR<= (CHAR &REST MORE-CHARS)
`(<= (LISP:CHAR-CODE ,CHAR)
,@(LISP:MAPCAR [FUNCTION (LISP:LAMBDA (FORM)
`(LISP:CHAR-CODE ,FORM]
MORE-CHARS)))
(DEFOPTIMIZER LISP:CHAR= (CHAR &REST MORE-CHARS)
(LISP:IF (CDR MORE-CHARS)
[LET
((CH (GENSYM)))
`(LET ((,CH ,CHAR))
(AND ,@(for X in MORE-CHARS
collect `(EQ ,CH ,X]
`(EQ ,CHAR ,(CAR MORE-CHARS))))
(DEFOPTIMIZER LISP:CHAR> (CHAR &REST MORE-CHARS)
`(> (LISP:CHAR-CODE ,CHAR)
,@(LISP:MAPCAR [FUNCTION (LISP:LAMBDA (FORM)
`(LISP:CHAR-CODE ,FORM]
MORE-CHARS)))
(DEFOPTIMIZER LISP:CHAR>= (CHAR &REST MORE-CHARS)
`(>= (LISP:CHAR-CODE ,CHAR)
,@(LISP:MAPCAR [FUNCTION (LISP:LAMBDA (FORM)
`(LISP:CHAR-CODE ,FORM]
MORE-CHARS)))
(DEFOPTIMIZER LISP:CHARACTERP (OBJECT)
`(TYPENAMEP ,OBJECT 'CHARACTER))
(DEFOPTIMIZER LISP:LOWER-CASE-P (CHAR)
`(<= (CONSTANT (LISP:CHAR-CODE #\a))
(LISP:CHAR-CODE ,CHAR)
(CONSTANT (LISP:CHAR-CODE #\z))))
(DEFOPTIMIZER LISP:STRING-CHAR-P (CHAR)
`(\DTEST ,CHAR 'CHARACTER))
(DEFOPTIMIZER LISP:UPPER-CASE-P (CHAR)
`(<= (CONSTANT (LISP:CHAR-CODE #\A))
(LISP:CHAR-CODE ,CHAR)
(CONSTANT (LISP:CHAR-CODE #\Z))))
(* ;; "Internals")
(DEFMACRO %%CHAR-DOWNCASE-CODE (CODE)
`(LET ((%%CODE ,CODE))
(LISP:IF (<= (CONSTANT (LISP:CHAR-CODE #\A))
%%CODE
(CONSTANT (LISP:CHAR-CODE #\Z)))
[+ %%CODE (- (CONSTANT (LISP:CHAR-CODE #\a))
(CONSTANT (LISP:CHAR-CODE #\A]
%%CODE)))
(DEFMACRO %%CHAR-UPCASE-CODE (CODE)
`(LET ((%%CODE ,CODE))
(LISP:IF (<= (CONSTANT (LISP:CHAR-CODE #\a))
%%CODE
(CONSTANT (LISP:CHAR-CODE #\z)))
[- %%CODE (- (CONSTANT (LISP:CHAR-CODE #\a))
(CONSTANT (LISP:CHAR-CODE #\A]
%%CODE)))
(DEFMACRO %%CODE-CHAR (CODE)
`(\VAG2 \CHARHI ,CODE))
(* ;; "Compiler options")
(PUTPROPS CMLCHARACTER FILETYPE LISP:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA LISP:CHAR>= LISP:CHAR> LISP:CHAR= LISP:CHAR<= LISP:CHAR< LISP:CHAR/=
LISP:CHAR-NOT-LESSP LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-EQUAL
LISP:CHAR-LESSP LISP:CHAR-GREATERP LISP:CHAR-EQUAL)
)
(PRETTYCOMPRINT CMLCHARACTERCOMS)
(RPAQQ CMLCHARACTERCOMS
[(COMS (* ;
 "Interlisp CHARCODE; Some is here, the rest is in LLREAD.")
(FNS CHARCODE CHARCODE.UNDECODE)
(PROP MACRO SELCHARQ ALPHACHARP DIGITCHARP UCASECODE)
(OPTIMIZERS CHARCODE)
(ALISTS (DWIMEQUIVLST SELCHARQ)
(PRETTYEQUIVLST SELCHARQ)))
(COMS (* ; "Common Lisp CHARACTER type")
(DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS CHARACTER))
(VARIABLES \CHARHI)
(VARIABLES LISP:CHAR-BITS-LIMIT LISP:CHAR-CODE-LIMIT LISP:CHAR-CONTROL-BIT
LISP:CHAR-FONT-LIMIT LISP:CHAR-HYPER-BIT LISP:CHAR-META-BIT LISP:CHAR-SUPER-BIT)
)
(COMS (* ; "Basic character fns")
(FNS LISP:CHAR-CODE LISP:CHAR-INT LISP:INT-CHAR)
(FUNCTIONS LISP:CODE-CHAR)
(OPTIMIZERS LISP:CHAR-CODE LISP:CHAR-INT LISP:CODE-CHAR LISP:INT-CHAR))
[COMS (* ;
 "I/O; Some is here, the rest is in LLREAD.")
(FNS CHARACTER.PRINT)
(DECLARE%: DONTEVAL@LOAD DOCOPY (P (SETTOPVAL (\TYPEGLOBALVARIABLE 'CHARACTER T)
(NTYPX (LISP:CODE-CHAR 0 0 0)))
(DEFPRINT 'CHARACTER 'CHARACTER.PRINT]
(COMS
(* ;; "Common lisp character functions")
(FNS LISP:CHAR-BIT LISP:CHAR-BITS LISP:CHAR-DOWNCASE LISP:CHAR-FONT LISP:CHAR-NAME
LISP:CHAR-UPCASE LISP:CHARACTER LISP:NAME-CHAR LISP:SET-CHAR-BIT)
(FUNCTIONS LISP:DIGIT-CHAR LISP:MAKE-CHAR LISP::BASE-CHARACTER-P
LISP::EXTENDED-CHARACTER-P)
(OPTIMIZERS LISP:CHAR-UPCASE LISP:CHAR-DOWNCASE LISP:MAKE-CHAR))
(COMS
(* ;; "Predicates")
(FNS LISP:ALPHA-CHAR-P LISP:ALPHANUMERICP LISP:BOTH-CASE-P LISP:CHARACTERP
LISP:GRAPHIC-CHAR-P LISP:LOWER-CASE-P LISP:STANDARD-CHAR-P LISP:STRING-CHAR-P
LISP:UPPER-CASE-P)
(FNS LISP:CHAR-EQUAL LISP:CHAR-GREATERP LISP:CHAR-LESSP LISP:CHAR-NOT-EQUAL
LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-LESSP LISP:CHAR/= LISP:CHAR< LISP:CHAR<=
LISP:CHAR= LISP:CHAR> LISP:CHAR>=)
(FUNCTIONS LISP:DIGIT-CHAR-P)
(OPTIMIZERS LISP:CHAR-EQUAL LISP:CHAR-GREATERP LISP:CHAR-LESSP LISP:CHAR-NOT-EQUAL
LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-LESSP LISP:CHAR/= LISP:CHAR< LISP:CHAR<=
LISP:CHAR= LISP:CHAR> LISP:CHAR>= LISP:CHARACTERP LISP:LOWER-CASE-P
LISP:STRING-CHAR-P LISP:UPPER-CASE-P))
(COMS
(* ;; "Internals")
(FUNCTIONS %%CHAR-DOWNCASE-CODE %%CHAR-UPCASE-CODE %%CODE-CHAR))
(COMS
(* ;; "Compiler options")
(PROP FILETYPE CMLCHARACTER)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (LOCALVARS . T)))
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDVARS (NLAMA)
(NLAML CHARCODE)
(LAMA LISP:CHAR>= LISP:CHAR> LISP:CHAR= LISP:CHAR<= LISP:CHAR< LISP:CHAR/=
LISP:CHAR-NOT-LESSP LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-EQUAL
LISP:CHAR-LESSP LISP:CHAR-GREATERP LISP:CHAR-EQUAL])
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML CHARCODE)
(ADDTOVAR LAMA LISP:CHAR>= LISP:CHAR> LISP:CHAR= LISP:CHAR<= LISP:CHAR< LISP:CHAR/=
LISP:CHAR-NOT-LESSP LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-EQUAL
LISP:CHAR-LESSP LISP:CHAR-GREATERP LISP:CHAR-EQUAL)
)
(PUTPROPS CMLCHARACTER COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1990 1991 1992 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (4234 4520 (CHARCODE 4244 . 4303) (CHARCODE.UNDECODE 4305 . 4518)) (7120 7495 (
LISP:CHAR-CODE 7130 . 7280) (LISP:CHAR-INT 7282 . 7348) (LISP:INT-CHAR 7350 . 7493)) (10135 11239 (
CHARACTER.PRINT 10145 . 11237)) (11454 15081 (LISP:CHAR-BIT 11464 . 11621) (LISP:CHAR-BITS 11623 .
11784) (LISP:CHAR-DOWNCASE 11786 . 11976) (LISP:CHAR-FONT 11978 . 12139) (LISP:CHAR-NAME 12141 . 13934
) (LISP:CHAR-UPCASE 13936 . 14122) (LISP:CHARACTER 14124 . 14670) (LISP:NAME-CHAR 14672 . 14916) (
LISP:SET-CHAR-BIT 14918 . 15079)) (17155 20389 (LISP:ALPHA-CHAR-P 17165 . 17711) (LISP:ALPHANUMERICP
17713 . 17913) (LISP:BOTH-CASE-P 17915 . 18028) (LISP:CHARACTERP 18030 . 18176) (LISP:GRAPHIC-CHAR-P
18178 . 19317) (LISP:LOWER-CASE-P 19319 . 19480) (LISP:STANDARD-CHAR-P 19482 . 20152) (LISP:STRING-CHAR-P
20154 . 20224) (LISP:UPPER-CASE-P 20226 . 20387)) (20390 26570 (LISP:CHAR-EQUAL 20400 . 20818) (
LISP:CHAR-GREATERP 20820 . 21353) (LISP:CHAR-LESSP 21355 . 21885) (LISP:CHAR-NOT-EQUAL 21887 . 22537)
(LISP:CHAR-NOT-GREATERP 22539 . 23077) (LISP:CHAR-NOT-LESSP 23079 . 23614) (LISP:CHAR/= 23616 . 24246)
(LISP:CHAR< 24248 . 24724) (LISP:CHAR<= 24726 . 25204) (LISP:CHAR= 25206 . 25610) (LISP:CHAR> 25612
. 26088) (LISP:CHAR>= 26090 . 26568)))))
STOP

BIN
CLTL2/CMLCHARACTER.LCOM Normal file

Binary file not shown.

561
CLTL2/CMLCOMPILE Normal file
View File

@@ -0,0 +1,561 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 10:39:21" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLCOMPILE.;2" 31069
previous date%: "30-Mar-92 12:16:41" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLCOMPILE.;1")
(* ; "
Copyright (c) 1985, 1986, 1987, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLCOMPILECOMS)
(RPAQQ CMLCOMPILECOMS
[(COMS (FUNCTIONS LISP:DISASSEMBLE)
(FNS FAKE-COMPILE-FILE INTERLISP-FORMAT-P INTERLISP-NLAMBDA-FUNCTION-P
COMPILE-FILE-EXPRESSION COMPILE-FILE-WALK-FUNCTION ARGTYPE.STATE
COMPILE.CHECK.ARGTYPE COMPILE.FILE.DEFINEQ COMPILE-FILE-SETF-SYMBOL-FUNCTION
COMPILE-FILE-EX/IMPORT COMPILE.FILE.APPLY COMPILE.FILE.RESET COMPILE-IN-CORE)
(FNS COMPILE-FILE-SCAN-FIRST)
(* ;
 "This function is support for AR#11185")
(VARS ARGTYPE.VARS)
(PROP COMPILE-FILE-EXPRESSION DEFINEQ * SETF-SYMBOL-FUNCTION PRETTYCOMPRINT)
(FUNCTIONS COMPILE-FILE-DECLARE%:))
[COMS (FNS NEWDEFC)
(DECLARE%: DONTEVAL@LOAD DOCOPY (P (MOVD 'NEWDEFC 'DEFC]
(PROP FILETYPE CMLCOMPILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
(NLAML)
(LAMA FAKE-COMPILE-FILE])
(LISP:DEFUN LISP:DISASSEMBLE (NAME-OR-COMPILED-FUNCTION &KEY LEVEL-P (RADIX 8)
(OUTPUT *STANDARD-OUTPUT*)
FIRST-BYTE MARKED-PC)
(PRINTCODE (if (CCODEP NAME-OR-COMPILED-FUNCTION)
then NAME-OR-COMPILED-FUNCTION
else (LISP:COMPILE NIL (if (LISP:SYMBOLP NAME-OR-COMPILED-FUNCTION)
then (LISP:SYMBOL-FUNCTION
NAME-OR-COMPILED-FUNCTION)
else NAME-OR-COMPILED-FUNCTION)))
LEVEL-P RADIX OUTPUT FIRST-BYTE MARKED-PC))
(DEFINEQ
(FAKE-COMPILE-FILE
(LISP:LAMBDA
(FILENAME &KEY LAP REDEFINE OUTPUT-FILE (SAVE-EXPRS T)
(COMPILER-OUTPUT T)
(PROCESS-ENTIRE-FILE NIL PEFP)) (* ; "Edited 29-Jun-90 19:19 by nm")
(LET
(COMPILE.FILE.AFTER VALUE COMPILE.FILE.VALUE (NLAML NLAML)
(NLAMA NLAMA)
(LAMS LAMS)
(LAMA LAMA)
(DFNFLG NIL))
(DECLARE (LISP:SPECIAL COMPILE.FILE.AFTER COMPILE.FILE.VALUE NLAML NLAMA LAMS LAMA DFNFLG))
(RESETLST
(RESETSAVE NIL (LIST 'RESETUNDO)
(RESETUNDO))
(RESETSAVE COUTFILE COMPILER-OUTPUT)
(RESETSAVE STRF REDEFINE)
(RESETSAVE SVFLG (AND SAVE-EXPRS REDEFINE 'DEFER))
(RESETSAVE LAPFLG LAP)
(LET
((*PACKAGE* *INTERLISP-PACKAGE*)
(*READ-BASE* 10)
(LOCALVARS SYSLOCALVARS)
(SPECVARS T)
STREAM LSTFIL ROOTNAME INTERLISP-FORMAT ENV FORM)
(DECLARE (LISP:SPECIAL *PACKAGE* *READ-BASE* LOCALVARS SPECVARS LSTFIL))
[RESETSAVE NIL (LIST (FUNCTION CLOSEF?)
(SETQ STREAM (OPENSTREAM FILENAME 'INPUT]
(LISP:MULTIPLE-VALUE-SETQ (ENV FORM)
(\PARSE-FILE-HEADER STREAM 'RETURN T))
(SETQ INTERLISP-FORMAT (AND ENV (NEQ ENV *COMMON-LISP-READ-ENVIRONMENT*)))
(if (NOT PEFP)
then (SETQ PROCESS-ENTIRE-FILE INTERLISP-FORMAT))
(if LAP
then (SETQ LSTFIL COUTFILE))
(SETQ FILENAME (FULLNAME STREAM))
(RESETSAVE NIL (LIST (FUNCTION COMPILE.FILE.RESET)
[SETQ OUTPUT-FILE (OPENSTREAM (OR OUTPUT-FILE (PACKFILENAME.STRING
'VERSION NIL
'EXTENSION COMPILE.EXT
'BODY FILENAME))
'OUTPUT
'NEW
'((TYPE BINARY]
STREAM
(ROOTFILENAME FILENAME)))
(if OUTPUT-FILE
then (RESETSAVE LCFIL OUTPUT-FILE)
(PRINT-COMPILE-HEADER (LIST STREAM)
'("COMPILE-FILEd")
ENV))
(WITH-READER-ENVIRONMENT ENV
(PROG ((DEFERRED.EXPRESSIONS NIL)
(*PRINT-ARRAY* T)
(*PRINT-LEVEL* NIL)
(*PRINT-LENGTH* NIL)
(FIRSTFORMS NIL)
(AFTERS NIL)
(SCRATCH.LCOM '{CORE}SCRATCH.LCOM)
DUMMYFILE TEMPVAL)
(DECLARE (LISP:SPECIAL DEFERRED.EXPRESSIONS *PRINT-ARRAY* *PRINT-LEVEL*
*PRINT-LENGTH* FIRSTFORMS AFTERS DEFERS))
(* ; "Edited by TT (11-June-90 : for AR#11185) all contents of file are read, and each forms are compiled.(This reading method is for supporting %"FIRST%", %"NOTFIRST%" tag.)")
[RESETSAVE NIL (LIST (FUNCTION CLOSEF?)
(SETQ DUMMYFILE (OPENSTREAM SCRATCH.LCOM 'BOTH 'NEW]
LPDUMP
[if (EQUAL (CAR FORM)
'RPAQQ)
then (* ;
 "This is the support method of %"COMPILERVARS%" (2-July-1990 TT)")
(SETQ TEMPVAL (CADDR FORM))
(if (SETQ TEMPVAL (ASSOC 'DECLARE%: TEMPVAL))
then (if (SETQ TEMPVAL (FMEMB 'COMPILERVARS
(FMEMB 'DOEVAL@COMPILE TEMPVAL
)))
then (SETQ DFNFLG T)
(if [SETQ TEMPVAL (FMEMB 'ADDVARS
(SETQ TEMPVAL
(CADR TEMPVAL]
then (LISP:DOLIST (ARG (CDR TEMPVAL))
(APPLY 'ADDTOVAR ARG))]
(COMPILE-FILE-EXPRESSION FORM DUMMYFILE NIL PROCESS-ENTIRE-FILE)
(SKIPSEPRCODES STREAM)
(if (EOFP STREAM)
then (CLOSEF STREAM)
(for FORM in FIRSTFORMS
do (COMPILE-FILE-EXPRESSION FORM OUTPUT-FILE NIL
PROCESS-ENTIRE-FILE T))
(COPYBYTES DUMMYFILE OUTPUT-FILE 0 (GETFILEPTR DUMMYFILE))
(CLOSEF? DUMMYFILE)
(DELFILE (FULLNAME DUMMYFILE))
(AND PROCESS-ENTIRE-FILE (for EXP in (REVERSE
DEFERRED.EXPRESSIONS
)
do (APPLY* (CAR EXP)
(CDR EXP)
OUTPUT-FILE)))
(for FORM in AFTERS do (COMPILE-FILE-EXPRESSION FORM
OUTPUT-FILE NIL
PROCESS-ENTIRE-FILE T))
(RETURN))
(SETQ FORM (READ STREAM))
(GO LPDUMP))
(PRINT NIL OUTPUT-FILE))
(SETQ COMPILE.FILE.VALUE (CLOSEF OUTPUT-FILE)))) (* ;
 "Do these after UNDONLSETQ entered")
(MAPC (REVERSE COMPILE.FILE.AFTER)
(FUNCTION EVAL))
COMPILE.FILE.VALUE)))
(INTERLISP-FORMAT-P
[LAMBDA (STREAM) (* bvm%: " 3-Aug-86 14:01")
(SELCHARQ (PEEKCCODE STREAM)
(; NIL)
((^F "(")
T)
NIL])
(INTERLISP-NLAMBDA-FUNCTION-P
[LAMBDA (X) (* lmm " 7-May-86 20:12")
(AND (LITATOM X)
(FMEMB (ARGTYPE X)
'(1 3))
(NOT (LISP:SPECIAL-FORM-P X])
(COMPILE-FILE-EXPRESSION
[LAMBDA (FORM COMPILED.FILE COMPILE.TIME.TOO DEFER FORCE-OUTPUT-P)
(* ; "Edited 30-Jun-90 18:31 by nm")
(DECLARE (LISP:SPECIAL COMPILED.FILE))
(AND (LISTP FORM)
(SELECTQ (CAR FORM)
((DECLARE%: FILECREATED)
(COMPILE-FILE-SCAN-FIRST FORM COMPILED.FILE NIL T COMPILE.TIME.TOO DEFER
FORCE-OUTPUT-P))
((DEFMACRO)
(LET* ((DEFINITION (REMOVE-COMMENTS FORM))
(NAME (XCL::%%DEFINER-NAME 'DEFMACRO DEFINITION))
(BODY (XCL::%%EXPAND-DEFINER 'DEFMACRO DEFINITION)))
(LISP:EVAL BODY)
(COMPILE-FILE-EXPRESSION BODY COMPILED.FILE COMPILE.TIME.TOO DEFER
FORCE-OUTPUT-P)))
((PROGN)
(for X in (CDR FORM) do (COMPILE-FILE-EXPRESSION X COMPILED.FILE
COMPILE.TIME.TOO DEFER FORCE-OUTPUT-P)))
((QUOTE) (* ;
 " ignore top level quoted expression -i")
NIL)
((LISP:COMPILER-LET) (* ; " top level compiler-let. bind variables and recursively compile sub-expressions. This is here mainly for b PCL has top level compiler-lets")
[LET [(VARS (LISP:MAPCAR #'(LISP:LAMBDA (X)
(if (LISP:CONSP X)
then (CAR X)
else X))
(CADR FORM)))
(VALS (LISP:MAPCAR #'[LISP:LAMBDA (X)
(if (LISP:CONSP X)
then (LISP:EVAL (CADR X]
(CADR FORM]
(LISP:PROGV VARS VALS
(LISP:MAPC #'(LISP:LAMBDA (X)
(COMPILE-FILE-EXPRESSION X COMPILED.FILE
COMPILE.TIME.TOO DEFER FORCE-OUTPUT-P))
(CDDR FORM)))])
((LISP:EVAL-WHEN)
[LET [[EVAL.SPECIFIED (OR (FMEMB 'EVAL (CADR FORM))
(FMEMB 'LISP:EVAL (CADR FORM]
[LOAD.SPECIFIED (OR (FMEMB 'LOAD (CADR FORM))
(FMEMB 'LISP:LOAD (CADR FORM]
(COMPILE.SPECIFIED (OR (FMEMB 'COMPILE (CADR FORM))
(FMEMB 'LISP:COMPILE (CADR FORM]
(COND
[(NOT LOAD.SPECIFIED)
(COND
((OR COMPILE.SPECIFIED (AND COMPILE.TIME.TOO EVAL.SPECIFIED))
(for INNER-FORM in (CDDR FORM) do (EVAL INNER-FORM]
(T (for INNER-FORM in (CDDR FORM)
do (COMPILE-FILE-EXPRESSION INNER-FORM COMPILED.FILE
(OR COMPILE.SPECIFIED (AND COMPILE.TIME.TOO
EVAL.SPECIFIED))
DEFER FORCE-OUTPUT-P])
((LISP:IN-PACKAGE LISP:IN-PACKAGE) (* ;
 "These are special because they have to be dumped to the output BEFORE the package changes")
(PRINT FORM COMPILED.FILE)
(EVAL FORM))
((LISP:MAKE-PACKAGE LISP:SHADOW LISP:SHADOWING-IMPORT EXPORT LISP:UNEXPORT
LISP:USE-PACKAGE LISP:UNUSE-PACKAGE IMPORT)
(* ; "This is Special also, becouse the compiling Environment Must be changed.(see CLtL, 11.7. Package System Functions and Variables) edited by TT(10-April-90)")
(PRINT FORM COMPILED.FILE)
(EVAL FORM))
((LISP:SETQ) (* ;
 "Gasly kludge because cl:setq needs to run in the init before macroexpansion is enabled")
(COMPILE-FILE-EXPRESSION (EXPANDMACRO FORM T)
COMPILED.FILE COMPILE.TIME.TOO DEFER FORCE-OUTPUT-P))
(LET [(PROP (OR (GETPROP (CAR FORM)
'COMPILE-FILE-EXPRESSION)
(GETPROP (CAR FORM)
'COMPILE.FILE.EXPRESSION]
(if [AND (NOT PROP)
(NOT (LISP:SPECIAL-FORM-P (CAR FORM)))
(NOT (INTERLISP-NLAMBDA-FUNCTION-P (CAR FORM)))
(NEQ FORM (SETQ FORM (LISP:MACROEXPAND-1 FORM]
then (COMPILE-FILE-EXPRESSION FORM COMPILED.FILE COMPILE.TIME.TOO DEFER
FORCE-OUTPUT-P)
else (if COMPILE.TIME.TOO
then (EVAL FORM))
(if PROP
then (COMPILE.FILE.APPLY PROP FORM DEFER FORCE-OUTPUT-P)
elseif [NOT (EQUAL FORM (SETQ FORM (WALK-FORM FORM :WALK-FUNCTION
(FUNCTION
COMPILE-FILE-WALK-FUNCTION
]
then (COMPILE-FILE-EXPRESSION FORM COMPILED.FILE
COMPILE.TIME.TOO DEFER FORCE-OUTPUT-P)
else (COMPILE.FILE.APPLY (FUNCTION PRINT)
FORM DEFER FORCE-OUTPUT-P])
(COMPILE-FILE-WALK-FUNCTION
[LAMBDA (FORM) (* lmm "26-Jun-86 17:25")
(if (NLISTP FORM)
then FORM
else (LISP:VALUES FORM (INTERLISP-NLAMBDA-FUNCTION-P (CAR FORM])
(ARGTYPE.STATE
[LAMBDA NIL
(for X in ARGTYPE.VARS do (PRINTOUT T X %, (EVAL (CADR X))
T])
(COMPILE.CHECK.ARGTYPE
[LAMBDA (X AT) (* lmm "15-Jun-85 16:58")
(if (NEQ AT (LET (BLKFLG)
(COMP.ARGTYPE X)))
then (* ;
 "Incorrectly on one of the defining lists")
(for ATYPEPAIR in ARGTYPE.VARS
do (LET [(VAL (FMEMB X (EVALV (CADR ATYPEPAIR]
(if (EQ AT (CAR ATYPEPAIR))
then (if VAL
then (PRINTOUT COUTFILE "Compiler confused: " X " on "
(CADR ATYPEPAIR)
" but compiler doesn't think its a "
(CADDR ATYPEPAIR)))
[/SETTOPVAL (CADR ATYPEPAIR)
(CONS X (PROGN (GETTOPVAL (CADR ATYPEPAIR]
else (if VAL
then (PRINTOUT COUTFILE "Warning: compiler thought " X " "
(LIST 'a (OR (CADDR (ASSOC AT ARGTYPE.VARS))
"LAMBDA spread")
'function)
" was a "
(CADDR ATYPEPAIR)
" because it was incorrectly on "
(CADR ATYPEPAIR)
T)
(/SETTOPVAL (CADR ATYPEPAIR)
(REMOVE X (PROGN (GETTOPVAL (CADR ATYPEPAIR])
(COMPILE.FILE.DEFINEQ
[LAMBDA (FORM LCFIL) (* bvm%: "18-Sep-86 14:35")
(for DEF in (CDR FORM) unless (FMEMB (CAR DEF)
DONTCOMPILEFNS)
do (COMPILE.CHECK.ARGTYPE (CAR DEF)
(ARGTYPE (CADR DEF)))
(BYTECOMPILE2 (CAR DEF)
(COMPILE1A (CAR DEF)
(CADR DEF)
NIL])
(COMPILE-FILE-SETF-SYMBOL-FUNCTION
[LAMBDA (FORM LCFIL) (* bvm%: " 8-Sep-86 16:55")
(if [AND (FMEMB (CAR (LISTP (LISP:THIRD FORM)))
'(FUNCTION LISP:FUNCTION))
(EQ (CAR (LISTP (LISP:SECOND FORM)))
'QUOTE)
(LISP:CONSP (LISP:SECOND (LISP:THIRD FORM]
then (BYTECOMPILE2 (CADR (LISP:SECOND FORM))
(CADR (LISP:THIRD FORM)))
else (PRINT (WALK-FORM FORM :WALK-FUNCTION (FUNCTION COMPILE-FILE-WALK-FUNCTION))
LCFIL])
(COMPILE-FILE-EX/IMPORT
[LAMBDA (FORM LCFIL RDTBL) (* bvm%: " 3-Aug-86 15:05")
(* * "EXPORT, IMPORT, SHADOW, USE-PACKAGE are all implicitly EVAL@COMPILE, since they have to affect the package being used to read what follows")
(PRINT FORM LCFIL RDTBL)
(EVAL FORM])
(COMPILE.FILE.APPLY
[LAMBDA (PROP FORM DEFER FORCE-OUTPUT-P) (* ; "Edited 29-Jun-90 19:21 by nm")
(if FORCE-OUTPUT-P
then (PRINT FORM COMPILED.FILE)
else (if DEFER
then (push DEFERRED.EXPRESSIONS (CONS PROP FORM))
else (APPLY* PROP FORM COMPILED.FILE])
(COMPILE.FILE.RESET
[LAMBDA (COMPILED.FILE SOURCEFILE ROOTNAME) (* bvm%: " 9-Sep-86 15:16")
(* Cleans up after brecompile and
 bcompl have finished operating,)
(if (AND COMPILED.FILE (OPENP COMPILED.FILE))
then (CLOSE-AND-MAYBE-DELETE COMPILED.FILE))
(if SOURCEFILE
then (CLOSEF? SOURCEFILE))
(if (NULL RESETSTATE)
then (* Finished successfully.)
(/SETATOMVAL 'NOTCOMPILEDFILES (REMOVE ROOTNAME NOTCOMPILEDFILES))
(* Removes FILES from
 NOTCOMPILEDFILES.)])
(COMPILE-IN-CORE
[LAMBDA (fn-name fn-expr fn-type NOSAVE)
(DECLARE (SPECVARS LCFIL LAPFLG STRF SVFLG LSTFIL SPECVARS LOCALVARS DONT-TRANSFER-PUTD))
(* lmm " 2-Jun-86 22:04")
(* in-core compiling for functions and forms, without the interview.
 if X is a list, we assume that we are being called merely to display the lap
 and machine code. the form is compiled as the definition of FOO but the
 compiled :CODE is thrown away. -
 if X is a litatom, then saving, redefining, and printing is controlled by the
 flags.)
(LET ((NOREDEFINE NIL)
(PRINTLAP NIL)
(DONT-TRANSFER-PUTD T))
(RESETVARS [(NLAMA NLAMA)
(NLAML NLAML)
(LAMS LAMS)
(LAMA LAMA)
(NOFIXFNSLST NOFIXFNSLST)
(NOFIXVARSLST NOFIXVARSLST)
(COUTFILE (COND
((AND (BOUNDP 'NULLFILE)
(STREAMP NULLFILE)
(OPENP NULLFILE))
NULLFILE)
(T (SETQ NULLFILE (OPENFILE '{NULL} 'OUTPUT]
(RETURN (RESETLST (* RESETLST to provide reset context
 for macros under COMPILE1 as
 generated e.g. by DECL.)
[PROG ((LCFIL)
[LAPFLG (AND PRINTLAP (COND
(BYTECOMPFLG T)
(T 2]
(STRF (NOT NOREDEFINE))
(SVFLG (if (EQ fn-type 'SELECTOR)
then 'SELECTOR
else (NOT NOSAVE)))
(LSTFIL T)
(SPECVARS SYSSPECVARS)
(LOCALVARS T))
(RETURN (PROGN (SETQ fn-expr (COMPILE1A fn-name fn-expr T))
(PROG ((FREEVARS FREEVARS))
(RETURN (BYTECOMPILE2 fn-name fn-expr])])
)
(DEFINEQ
(COMPILE-FILE-SCAN-FIRST
[LAMBDA (FORM COMPILED.FILE FIRSTFLG DOCOPY EVAL@COMPILE DEFER FORCE-OUTPUT-P)
(* ; "Edited 30-Jun-90 18:32 by nm")
(* ; "Edited 26-Apr-90 by tt")
(* ;
 "This is enhancement for Fake Compiler's interpretation of file package coms")
(PROG ((DFNFLG DFNFLG)
(FIRST FIRSTFLG)
(DOCOPY DOCOPY)
(EVAL@COMPILE EVAL@COMPILE)
NOTFIRST)
(if (LISTP FORM)
then
(SELECTQ (CAR FORM)
((DECLARE%:)
(LISP:DO ((TAIL (CDR FORM)
(CDR TAIL)))
((LISP:ENDP TAIL))
[if (LISP:SYMBOLP (CAR TAIL))
then (CASE (CAR TAIL)
((DOCOPY COPY) (SETQ DOCOPY T))
((DONTCOPY) (SETQ DOCOPY NIL))
((COPYWHEN) [SETQ DOCOPY (EVAL (CAR (SETQ TAIL
(CDR TAIL])
((EVAL@LOAD DOEVAL@LOAD DONTEVAL@LOAD) NIL)
((EVAL@LOADWHEN) (LISP:POP TAIL))
((EVAL@COMPILE DOEVAL@COMPILE) (SETQ EVAL@COMPILE T))
((DONTEVAL@COMPILE) (SETQ EVAL@COMPILE NIL))
((EVAL@COMPILEWHEN) [SETQ EVAL@COMPILE
(EVAL (CAR (SETQ TAIL (CDR TAIL])
((FIRST)
(SETQ FIRST T)
(SETQ NOTFIRST NIL))
(* ; "for First")
((NOTFIRST)
(SETQ NOTFIRST T)
(SETQ FIRST NIL))
(* ; "for Not First")
((COMPILERVARS) (SETQ DFNFLG T))
(* ; "for Compilervars")
(LISP:OTHERWISE (LISP:FORMAT COUTFILE
"Warning: Ignoring unrecognized DECLARE: tag: ~S~%%"
(CAR TAIL))))
else (COND
((EQ 'DECLARE%: (CAR (CAR TAIL)))
(COMPILE-FILE-SCAN-FIRST (CAR TAIL)
COMPILED.FILE FIRST DOCOPY EVAL@COMPILE DEFER))
(T (LISP:WHEN EVAL@COMPILE
(EVAL (CAR TAIL)))
(LISP:WHEN DOCOPY
(LISP:IF FIRST
(SETQ FIRSTFORMS (NCONC1 FIRSTFORMS (CAR TAIL)))
(LISP:IF NOTFIRST
(SETQ AFTERS (NCONC1 AFTERS (CAR TAIL)))
(COMPILE-FILE-EXPRESSION (CAR TAIL)
COMPILED.FILE EVAL@COMPILE DEFER
FORCE-OUTPUT-P))))]))
((FILECREATED)
(if FORCE-OUTPUT-P
then (PRINT FORM COMPILED.FILE)
else (SETQ FIRSTFORMS (NCONC1 FIRSTFORMS FORM))))
NIL])
)
(* ; "This function is support for AR#11185")
(RPAQQ ARGTYPE.VARS ((1 NLAML "NLAMBDA spread")
(2 LAMA "LAMBDA nospread")
(0 LAMS "LAMBDA spread")
(3 NLAMA "NLAMBDA no-spread")))
(PUTPROPS DEFINEQ COMPILE-FILE-EXPRESSION COMPILE.FILE.DEFINEQ)
(PUTPROPS * COMPILE-FILE-EXPRESSION NILL)
(PUTPROPS SETF-SYMBOL-FUNCTION COMPILE-FILE-EXPRESSION COMPILE-FILE-SETF-SYMBOL-FUNCTION)
(PUTPROPS PRETTYCOMPRINT COMPILE-FILE-EXPRESSION NILL)
(LISP:DEFUN COMPILE-FILE-DECLARE%: (FORM COMPILED.FILE EVAL@COMPILE DOCOPY DEFER)
(LISP:DO ((TAIL (CDR FORM)
(CDR TAIL)))
((LISP:ENDP TAIL))
(LISP:IF (LISP:SYMBOLP (CAR TAIL))
(CASE (CAR TAIL)
((EVAL@LOAD DOEVAL@LOAD DONTEVAL@LOAD) NIL)
((EVAL@LOADWHEN) (LISP:POP TAIL))
((EVAL@COMPILE DOEVAL@COMPILE) (SETQ EVAL@COMPILE T))
((DONTEVAL@COMPILE) (SETQ EVAL@COMPILE NIL))
((EVAL@COMPILEWHEN) [SETQ EVAL@COMPILE (EVAL (CAR (SETQ TAIL (CDR TAIL])
((COPY DOCOPY) (SETQ DOCOPY T))
((DONTCOPY) (SETQ DOCOPY NIL))
((COPYWHEN) [SETQ DOCOPY (EVAL (CAR (SETQ TAIL (CDR TAIL])
((FIRST) )
((NOTFIRST COMPILERVARS) )
(LISP:OTHERWISE (LISP:FORMAT COUTFILE
"Warning: Ignoring unrecognized DECLARE: tag: ~S~%%"
(CAR TAIL))))
[COND
((EQ 'DECLARE%: (CAR (CAR TAIL)))
(COMPILE-FILE-DECLARE%: (CAR TAIL)
COMPILED.FILE EVAL@COMPILE DOCOPY DEFER))
(T (LISP:WHEN EVAL@COMPILE
(EVAL (CAR TAIL)))
(LISP:WHEN DOCOPY
(COMPILE-FILE-EXPRESSION (CAR TAIL)
COMPILED.FILE EVAL@COMPILE DEFER))])))
(DEFINEQ
(NEWDEFC
[LAMBDA (NM DF) (* bvm%: "30-Sep-86 23:12")
[COND
((EQ SVFLG 'DEFER)
(push COMPILE.FILE.AFTER (LIST (FUNCTION NEWDEFC)
(KWOTE NM)
(KWOTE DF)
T)))
((OR (NULL DFNFLG)
(EQ DFNFLG T))
[COND
((GETD NM)
(VIRGINFN NM T)
(COND
((NULL DFNFLG)
(LISP:FORMAT *ERROR-OUTPUT* "~&(~S redefined)~%%" NM)
(SAVEDEF NM]
(/PUTD NM DF T))
(T
(* ;; "Save on CODE prop. Be nice and change it from archaic CCODEP object to modern compiled code object.")
(/PUTPROP NM 'CODE (if (ARRAYP DF)
then (create COMPILED-CLOSURE
FNHEADER _ (fetch (ARRAYP BASE) of DF))
else DF]
DF])
)
(DECLARE%: DONTEVAL@LOAD DOCOPY
(MOVD 'NEWDEFC 'DEFC)
)
(PUTPROPS CMLCOMPILE FILETYPE LISP:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA FAKE-COMPILE-FILE)
)
(PUTPROPS CMLCOMPILE COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1990 1991 1992 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (2394 23384 (FAKE-COMPILE-FILE 2404 . 8967) (INTERLISP-FORMAT-P 8969 . 9191) (
INTERLISP-NLAMBDA-FUNCTION-P 9193 . 9429) (COMPILE-FILE-EXPRESSION 9431 . 15709) (
COMPILE-FILE-WALK-FUNCTION 15711 . 15960) (ARGTYPE.STATE 15962 . 16124) (COMPILE.CHECK.ARGTYPE 16126
. 18118) (COMPILE.FILE.DEFINEQ 18120 . 18615) (COMPILE-FILE-SETF-SYMBOL-FUNCTION 18617 . 19227) (
COMPILE-FILE-EX/IMPORT 19229 . 19557) (COMPILE.FILE.APPLY 19559 . 19921) (COMPILE.FILE.RESET 19923 .
20784) (COMPILE-IN-CORE 20786 . 23382)) (23385 27623 (COMPILE-FILE-SCAN-FIRST 23395 . 27621)) (29617
30683 (NEWDEFC 29627 . 30681)))))
STOP

BIN
CLTL2/CMLCOMPILE.LCOM Normal file

Binary file not shown.

248
CLTL2/CMLDEFFER Normal file
View File

@@ -0,0 +1,248 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "XCL")
(IL:FILECREATED "24-Mar-92 14:56:18" IL:|{DSK}<usr>local>lde>lispcore>sources>CMLDEFFER.;3| 40644
IL:|changes| IL:|to:| (IL:VARS IL:CMLDEFFERCOMS)
IL:|previous| IL:|date:| " 4-Jan-92 15:32:26"
IL:|{DSK}<usr>local>lde>lispcore>sources>CMLDEFFER.;2|)
; Copyright (c) 1986, 1900, 1987, 1988, 1990, 1992 by Venue & Xerox Corporation. All rights reserved.
(IL:PRETTYCOMPRINT IL:CMLDEFFERCOMS)
(IL:RPAQQ IL:CMLDEFFERCOMS ((IL:* IL:|;;;| "DEF-DEFINE-TYPE and DEFDEFINER -- Your One-Stop Providers of Customized File Manager Facilities.") (IL:* IL:|;;| "BE VERY CAREFUL CHANGING ANYTHING IN THIS FILE!!! It is heavily self-referential and thick with bootstrapping problems. All but the most trivial changes (and some of those) are very tricky to make without blowing yourself out of the water... You have been warned.") (IL:* IL:|;;;| "Also see the file deffer-runtime for stuff that must be defined before fasl files may be loaded into the init") (IL:COMS (IL:* IL:\; "Filepkg interface") (IL:FUNCTIONS REMOVE-COMMENTS PPRINT-DEFINER PPRINT-DEFINER-FITP PPRINT-DEFINER-RECURSE) (IL:VARIABLES IL:*REMOVE-INTERLISP-COMMENTS*) (IL:* IL:\; "Share with xcl?") (IL:FUNCTIONS %DEFINE-TYPE-DELDEF %DEFINE-TYPE-GETDEF %DEFINE-TYPE-FILE-DEFINITIONS %DEFINE-TYPE-FILEGETDEF %DEFINE-TYPE-SAVE-DEFN %DEFINE-TYPE-PUTDEF)) (IL:COMS (IL:* IL:\; "Compatibility with old cmldeffer") (IL:DECLARE\: IL:DOCOPY IL:DONTEVAL@LOAD (IL:P (IL:MOVD (QUOTE %DEFINE-TYPE-DELDEF) (QUOTE IL:\\DEFINE-TYPE-DELDEF)) (IL:MOVD (QUOTE %DEFINE-TYPE-GETDEF) (QUOTE IL:\\DEFINE-TYPE-GETDEF)) (IL:MOVD (QUOTE %DEFINE-TYPE-FILE-DEFINITIONS) (QUOTE IL:\\DEFINE-TYPE-FILE-DEFINITIONS)) (IL:MOVD (QUOTE %DEFINE-TYPE-FILEGETDEF) (QUOTE IL:\\DEFINE-TYPE-FILEGETDEF)) (IL:MOVD (QUOTE %DEFINE-TYPE-SAVE-DEFN) (QUOTE IL:\\DEFINE-TYPE-SAVE-DEFN)) (IL:MOVD (QUOTE %DEFINE-TYPE-PUTDEF) (QUOTE IL:\\DEFINE-TYPE-PUTDEF)) (IL:MOVD (QUOTE PPRINT-DEFINER) (QUOTE IL:PPRINT-DEFINER))))) (IL:DECLARE\: IL:DOCOPY IL:DONTEVAL@LOAD (IL:P (IL:* IL:|;;| "Set up fake definer prototype stuff for FNS") (ADD-PROTOTYPE-FN (QUOTE IL:FNS) (QUOTE IL:NLAMBDA) (FUNCTION (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (IL:DEFINEQ ((IL:\\\, NAME) (IL:NLAMBDA (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE)))))))))) (ADD-PROTOTYPE-FN (QUOTE IL:FNS) (QUOTE IL:LAMBDA) (FUNCTION (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (IL:DEFINEQ ((IL:\\\, NAME) (IL:LAMBDA (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE)))))))))))) (IL:COMS (IL:* IL:\; "The groundwork for bootstrapping ") (IL:DEFINE-TYPES IL:DEFINE-TYPES IL:FUNCTIONS IL:VARIABLES) (IL:* IL:\; "DefDefiner itself and friends") (IL:FUNCTIONS SI::EXPANSION-FUNCTION SI::MACRO-FUNCALL WITHOUT-FILEPKG)) (IL:COMS (IL:* IL:\; "Compatibility with old cmldeffer") (IL:FUNCTIONS IL:WITHOUT-FILEPKG)) (IL:COMS (IL:* IL:\; "Some special forms") (IL:FUNCTIONS DEFINER DEFINER-VARIABLE-TYPE NAMED-PROGN)) (IL:COMS (IL:* IL:\; "Auxiliary functions") (IL:FUNCTIONS GET-DEFINER-NAME %DELETE-DEFINER) (IL:FUNCTIONS DEF-DEFINE-TYPE DEFDEFINER DEFDEFINER-VARIABLE-TYPE) (IL:FUNCTIONS %EXPAND-DEFINER %DEFINER-NAME)) (IL:COMS (IL:* IL:\; "The most commonly-used definers") (IL:FUNCTIONS DEFUN DEFINLINE DEFMACRO) (IL:FUNCTIONS DEFVAR DEFPARAMETER DEFCONSTANT DEFGLOBALVAR DEFGLOBALPARAMETER)) (IL:COMS (IL:* IL:\; "Here so that the evaluator can be in the init without definers being in the init.") (IL:DEFINE-TYPES IL:SPECIAL-FORMS) (IL:FUNCTIONS %REMOVE-SPECIAL-FORM) (IL:FUNCTIONS DEFINE-SPECIAL-FORM) (IL:* IL:\; "Form for defining interpreters of special forms")) (IL:COMS (IL:* IL:\; "Don't note changes to these properties/variables") (IL:PROP IL:PROPTYPE IL:MACRO-FN :UNDEFINERS IL:UNDEFINERS :DEFINER-FOR IL:DEFINER-FOR :DEFINED-BY IL:DEFINED-BY :DEFINITION-NAME IL:DEFINITION-NAME) (IL:* IL:\; "Templates for definers not defined here. These should really be where they're defined.") (IL:PROP :DEFINITION-PRINT-TEMPLATE DEFCOMMAND DEFINE-CONDITION DEFINE-MODIFY-MACRO DEFINE-SETF-METHOD DEFSETF DEFSTRUCT DEFTYPE)) (IL:* IL:|;;| "Arrange for the correct compiler to be used.") (IL:PROP (IL:FILETYPE IL:MAKEFILE-ENVIRONMENT) IL:CMLDEFFER)))
(IL:* IL:|;;;|
"DEF-DEFINE-TYPE and DEFDEFINER -- Your One-Stop Providers of Customized File Manager Facilities.")
(IL:* IL:|;;|
"BE VERY CAREFUL CHANGING ANYTHING IN THIS FILE!!! It is heavily self-referential and thick with bootstrapping problems. All but the most trivial changes (and some of those) are very tricky to make without blowing yourself out of the water... You have been warned."
)
(IL:* IL:|;;;|
"Also see the file deffer-runtime for stuff that must be defined before fasl files may be loaded into the init"
)
(IL:* IL:\; "Filepkg interface")
(DEFUN REMOVE-COMMENTS (X) (IL:* IL:|;;;| "Removes SEdit-style comments from the given list structure.") (COND ((NOT (CONSP X)) X) ((AND (CONSP (CAR X)) (EQ (CAAR X) (QUOTE IL:*)) (CONSP (CDAR X)) (OR (MEMBER (CADAR X) (QUOTE (IL:\; IL:|;;| IL:|;;;| IL:|;;;;| IL:\|)) :TEST (FUNCTION EQ)) (IL:* IL:\; "a sedit comment") (EQ IL:*REMOVE-INTERLISP-COMMENTS* T) (IL:* IL:\; "always strip") (PROGN (IF (EQ IL:*REMOVE-INTERLISP-COMMENTS* (QUOTE :WARN)) (WARN "Possible comment not stripped ~S" (CAR X))) NIL))) (REMOVE-COMMENTS (CDR X))) (T (LET ((A (REMOVE-COMMENTS (CAR X))) (D (REMOVE-COMMENTS (CDR X)))) (IF (AND (EQ A (CAR X)) (EQ D (CDR X))) X (CONS A D))))))
(DEFUN PPRINT-DEFINER (DEFINE-EXPRESSION) (DECLARE (SPECIAL IL:FORMFLG IL:SPACEWIDTH)) (IL:* IL:\; "Bound in prettyprinter") (COND ((OR (NULL IL:FORMFLG) (ATOM (CDR DEFINE-EXPRESSION))) (IL:* IL:\; "Degenerate cases or printing as a quoted form--punt to default prettyprinting") DEFINE-EXPRESSION) (T (LET ((IL:TAIL DEFINE-EXPRESSION) (IL:LEFT (IL:DSPXPOSITION)) TEMPLATE TOP-LEVEL-P NEXT TYPE FORM NEWLINEP) (DECLARE (SPECIAL IL:TAIL IL:LEFT)) (IL:* IL:\; "For comment printer") (SETQ TOP-LEVEL-P (EQ IL:LEFT (IL:DSPLEFTMARGIN))) (IL:* IL:\; "Printing definition to file, etc.") (SETQ IL:LEFT (+ IL:LEFT (* 3 IL:SPACEWIDTH))) (IL:* IL:\; "Place we will indent body") (IL:PRIN1 "(") (IL:PRIN2 (CAR IL:TAIL)) (SETQ TEMPLATE (OR (GET (POP IL:TAIL) :DEFINITION-PRINT-TEMPLATE) (QUOTE (:NAME)))) (IL:* IL:|;;| "This code should, and doesn't, pay attention to the NAME function to determine where the name is to decide what should and shouldn't be bold. Right now, it always bolds the second thing. Fortunately, we currently don't have any definers that don't have either the second or CAR of the second as the definition name.") (IL:* IL:|;;| "Also, this code should be careful about calling the NAME function on the form. Sometimes, the form is not really a call to the definer but instead a back-quoted expression in a macro. In most such cases, the name is not really there; some comma-quoted expression is there instead.") (IL:WHILE (CONSP IL:TAIL) IL:DO (COND ((AND (LISTP (SETQ NEXT (CAR IL:TAIL))) (EQ (CAR NEXT) IL:COMMENTFLG) (IL:SEMI-COLON-COMMENT-P NEXT)) (IL:* IL:\; "Comments can appear anywhere, so print this one without consuming the template. ENDLINE has side effect of printing comments") (IL:SUBPRINT/ENDLINE IL:LEFT *STANDARD-OUTPUT*) (SETQ NEWLINEP T)) ((OR (ATOM TEMPLATE) (EQ (SETQ TYPE (POP TEMPLATE)) :BODY)) (IL:* IL:\; "Once we hit the body, there's nothing more special to do.") (RETURN)) (T (IL:SPACES 1) (CASE TYPE (:NAME (IL:* IL:\; "Embolden the name of this thing") (SETQ NEWLINEP NIL) (COND ((NOT TOP-LEVEL-P) (IL:* IL:\; "Nothing special here--could even be a backquoted thing") (PPRINT-DEFINER-RECURSE)) (T (POP IL:TAIL) (COND ((CONSP NEXT) (IL:* IL:\; "Name is a list. Assume the real name is the car and the rest is an options list or something") (UNLESS (EQ (IL:DSPYPOSITION) (PROGN (IL:PRIN1 "(") (IL:PRINTOUT NIL IL:.FONT IL:LAMBDAFONT IL:.P2 (CAR NEXT) IL:.FONT IL:DEFAULTFONT) (IL:SPACES 1) (IL:PRINTDEF (CDR NEXT) T T T IL:FNSLST) (IL:PRIN1 ")") (IL:DSPYPOSITION))) (IL:* IL:\; "This thing took more than one line to print, so go to new line") (IL:SUBPRINT/ENDLINE IL:LEFT *STANDARD-OUTPUT*) (SETQ NEWLINEP T))) (T (IL:* IL:\; "Atomic name is bold") (IL:PRINTOUT NIL IL:.FONT IL:LAMBDAFONT IL:.P2 NEXT IL:.FONT IL:DEFAULTFONT)))))) (:ARG-LIST (IL:* IL:\; "NEXT is some sort of argument list. ") (COND ((NULL NEXT) (IL:* IL:\; "If NIL, be sure to print as ()") (IL:PRIN1 "()") (POP IL:TAIL)) (T (PPRINT-DEFINER-RECURSE))) (SETQ NEWLINEP NIL)) (T (IL:* IL:\; "Just print it, perhaps starting a new line") (UNLESS (OR NEWLINEP (PPRINT-DEFINER-FITP NEXT)) (IL:* IL:\; "Go to new line if getting crowded") (IL:PRINENDLINE IL:LEFT)) (PPRINT-DEFINER-RECURSE) (SETQ NEWLINEP NIL)))))) (IL:* IL:|;;| "We've now gotten to the end of stuff we know how to print. Just prettyprint the rest") (UNLESS (NULL IL:TAIL) (COND (NEWLINEP (IL:* IL:\; "Already on new line")) ((OR (EQ TYPE :BODY) (NOT (PPRINT-DEFINER-FITP (CAR IL:TAIL)))) (IL:* IL:\; "Go to new line and indent a bit. Always do this for the part matching &BODY, whether or not the prettyprinter thought that the remainder would \"fit\"") (IL:PRINENDLINE IL:LEFT NIL T)) (T (IL:SPACES 1))) (IL:WHILE (AND (CONSP IL:TAIL) (ATOM (SETQ FORM (CAR IL:TAIL)))) IL:DO (IL:* IL:|;;| "Print this doc string or whatever on its own line. This is because otherwise the prettyprinter gets confused and tries to put the next thing after the string") (PPRINT-DEFINER-RECURSE) (WHEN (AND (KEYWORDP FORM) (CONSP IL:TAIL)) (IL:* IL:\; "Some sort of keyword-value pair stuff--print it on same line") (IL:SPACES 1) (PPRINT-DEFINER-RECURSE)) (WHEN (NULL IL:TAIL) (RETURN)) (IL:SUBPRINT/ENDLINE IL:LEFT *STANDARD-OUTPUT*)) (IL:PRINTDEF IL:TAIL T T T IL:FNSLST)) (IL:PRIN1 ")") NIL))))
(DEFUN PPRINT-DEFINER-FITP (ITEM) (IL:* IL:|;;| "True if it won't look silly to try to print ITEM at current position instead of starting new line") (IF (CONSP ITEM) (OR (EQ (CAR ITEM) IL:COMMENTFLG) (AND (< (IL:COUNT ITEM) 20) (IL:FITP ITEM))) (< (+ (IL:DSPXPOSITION) (IL:STRINGWIDTH ITEM *STANDARD-OUTPUT*)) (IL:DSPRIGHTMARGIN))))
(DEFUN PPRINT-DEFINER-RECURSE NIL (IL:* IL:|;;| "Print and pop the next element. Prettyprinter uses the variable IL:TAIL for lookahead") (DECLARE (SPECIAL IL:TAIL)) (IL:SUPERPRINT (CAR IL:TAIL) IL:TAIL NIL *STANDARD-OUTPUT*) (SETQ IL:TAIL (CDR IL:TAIL)))
(DEFVAR IL:*REMOVE-INTERLISP-COMMENTS* (QUOTE :WARN) "Either NIL (don't) T (always do) or :WARN (don't and warn)")
(IL:* IL:\; "Share with xcl?")
(DEFUN %DEFINE-TYPE-DELDEF (NAME TYPE) (IL:* IL:|;;| "DELETE definition of definer-defined NAME as TYPE ") (UNDOABLY-SETF (DOCUMENTATION NAME TYPE) NIL) (LET* ((HT (GETHASH TYPE *DEFINITION-HASH-TABLE*)) (DEFN (AND HT (GETHASH NAME HT)))) (AND HT (IL:/PUTHASH NAME NIL HT)) (DOLIST (FN (OR (GET TYPE (QUOTE :UNDEFINERS)) (GET TYPE (QUOTE IL:UNDEFINERS)))) (FUNCALL FN NAME)) (DOLIST (FN (OR (GET (CAR DEFN) (QUOTE :UNDEFINERS)) (GET (CAR DEFN) (QUOTE IL:UNDEFINERS)))) (FUNCALL FN NAME)) NAME))
(DEFUN %DEFINE-TYPE-GETDEF (NAME TYPE OPTIONS) (IL:* IL:|;;| "GETDEF method for all definers. The EDIT is so that when you say EDITDEF you get a copy & can know when you made edits.") (LET* ((HASH-TABLE (GETHASH TYPE *DEFINITION-HASH-TABLE*)) (DEFN (AND HASH-TABLE (GETHASH NAME HASH-TABLE)))) (IF (TYPECASE OPTIONS (CONS (MEMBER (QUOTE IL:EDIT) OPTIONS :TEST (FUNCTION EQ))) (T (EQ OPTIONS (QUOTE IL:EDIT)))) (COPY-TREE DEFN) DEFN)))
(DEFUN %DEFINE-TYPE-FILE-DEFINITIONS (TYPE NAMES) (IL:* IL:|;;| "get the definitions for NAMES suitable for printing on a file. Like GETDEF but checks.") (MAPCAR (FUNCTION (LAMBDA (NAME) (LET ((DEF (%DEFINE-TYPE-GETDEF NAME TYPE (QUOTE (IL:NOCOPY))))) (IF (NULL DEF) (ERROR (QUOTE IL:NO-SUCH-DEFINITION) :NAME NAME :TYPE TYPE) DEF)))) NAMES))
(DEFUN %DEFINE-TYPE-FILEGETDEF (NAME TYPE SOURCE OPTIONS NOTFOUND) (LET ((VAL (IL:LOADFNS NIL SOURCE (QUOTE IL:GETDEF) (IL:* IL:|;;| "The bletcherous lambda form is require by the interface to loadfns (can't pass a closure)") (IL:BQUOTE (IL:LAMBDA (FIRST SECOND) (AND (MEMBER FIRST (QUOTE (IL:\\\, (OR (GET TYPE (QUOTE :DEFINED-BY)) (GET TYPE (QUOTE IL:DEFINED-BY))))) :TEST (FUNCTION EQ)) (LET ((NAMER (OR (GET FIRST (QUOTE :DEFINITION-NAME)) (GET FIRST (QUOTE IL:DEFINITION-NAME)) (QUOTE SECOND)))) (IF (EQ NAMER (QUOTE SECOND)) (EQUAL SECOND (QUOTE (IL:\\\, NAME))) (EQUAL (FUNCALL NAMER (REMOVE-COMMENTS (IL:READ))) (QUOTE (IL:\\\, NAME))))))))))) (COND ((EQ (CAAR VAL) (QUOTE IL:NOT-FOUND\:)) NOTFOUND) ((CDR VAL) (CONS (QUOTE PROGN) VAL)) (T (CAR VAL)))))
(DEFUN %DEFINE-TYPE-SAVE-DEFN (NAME TYPE DEFINITION) (SETQ TYPE (IL:GETFILEPKGTYPE TYPE (QUOTE TYPE))) (LET ((HASH-TABLE (GETHASH TYPE *DEFINITION-HASH-TABLE*))) (WHEN (NULL HASH-TABLE) (WARN "Couldn't find a hash-table for ~S definitions.~%One will be created." TYPE) (SETQ HASH-TABLE (SETF (GETHASH TYPE *DEFINITION-HASH-TABLE*) (MAKE-HASH-TABLE :TEST (FUNCTION EQUAL) :SIZE 50 :REHASH-SIZE 50)))) (LET ((OLD-DEFINITION (GETHASH NAME HASH-TABLE))) (UNLESS (EQUAL DEFINITION OLD-DEFINITION) (WHEN (AND OLD-DEFINITION (NOT (EQ IL:DFNFLG T))) (FORMAT *TERMINAL-IO* "~&New ~A definition for ~S~:[~; (but not installed)~].~%" TYPE NAME (MEMBER IL:DFNFLG (QUOTE (IL:PROP IL:ALLPROP)) :TEST (FUNCTION EQ)))) (IL:/PUTHASH NAME DEFINITION HASH-TABLE) (IL:MARKASCHANGED NAME TYPE (IF OLD-DEFINITION (QUOTE IL:CHANGED) (QUOTE IL:DEFINED)))))))
(DEFUN %DEFINE-TYPE-PUTDEF (NAME TYPE DEFINITION REASON) (IF (NULL DEFINITION) (%DEFINE-TYPE-DELDEF NAME TYPE) (LET ((DEFN-WITHOUT-COMMENTS (REMOVE-COMMENTS DEFINITION))) (UNLESS (AND (CONSP DEFN-WITHOUT-COMMENTS) (MEMBER (CAR DEFN-WITHOUT-COMMENTS) (OR (GET TYPE (QUOTE :DEFINED-BY)) (GET TYPE (QUOTE IL:DEFINED-BY))) :TEST (FUNCTION EQ)) (EQUAL NAME (FUNCALL (OR (GET (CAR DEFN-WITHOUT-COMMENTS) (QUOTE :DEFINITION-NAME)) (GET (CAR DEFN-WITHOUT-COMMENTS) (QUOTE IL:DEFINITION-NAME)) (QUOTE SECOND)) DEFN-WITHOUT-COMMENTS))) (SIGNAL (QUOTE IL:DEFINER-MISMATCH) :NAME NAME :TYPE TYPE :DEFINITION DEFINITION)) (SETQ DEFINITION (COPY-TREE DEFINITION)) (EVAL (IF IL:LISPXHIST (MAKE-UNDOABLE DEFINITION) DEFINITION)))))
(IL:* IL:\; "Compatibility with old cmldeffer")
(IL:DECLARE\: IL:DOCOPY IL:DONTEVAL@LOAD
(IL:MOVD (QUOTE %DEFINE-TYPE-DELDEF) (QUOTE IL:\\DEFINE-TYPE-DELDEF))
(IL:MOVD (QUOTE %DEFINE-TYPE-GETDEF) (QUOTE IL:\\DEFINE-TYPE-GETDEF))
(IL:MOVD (QUOTE %DEFINE-TYPE-FILE-DEFINITIONS) (QUOTE IL:\\DEFINE-TYPE-FILE-DEFINITIONS))
(IL:MOVD (QUOTE %DEFINE-TYPE-FILEGETDEF) (QUOTE IL:\\DEFINE-TYPE-FILEGETDEF))
(IL:MOVD (QUOTE %DEFINE-TYPE-SAVE-DEFN) (QUOTE IL:\\DEFINE-TYPE-SAVE-DEFN))
(IL:MOVD (QUOTE %DEFINE-TYPE-PUTDEF) (QUOTE IL:\\DEFINE-TYPE-PUTDEF))
(IL:MOVD (QUOTE PPRINT-DEFINER) (QUOTE IL:PPRINT-DEFINER))
)
(IL:DECLARE\: IL:DOCOPY IL:DONTEVAL@LOAD
(IL:* IL:|;;| "Set up fake definer prototype stuff for FNS")
(ADD-PROTOTYPE-FN (QUOTE IL:FNS) (QUOTE IL:NLAMBDA) (FUNCTION (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (IL:DEFINEQ ((IL:\\\, NAME) (IL:NLAMBDA (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE))))))))))
(ADD-PROTOTYPE-FN (QUOTE IL:FNS) (QUOTE IL:LAMBDA) (FUNCTION (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (IL:DEFINEQ ((IL:\\\, NAME) (IL:LAMBDA (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE))))))))))
)
(IL:* IL:\; "The groundwork for bootstrapping ")
(DEF-DEFINE-TYPE IL:DEFINE-TYPES "Definition type")
(DEF-DEFINE-TYPE IL:FUNCTIONS "Common Lisp functions/macros" :UNDEFINER IL:UNDOABLY-FMAKUNBOUND)
(DEF-DEFINE-TYPE IL:VARIABLES "Common Lisp variables" :UNDEFINER UNDOABLY-MAKUNBOUND)
(IL:* IL:\; "DefDefiner itself and friends")
(DEFUN SI::EXPANSION-FUNCTION (NAME ARG-LIST BODY) (IL:* IL:|;;;| "Shared code between DEFMACRO and DEFDEFINER. Takes the parts of a DEFMACRO and returns two values: a LAMBDA form for the expansion function, and the documentation string found, if any.") (MULTIPLE-VALUE-BIND (PARSED-BODY PARSED-DECLARATIONS PARSED-DOCSTRING) (IL:PARSE-DEFMACRO ARG-LIST (QUOTE SI::$$MACRO-FORM) BODY NAME NIL :ENVIRONMENT (QUOTE SI::$$MACRO-ENVIRONMENT)) (VALUES (IL:BQUOTE (LAMBDA (SI::$$MACRO-FORM SI::$$MACRO-ENVIRONMENT) (IL:\\\,@ PARSED-DECLARATIONS) (BLOCK (IL:\\\, NAME) (IL:\\\, PARSED-BODY)))) PARSED-DOCSTRING)))
(DEFMACRO SI::MACRO-FUNCALL (EXPANSION-FUNCTION MACRO-CALL ENV) (IL:* IL:|;;;| "Used by DEFDEFINER as a mechanism for delaying macro-expansion until after checking the value of DFNFLG. The arguments (unevaluated) are a macro-expansion function and a call on that macro. The call to MACRO-FUNCALL should expand into the result of expanding the given macro-call.") (FUNCALL EXPANSION-FUNCTION MACRO-CALL ENV))
(DEFMACRO WITHOUT-FILEPKG (&BODY BODY) (IL:BQUOTE (PROGN (EVAL-WHEN (LOAD) (IL:\\\,@ BODY)) (EVAL-WHEN (EVAL) (UNLESS (OR (EQ IL:DFNFLG (QUOTE IL:PROP)) (EQ IL:DFNFLG (QUOTE IL:ALLPROP))) (LET ((IL:FILEPKGFLG NIL) (IL:DFNFLG T)) (IL:\\\,@ BODY)))))))
(IL:* IL:\; "Compatibility with old cmldeffer")
(DEFMACRO IL:WITHOUT-FILEPKG (&BODY BODY) (IL:BQUOTE (WITHOUT-FILEPKG (IL:\\\,@ BODY))))
(IL:* IL:\; "Some special forms")
(DEFMACRO DEFINER (TYPE NAME DEFINITION &OPTIONAL ENV) (LET* ((EXPANDER (GET NAME :DEFINITION-EXPANDER)) (DEFINITION-WITHOUT-COMMENTS (REMOVE-COMMENTS DEFINITION)) (DEFINITION-NAME (FUNCALL (GET NAME :DEFINITION-NAME) DEFINITION-WITHOUT-COMMENTS))) (IL:BQUOTE (PROGN (WITHOUT-FILEPKG (SI::MACRO-FUNCALL (IL:\\\, EXPANDER) (IL:\\\, DEFINITION-WITHOUT-COMMENTS) (IL:\\\, ENV))) (EVAL-WHEN (EVAL) (UNLESS (NULL IL:FILEPKGFLG) (%DEFINE-TYPE-SAVE-DEFN (QUOTE (IL:\\\, DEFINITION-NAME)) (QUOTE (IL:\\\, TYPE)) (QUOTE (IL:\\\, DEFINITION))))) (QUOTE (IL:\\\, DEFINITION-NAME))))))
(DEFMACRO DEFINER-VARIABLE-TYPE (NAME DEFINITION &OPTIONAL ENV) (LET* ((DEFINITION-WITHOUT-COMMENTS (REMOVE-COMMENTS DEFINITION)) (TYPE (FUNCALL (GET NAME :TYPE-DISCRIMINATOR) DEFINITION-WITHOUT-COMMENTS)) (EXPANDER (GETF (GET NAME :DEFINITION-EXPANDER) TYPE)) (DEFINITION-NAME (FUNCALL (GET NAME :DEFINITION-NAME) DEFINITION-WITHOUT-COMMENTS))) (IL:BQUOTE (PROGN (WITHOUT-FILEPKG (SI::MACRO-FUNCALL (IL:\\\, EXPANDER) (IL:\\\, DEFINITION-WITHOUT-COMMENTS) (IL:\\\, ENV))) (EVAL-WHEN (EVAL) (UNLESS (NULL IL:FILEPKGFLG) (%DEFINE-TYPE-SAVE-DEFN (QUOTE (IL:\\\, DEFINITION-NAME)) (QUOTE (IL:\\\, TYPE)) (QUOTE (IL:\\\, DEFINITION))))) (QUOTE (IL:\\\, DEFINITION-NAME))))))
(DEFMACRO NAMED-PROGN (DEFINER NAME &REST FORMS) (IL:* IL:|;;| "Used by the compiler when processing definers") (IL:BQUOTE (PROGN (IL:\\\,@ FORMS) (QUOTE (IL:\\\, NAME)))))
(IL:* IL:\; "Auxiliary functions")
(DEFUN GET-DEFINER-NAME (DEFINER STRING) (VALUES (INTERN (CONCATENATE (QUOTE STRING) STRING (STRING DEFINER)) (SYMBOL-PACKAGE DEFINER))))
(DEFUN %DELETE-DEFINER (NAME) (AND (SYMBOLP NAME) (LET ((TYPE (OR (GET NAME (QUOTE :DEFINER-FOR)) (GET NAME (QUOTE IL:DEFINER-FOR))))) (IL:/REMPROP NAME (QUOTE :DEFINER-FOR)) (IL:/REMPROP NAME (QUOTE IL:DEFINER-FOR)) (IL:/REMPROP NAME (QUOTE :DEFINITION-NAME)) (IL:/REMPROP NAME (QUOTE IL:DEFINITION-NAME)) (IL:/REMPROP NAME (QUOTE :DEFINITION-EXPANDER)) (WHEN TYPE (IF (GET TYPE (QUOTE :DEFINED-BY)) (IL:/PUTPROP TYPE (QUOTE :DEFINED-BY) (REMOVE NAME (GET TYPE (QUOTE :DEFINED-BY)))) (IL:/PUTPROP TYPE (QUOTE IL:DEFINED-BY) (REMOVE NAME (GET TYPE (QUOTE IL:DEFINED-BY))))) (IL:* IL:|;;| "need to remove the prototype function!") (LET* ((LOOKUP-TYPE (ASSOC TYPE *DEFINITION-PROTOTYPES* :TEST (FUNCTION EQ)))) (IL:/RPLACD LOOKUP-TYPE (REMOVE NAME (CDR LOOKUP-TYPE) :KEY (FUNCTION CAR))))))))
(DEFDEFINER (DEF-DEFINE-TYPE (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEF-DEFINE-TYPE (IL:\\\, NAME) "Description string")))))) IL:DEFINE-TYPES (NAME DESCRIPTION &KEY UNDEFINER &AUX (CHANGELST (INTERN (CONCATENATE (QUOTE STRING) "CHANGED" (STRING NAME) "LST") (SYMBOL-PACKAGE NAME)))) "Define NAME as a new definition type" (IL:* IL:|;;| "This definition is a clean interface to a hokey implementation. It works even before the file package is loaded.") (IL:BQUOTE (PROGN (SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE IL:DEFINE-TYPES)) (QUOTE (IL:\\\, DESCRIPTION))) (PUSHNEW (QUOTE ((IL:\\\, NAME) X (IL:P IL:* (%DEFINE-TYPE-FILE-DEFINITIONS (QUOTE (IL:\\\, NAME)) (QUOTE X))))) IL:PRETTYDEFMACROS :TEST (QUOTE EQUAL)) (IL:* IL:|;;| "the information about a type in the file package is split up into a number of different places. PRETTYTYPELST contains a random amount: the changelist is the variable whose top level value contains the list of changed items, and the description is a string used by files? This is duplicated in the CL:DOCUMENTATION mechanism") (PUSHNEW (QUOTE ((IL:\\\, CHANGELST) (IL:\\\, NAME) (IL:\\\, DESCRIPTION))) IL:PRETTYTYPELST :TEST (QUOTE EQUAL)) (DEFGLOBALVAR (IL:\\\, CHANGELST) NIL) (IL:* IL:|;;| "the definition hash table is where the definitions are really stored. Create an entry for this type. Note that definitions are compared using CL:EQUAL so that names can be strings, lists, etc.") (UNLESS (GETHASH (QUOTE (IL:\\\, NAME)) *DEFINITION-HASH-TABLE*) (SETF (GETHASH (QUOTE (IL:\\\, NAME)) *DEFINITION-HASH-TABLE*) (MAKE-HASH-TABLE :TEST (QUOTE EQUAL) :SIZE 50 :REHASH-SIZE 50))) (PUSHNEW (QUOTE (IL:\\\, NAME)) IL:FILEPKGTYPES) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE IL:GETDEF)) (QUOTE %DEFINE-TYPE-GETDEF)) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE IL:DELDEF)) (QUOTE %DEFINE-TYPE-DELDEF)) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE IL:PUTDEF)) (QUOTE %DEFINE-TYPE-PUTDEF)) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE IL:FILEGETDEF)) (QUOTE %DEFINE-TYPE-FILEGETDEF)) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE IL:FILEPKGCONTENTS)) (QUOTE IL:NILL)) (IL:\\\,@ (WHEN UNDEFINER (IL:BQUOTE ((PUSHNEW (QUOTE (IL:\\\, UNDEFINER)) (GET (QUOTE (IL:\\\, NAME)) (QUOTE :UNDEFINERS))))))))))
(DEFDEFINER (DEFDEFINER (:NAME (LAMBDA (WHOLE) (LET ((NAME (SECOND WHOLE))) (IF (CONSP NAME) (CAR NAME) NAME)))) (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFDEFINER (IL:\\\, NAME) (IL:\\\, (IF (EQ (IL:EDITMODE) (QUOTE IL:SEDIT)) (SYMBOL-VALUE (INTERN "BASIC-GAP" "SEDIT")) "Type")) (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE))))))) (:UNDEFINER %DELETE-DEFINER) (:TEMPLATE (:NAME :TYPE :ARG-LIST :BODY))) IL:FUNCTIONS (NAME TYPE ARG-LIST &BODY BODY) (LET* ((OPTIONS (COND ((CONSP NAME) (PROG1 (CDR NAME) (SETQ NAME (CAR NAME)))) (T NIL))) (NAME-FN NIL) (UNDEFINER NIL) (PROTOTYPE-FN NIL) (TEMPLATE NIL) (PRETTYMACRO NIL) (EDITDATE-OFFSET NIL)) (DOLIST (OPT-LIST OPTIONS) (CASE (CAR OPT-LIST) ((:UNDEFINER) (SETQ UNDEFINER (CADR OPT-LIST))) ((:NAME) (SETQ NAME-FN (CADR OPT-LIST))) ((:PROTOTYPE) (SETQ PROTOTYPE-FN (CADR OPT-LIST))) ((:TEMPLATE) (SETQ TEMPLATE (CADR OPT-LIST))) ((:PRETTYPRINTMACRO) (SETQ PRETTYMACRO (CADR OPT-LIST))) ((:EDITDATE-OFFSET) (SETQ EDITDATE-OFFSET (CADR OPT-LIST))) (OTHERWISE (CERROR "Ignore the option" "Unrecognized option to DefDefiner: ~S" OPT-LIST)))) (IL:* IL:|;;| "Crap out now if junk in EDITDATE-OFFSET") (WHEN (AND EDITDATE-OFFSET (NOT (INTEGERP EDITDATE-OFFSET))) (ERROR ":EDITDATE-OFFSET must be an integer, not ~a" EDITDATE-OFFSET)) (MULTIPLE-VALUE-BIND (EXPANSION-FN DOC) (SI::EXPANSION-FUNCTION NAME ARG-LIST BODY) (UNLESS (OR TEMPLATE PRETTYMACRO (NOT (MEMBER (QUOTE &BODY) ARG-LIST))) (IL:* IL:\; "Tell default prettyprinter where the body is") (SETQ TEMPLATE (NCONC (IL:FOR X IL:IN ARG-LIST IL:UNTIL (EQ X (QUOTE &BODY)) IL:UNLESS (MEMBER X LAMBDA-LIST-KEYWORDS) IL:COLLECT NIL) (LIST :BODY))) (WHEN (AND (NULL (CAR TEMPLATE)) (NULL NAME-FN)) (IL:* IL:\; "Name is in default place") (SETF (CAR TEMPLATE) :NAME))) (LET ((EXPANDER-NAME (GET-DEFINER-NAME NAME "definition-expander-")) (NAME-FN-NAME (IF (CONSP NAME-FN) (GET-DEFINER-NAME NAME "name-fn-")))) (IL:BQUOTE (PROGN (EVAL-WHEN (LOAD EVAL ) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :DEFINER-FOR)) (QUOTE (IL:\\\, TYPE))) (PUSHNEW (QUOTE (IL:\\\, NAME)) (GET (QUOTE (IL:\\\, TYPE)) (QUOTE :DEFINED-BY))) (SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, EXPANDER-NAME))) (FUNCTION (IL:\\\, EXPANSION-FN))) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :DEFINITION-EXPANDER)) (QUOTE (IL:\\\, EXPANDER-NAME))) (IL:\\\,@ (IF NAME-FN-NAME (IL:BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, NAME-FN-NAME))) (FUNCTION (IL:\\\, NAME-FN))))))) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :DEFINITION-NAME)) (QUOTE (IL:\\\, (OR NAME-FN-NAME NAME-FN (QUOTE SECOND))))) (IL:\\\,@ (AND UNDEFINER (LET ((UNDEFINER-FN-NAME (GET-DEFINER-NAME NAME "undefiner-fn-"))) (IL:BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, UNDEFINER-FN-NAME))) (FUNCTION (IL:\\\, UNDEFINER))) (PUSHNEW (QUOTE (IL:\\\, UNDEFINER-FN-NAME)) (GET (QUOTE (IL:\\\, NAME)) (QUOTE :UNDEFINERS)))))))) (IL:\\\,@ (AND PROTOTYPE-FN (LET ((PROTOTYPE-FN-NAME (GET-DEFINER-NAME NAME "prototype-fn-"))) (IL:BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, PROTOTYPE-FN-NAME))) (FUNCTION (IL:\\\, PROTOTYPE-FN))) (ADD-PROTOTYPE-FN (QUOTE (IL:\\\, TYPE)) (QUOTE (IL:\\\, NAME)) (QUOTE (IL:\\\, PROTOTYPE-FN-NAME)))))))) (IL:\\\,@ (AND DOC (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE FUNCTION)) (IL:\\\, DOC)))))) (IL:\\\,@ (AND TEMPLATE (IL:BQUOTE ((SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :DEFINITION-PRINT-TEMPLATE)) (QUOTE (IL:\\\, TEMPLATE))))))) (IL:\\\,@ (AND EDITDATE-OFFSET (IL:BQUOTE ((SETF (GET (QUOTE (IL:\\\, NAME)) :EDITDATE-OFFSET) (IL:\\\, EDITDATE-OFFSET)))))) (PUSHNEW (QUOTE ((IL:\\\, NAME) (IL:\\\,@ (OR PRETTYMACRO (QUOTE PPRINT-DEFINER))))) IL:PRETTYPRINTMACROS :TEST (QUOTE EQUAL))) (DEFMACRO (IL:\\\, NAME) (&WHOLE DEFINITION &ENVIRONMENT ENV) (IL:BQUOTE (DEFINER (IL:\\\, (QUOTE (IL:\\\, TYPE))) (IL:\\\, (QUOTE (IL:\\\, NAME))) (IL:\\\, DEFINITION) (IL:\\\, ENV))))))))))
(DEFDEFINER (DEFDEFINER-VARIABLE-TYPE (:NAME (LAMBDA (WHOLE) (LET ((NAME (SECOND WHOLE))) (IF (CONSP NAME) (CAR NAME) NAME)))) (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFDEFINER-VARIABLE-TYPE (IL:\\\, NAME) (IL:\\\, (IF (EQ (IL:EDITMODE) (INTERN "SEDIT" "SEDIT")) (SYMBOL-VALUE (INTERN "BASIC-GAP" "SEDIT")) "Type")) (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE))))))) (:UNDEFINER %DELETE-DEFINER) (:TEMPLATE (:NAME :TYPE :ARG-LIST :BODY))) IL:FUNCTIONS (NAME TYPES ARG-LIST &BODY BODY) (IL:* IL:|;;| "An extension to the DEFDEFINER universe, this allows the creation of definers that map to multiple file-package types. The test case, and the only case guaranteed to work, is DEFUN (which now must accept (DEFUN (SETF FOO)...), which needs to be stored as a SETFS file type).") (LET* ((OPTIONS (COND ((CONSP NAME) (PROG1 (CDR NAME) (SETQ NAME (CAR NAME)))) (T NIL))) (NAME-FN NIL) (UNDEFINERS NIL) (PROTOTYPE-FNS NIL) (TEMPLATE NIL) (PRETTYMACRO NIL) (TYPE-DISCRIMINATOR NIL) (EXPANSION-FNS NIL) (DOCS NIL) (EDITDATE-OFFSET NIL)) (DOLIST (OPT-LIST OPTIONS) (CASE (CAR OPT-LIST) ((:UNDEFINERS) (SETQ UNDEFINERS (CDR OPT-LIST))) ((:NAME) (SETQ NAME-FN (CADR OPT-LIST))) ((:PROTOTYPES) (SETQ PROTOTYPE-FNS (CDR OPT-LIST))) ((:TEMPLATE) (SETQ TEMPLATE (CADR OPT-LIST))) ((:PRETTYPRINTMACRO) (SETQ PRETTYMACRO (CADR OPT-LIST))) ((:TYPE-DISCRIMINATOR) (SETQ TYPE-DISCRIMINATOR (CADR OPT-LIST))) ((:EDITDATE-OFFSET) (SETQ EDITDATE-OFFSET (CADR OPT-LIST))) (OTHERWISE (CERROR "Ignore the option" "Unrecognized option to DefDefiner: ~S" OPT-LIST)))) (UNLESS TYPE-DISCRIMINATOR (ERROR "DEFDEFINER-VARIABLE-TYPE must have a TYPE-DISCRIMINATOR")) (IL:* IL:|;;| "Crap out now if junk in EDITDATE-OFFSET") (WHEN (AND EDITDATE-OFFSET (NOT (INTEGERP EDITDATE-OFFSET))) (ERROR ":EDITDATE-OFFSET must be an integer, not ~a" EDITDATE-OFFSET)) (DOLIST (TYPE TYPES) (MULTIPLE-VALUE-BIND (EXPANSION-FN DOC) (SI::EXPANSION-FUNCTION NAME ARG-LIST (LET ((TB (GETF BODY TYPE))) (IF TB (LIST TB) (ERROR "No expansion-function for ~A" TYPE)))) (SETF (GETF EXPANSION-FNS TYPE) EXPANSION-FN) (WHEN DOC (SETQ DOCS (CONCATENATE (QUOTE STRING) DOCS (OR DOCS "
") (SYMBOL-NAME TYPE) ": " DOC))))) (UNLESS (OR TEMPLATE PRETTYMACRO (NOT (MEMBER (QUOTE &BODY) ARG-LIST))) (IL:* IL:\; "Tell default prettyprinter where the body is") (SETQ TEMPLATE (NCONC (IL:FOR X IL:IN ARG-LIST IL:UNTIL (EQ X (QUOTE &BODY)) IL:UNLESS (MEMBER X LAMBDA-LIST-KEYWORDS) IL:COLLECT NIL) (LIST :BODY))) (WHEN (AND (NULL (CAR TEMPLATE)) (NULL NAME-FN)) (IL:* IL:\; "Name is in default place") (SETF (CAR TEMPLATE) :NAME))) (LET ((NAME-FN-NAME (IF (CONSP NAME-FN) (GET-DEFINER-NAME NAME "name-fn-"))) (TYPE-DISCRIMINATOR-NAME (GET-DEFINER-NAME NAME "type-discriminator-fn-"))) (IL:BQUOTE (PROGN (EVAL-WHEN (LOAD EVAL ) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :DEFINER-FOR)) (QUOTE (IL:\\\, TYPES))) (SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, TYPE-DISCRIMINATOR-NAME))) (FUNCTION (IL:\\\, TYPE-DISCRIMINATOR))) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :TYPE-DISCRIMINATOR)) (QUOTE (IL:\\\, TYPE-DISCRIMINATOR-NAME))) (IL:\\\,@ (AND PROTOTYPE-FNS (MAPCAN (FUNCTION (LAMBDA (TYPE) (LET ((PROTOTYPE-FN-NAME (GET-DEFINER-NAME NAME (CONCATENATE (QUOTE STRING) (SYMBOL-NAME TYPE) "-prototype-fn-")))) (IL:BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, PROTOTYPE-FN-NAME))) (FUNCTION (IL:\\\, (GETF PROTOTYPE-FNS TYPE)))) (ADD-PROTOTYPE-FN (QUOTE (IL:\\\, TYPE)) (QUOTE (IL:\\\, NAME)) (QUOTE (IL:\\\, PROTOTYPE-FN-NAME)))))))) TYPES))) (IL:\\\,@ (AND DOCS (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE FUNCTION)) (IL:\\\, DOCS)))))) (IL:\\\,@ (AND TEMPLATE (IL:BQUOTE ((SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :DEFINITION-PRINT-TEMPLATE)) (QUOTE (IL:\\\, TEMPLATE))))))) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :DEFINITION-NAME)) (QUOTE (IL:\\\, (OR NAME-FN-NAME NAME-FN (QUOTE SECOND))))) (IL:\\\,@ (MAPCAN (FUNCTION (LAMBDA (TYPE) (LET ((EXPANDER-NAME (GET-DEFINER-NAME NAME (CONCATENATE (QUOTE STRING) (SYMBOL-NAME TYPE) "-definition-expander-"))) (EXPANSION-FN (GETF EXPANSION-FNS TYPE))) (IL:BQUOTE ((PUSHNEW (QUOTE (IL:\\\, NAME)) (GET (QUOTE (IL:\\\, TYPE)) (QUOTE :DEFINED-BY))) (SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, EXPANDER-NAME))) (FUNCTION (IL:\\\, EXPANSION-FN))) (SETF (GETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :DEFINITION-EXPANDER)) (QUOTE (IL:\\\, TYPE))) (QUOTE (IL:\\\, EXPANDER-NAME)))))))) TYPES)) (IL:\\\,@ (IF NAME-FN-NAME (IL:BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, NAME-FN-NAME))) (FUNCTION (IL:\\\, NAME-FN))))))) (IL:\\\,@ (AND UNDEFINERS (MAPCAN (FUNCTION (LAMBDA (TYPE) (WHEN (GETF UNDEFINERS TYPE) (LET ((UNDEFINER-FN-NAME (GET-DEFINER-NAME NAME (CONCATENATE (QUOTE STRING) (SYMBOL-NAME TYPE) "-undefiner-fn-")))) (IL:BQUOTE ((SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, UNDEFINER-FN-NAME))) (FUNCTION (IL:\\\, (GETF UNDEFINERS TYPE)))) (PUSHNEW (QUOTE (IL:\\\, UNDEFINER-FN-NAME)) (GETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE :UNDEFINERS)) (QUOTE (IL:\\\, TYPE)))))))))) TYPES))) (IL:\\\,@ (AND EDITDATE-OFFSET (IL:BQUOTE ((SETF (GET (QUOTE (IL:\\\, NAME)) :EDITDATE-OFFSET) (IL:\\\, EDITDATE-OFFSET)))))) (PUSHNEW (QUOTE ((IL:\\\, NAME) (IL:\\\,@ (OR PRETTYMACRO (QUOTE PPRINT-DEFINER))))) IL:PRETTYPRINTMACROS :TEST (QUOTE EQUAL))) (DEFMACRO (IL:\\\, NAME) (&WHOLE DEFINITION &ENVIRONMENT ENV) (IL:BQUOTE (DEFINER-VARIABLE-TYPE (IL:\\\, (QUOTE (IL:\\\, NAME))) (IL:\\\, DEFINITION) (IL:\\\, ENV)))))))))
(DEFUN %EXPAND-DEFINER (DEFINER DEFINITION-WITHOUT-COMMENTS &OPTIONAL ENV) (FUNCALL (GET DEFINER :DEFINITION-EXPANDER) DEFINITION-WITHOUT-COMMENTS ENV))
(DEFUN %DEFINER-NAME (DEFINER DEFINITION-WITHOUT-COMMENTS) (FUNCALL (GET DEFINER :DEFINITION-NAME) DEFINITION-WITHOUT-COMMENTS))
(IL:* IL:\; "The most commonly-used definers")
(DEFDEFINER-VARIABLE-TYPE (DEFUN (:TYPE-DISCRIMINATOR (LAMBDA (WHOLE) (LET ((NAME (SECOND WHOLE))) (COND ((SYMBOLP NAME) (QUOTE IL:FUNCTIONS)) ((CL::SETF-NAME-P NAME) (QUOTE IL:SETFS)) (T (ERROR "Can't determine type for DEFUN: ~s" NAME)))))) (:NAME (LAMBDA (WHOLE) (LET ((NAME (SECOND WHOLE))) (COND ((SYMBOLP NAME) NAME) ((CL::SETF-NAME-P NAME) (CADR NAME)) (T (ERROR "Bad function-name for DEFUN: ~s" NAME)))))) (:PROTOTYPES IL:FUNCTIONS (LAMBDA (NAME) (IL:BQUOTE (DEFUN (IL:\\\, NAME) (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE))))) IL:SETFS (LAMBDA (NAME) (IL:BQUOTE (DEFUN (SETF (IL:\\\, NAME)) (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE)))))) (:TEMPLATE (:NAME :ARG-LIST :BODY)) (:EDITDATE-OFFSET 3)) (IL:FUNCTIONS IL:SETFS) (NAME ARGS &BODY (BODY DECLS DOCUMENTATION) &ENVIRONMENT ENV) IL:FUNCTIONS (IL:BQUOTE (PROGN (SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, NAME))) (FUNCTION (LAMBDA (IL:\\\, ARGS) (IL:\\\,@ DECLS) (BLOCK (IL:\\\, NAME) (IL:\\\,@ BODY))))) (IL:\\\,@ (AND DOCUMENTATION (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE FUNCTION)) (IL:\\\, DOCUMENTATION)))))))) IL:SETFS (IL:* IL:|;;| "The form is (defun (setf foo) (store-var &rest args) body)") (IL:* IL:|;;| "Strategy is to give the code a name with DEFUN-SETF-NAME. The name is stored on the :SETF-DEFUN property of the accessor. This name is there for convenience/documentation only; the name can't be reliably changed by smashing this property (i.e. (SETF (FDEFINITION '(SETF FOO)) #'BAR) essentially does (SETF (SYMBOL-FUNCTION (DEFUN-SETF-NAME 'FOO)) #'BAR); it does NOT change the :SETF-DEFUN property on FOO).") (LET* ((REAL-NAME (SECOND NAME)) (DEFUN-SETF-NAME (DEFUN-SETF-NAME REAL-NAME))) (IL:BQUOTE (PROGN (SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, DEFUN-SETF-NAME))) (FUNCTION (LAMBDA (IL:\\\, ARGS) (IL:\\\,@ DECLS) (BLOCK (IL:\\\, REAL-NAME) (IL:\\\,@ BODY))))) (SET-DEFUN-SETF (QUOTE (IL:\\\, REAL-NAME)) (QUOTE (IL:\\\, DEFUN-SETF-NAME))) (IL:\\\,@ (AND DOCUMENTATION (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, REAL-NAME)) (QUOTE SETF)) (IL:\\\, DOCUMENTATION))))))))))
(DEFDEFINER (DEFINLINE (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFINLINE (IL:\\\, NAME) (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE))))))) (:TEMPLATE (:NAME :ARG-LIST :BODY))) IL:FUNCTIONS (NAME ARG-LIST &BODY BODY &ENVIRONMENT ENV) (IL:* IL:|;;;| "This is an INTERIM version of DEFINLINE. Eventually, this will just turn into a DEFUN and a PROCLAIM INLINE. (It says so right here.) If you're using this one, DO NOT make any recursive calls in the body of the DEFINLINE. If you do, the compiler will run forever trying to expand the optimizer... Once the INLINE version gets working (in the PavCompiler only) that restriction will be lifted.") (MULTIPLE-VALUE-BIND (CODE DECLS DOC) (PARSE-BODY BODY ENV T) (LET ((NEW-LAMBDA (IL:BQUOTE ((IL:\\\, (QUOTE LAMBDA)) (IL:\\\, ARG-LIST) (IL:\\\,@ DECLS) (BLOCK (IL:\\\, NAME) (IL:\\\,@ CODE)))))) (IL:BQUOTE (PROGN (DEFUN (IL:\\\, NAME) (IL:\\\, ARG-LIST) (IL:\\\,@ BODY)) (DEFOPTIMIZER (IL:\\\, NAME) (IL:\\\, (PACK (LIST "definline-" NAME) (SYMBOL-PACKAGE NAME))) (&REST ARGS) (CONS (QUOTE (IL:\\\, NEW-LAMBDA)) ARGS)))))))
(DEFDEFINER (DEFMACRO (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFMACRO (IL:\\\, NAME) (IL:\\\,@ (%MAKE-FUNCTION-PROTOTYPE))))))) (:UNDEFINER (LAMBDA (NAME) (REMPROP NAME (QUOTE IL:ARGNAMES)))) (:TEMPLATE (:NAME :ARG-LIST :BODY))) IL:FUNCTIONS (NAME DEFMACRO-ARGS &BODY DEFMACRO-BODY) (UNLESS (AND NAME (SYMBOLP NAME)) (ERROR "Illegal name used in DEFMACRO: ~S" NAME)) (LET ((CMACRONAME (PACK (LIST "expand-" NAME) (SYMBOL-PACKAGE NAME)))) (MULTIPLE-VALUE-BIND (EXPANSION-FN DOC-STRING) (SI::EXPANSION-FUNCTION NAME DEFMACRO-ARGS DEFMACRO-BODY) (IL:BQUOTE (PROGN (SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, CMACRONAME))) (FUNCTION (IL:\\\, EXPANSION-FN))) (SETF (MACRO-FUNCTION (QUOTE (IL:\\\, NAME))) (QUOTE (IL:\\\, CMACRONAME))) (IL:\\\,@ (AND DOC-STRING (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE FUNCTION)) (IL:\\\, DOC-STRING)))))) (IL:\\\,@ (WHEN COMPILER::*NEW-COMPILER-IS-EXPANDING* (IL:BQUOTE ((SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE IL:ARGNAMES)) (QUOTE (IL:\\\, (MAPCAR (FUNCTION (LAMBDA (ARG) (IF (MEMBER ARG LAMBDA-LIST-KEYWORDS) ARG (PRIN1-TO-STRING ARG)))) (IL:\\SIMPLIFY.CL.ARGLIST DEFMACRO-ARGS))))))))))))))
(DEFDEFINER (DEFVAR (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFVAR (IL:\\\, NAME))))))) IL:VARIABLES (NAME &OPTIONAL (INITIAL-VALUE NIL IVP) DOCUMENTATION) (IL:BQUOTE (PROGN (PROCLAIM (QUOTE (SPECIAL (IL:\\\, NAME)))) (IL:\\\,@ (AND IVP (IL:BQUOTE ((OR (BOUNDP (QUOTE (IL:\\\, NAME))) (SETQ (IL:\\\, NAME) (IL:\\\, INITIAL-VALUE))))))) (IL:\\\,@ (AND DOCUMENTATION (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE VARIABLE)) (IL:\\\, DOCUMENTATION)))))))))
(DEFDEFINER (DEFPARAMETER (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFPARAMETER (IL:\\\, NAME) "Value" "Documentation string")))))) IL:VARIABLES (NAME INITIAL-VALUE &OPTIONAL DOCUMENTATION) (IL:BQUOTE (PROGN (PROCLAIM (QUOTE (SPECIAL (IL:\\\, NAME)))) (SETQ (IL:\\\, NAME) (IL:\\\, INITIAL-VALUE)) (IL:\\\,@ (AND DOCUMENTATION (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE VARIABLE)) (IL:\\\, DOCUMENTATION)))))))))
(DEFDEFINER (DEFCONSTANT (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFCONSTANT (IL:\\\, NAME) "Value" "Documentation string")))))) IL:VARIABLES (NAME VALUE &OPTIONAL DOCUMENTATION) (IL:BQUOTE (PROGN (IL:\\\,@ (IF (CONSTANTP NAME) (IL:BQUOTE ((SET-CONSTANTP (QUOTE (IL:\\\, NAME)) NIL))))) (SETQ (IL:\\\, NAME) (IL:\\\, VALUE)) (PROCLAIM (QUOTE (SI::CONSTANT (IL:\\\, NAME)))) (IL:\\\,@ (AND DOCUMENTATION (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE VARIABLE)) (IL:\\\, DOCUMENTATION)))))))))
(DEFDEFINER (DEFGLOBALVAR (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFGLOBALVAR (IL:\\\, NAME))))))) IL:VARIABLES (NAME &OPTIONAL (INITIAL-VALUE NIL IVP) DOCUMENTATION) (IL:* IL:|;;| "Use IL:SETQ here or the INIT dies.") (IL:BQUOTE (PROGN (PROCLAIM (QUOTE (GLOBAL (IL:\\\, NAME)))) (IL:\\\,@ (AND IVP (IL:BQUOTE ((OR (BOUNDP (QUOTE (IL:\\\, NAME))) (SETQ (IL:\\\, NAME) (IL:\\\, INITIAL-VALUE))))))) (IL:\\\,@ (AND DOCUMENTATION (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE VARIABLE)) (IL:\\\, DOCUMENTATION)))))))))
(DEFDEFINER (DEFGLOBALPARAMETER (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFGLOBALPARAMETER (IL:\\\, NAME) "Value" "Documentation string")))))) IL:VARIABLES (NAME INITIAL-VALUE &OPTIONAL DOCUMENTATION) (IL:BQUOTE (PROGN (PROCLAIM (QUOTE (GLOBAL (IL:\\\, NAME)))) (SETQ (IL:\\\, NAME) (IL:\\\, INITIAL-VALUE)) (IL:\\\,@ (AND DOCUMENTATION (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE VARIABLE)) (IL:\\\, DOCUMENTATION)))))))))
(IL:* IL:\; "Here so that the evaluator can be in the init without definers being in the init.")
(DEF-DEFINE-TYPE IL:SPECIAL-FORMS "Common Lisp special forms" :UNDEFINER %REMOVE-SPECIAL-FORM)
(DEFUN %REMOVE-SPECIAL-FORM (X) (IL:/REMPROP X (QUOTE IL:SPECIAL-FORM)))
(DEFDEFINER (DEFINE-SPECIAL-FORM (:TEMPLATE (:NAME :ARG-LIST :BODY))) IL:SPECIAL-FORMS (NAME ARGS &REST BODY) (COND ((NULL BODY) (ASSERT (SYMBOLP NAME) NIL "Ill-formed short DEFINE-SPECIAL-FORM; ~S is not a symbol." ARGS) (IL:BQUOTE (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE IL:SPECIAL-FORM)) (QUOTE (IL:\\\, ARGS))))) (T (LET ((SF (INTERN (CONCATENATE (QUOTE STRING) "interpret-" (STRING NAME)) (SYMBOL-PACKAGE NAME)))) (MULTIPLE-VALUE-BIND (PARSED-BODY DECLS DOC) (IL:PARSE-DEFMACRO ARGS (QUOTE $$TAIL) BODY NAME NIL :PATH (QUOTE $$TAIL) :ENVIRONMENT (QUOTE $$ENV)) (IL:BQUOTE (PROGN (SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, SF))) (FUNCTION (LAMBDA ($$TAIL $$ENV) (IL:\\\,@ DECLS) (BLOCK (IL:\\\, NAME) (IL:\\\, PARSED-BODY))))) (SETF (GET (QUOTE (IL:\\\, NAME)) (QUOTE IL:SPECIAL-FORM)) (QUOTE (IL:\\\, SF))))))))))
(IL:* IL:\; "Form for defining interpreters of special forms")
(IL:* IL:\; "Don't note changes to these properties/variables")
(IL:PUTPROPS IL:MACRO-FN IL:PROPTYPE IL:FUNCTIONS)
(IL:PUTPROPS :UNDEFINERS IL:PROPTYPE IGNORE)
(IL:PUTPROPS IL:UNDEFINERS IL:PROPTYPE IGNORE)
(IL:PUTPROPS :DEFINER-FOR IL:PROPTYPE IGNORE)
(IL:PUTPROPS IL:DEFINER-FOR IL:PROPTYPE IGNORE)
(IL:PUTPROPS :DEFINED-BY IL:PROPTYPE IGNORE)
(IL:PUTPROPS IL:DEFINED-BY IL:PROPTYPE IGNORE)
(IL:PUTPROPS :DEFINITION-NAME IL:PROPTYPE IGNORE)
(IL:PUTPROPS IL:DEFINITION-NAME IL:PROPTYPE IGNORE)
(IL:* IL:\;
"Templates for definers not defined here. These should really be where they're defined.")
(IL:PUTPROPS DEFCOMMAND :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :BODY))
(IL:PUTPROPS DEFINE-CONDITION :DEFINITION-PRINT-TEMPLATE (:NAME :VALUE :BODY))
(IL:PUTPROPS DEFINE-MODIFY-MACRO :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST))
(IL:PUTPROPS DEFINE-SETF-METHOD :DEFINITION-PRINT-TEMPLATE (:NAME NIL NIL :BODY))
(IL:PUTPROPS DEFSETF :DEFINITION-PRINT-TEMPLATE (:NAME :ARG-LIST :ARG-LIST :BODY))
(IL:PUTPROPS DEFSTRUCT :DEFINITION-PRINT-TEMPLATE (:NAME :BODY))
(IL:PUTPROPS DEFTYPE :DEFINITION-PRINT-TEMPLATE (:NAME NIL :BODY))
(IL:* IL:|;;| "Arrange for the correct compiler to be used.")
(IL:PUTPROPS IL:CMLDEFFER IL:FILETYPE :COMPILE-FILE)
(IL:PUTPROPS IL:CMLDEFFER IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "XCL"))
(IL:PUTPROPS IL:CMLDEFFER IL:COPYRIGHT ("Venue & Xerox Corporation" 1986 1900 1987 1988 1990 1992))
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL)))
IL:STOP

BIN
CLTL2/CMLDEFFER.DFASL Normal file

Binary file not shown.

81
CLTL2/CMLDOC Normal file
View File

@@ -0,0 +1,81 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 10:41:09" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLDOC.;2" 3493
previous date%: "14-Apr-92 20:18:56" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLDOC.;1")
(* ; "
Copyright (c) 1986, 1987, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLDOCCOMS)
(RPAQQ CMLDOCCOMS (
(* ;;; "Documentation strings")
(VARIABLES *DOCUMENTATION-HASH-TABLE*)
(FUNCTIONS LISP:DOCUMENTATION HASH-TABLE-FOR-DOC-TYPE SET-DOCUMENTATION)
(SETFS LISP:DOCUMENTATION)
(* ;; "Use the proper compiler")
(PROP FILETYPE CMLDOC)))
(* ;;; "Documentation strings")
(DEFGLOBALVAR *DOCUMENTATION-HASH-TABLE*
(* ;;; "This is the repository for all documentation strings in the system. It is a two-level hash-table scheme, just like *definition-hash-table*. At the first level, *DOCUMENTATION-HASH-TABLE* maps the symbols that name documentation-types into a separate hash table for each type. Those tables map names into the documentation strings for those names. The first-level table uses an EQ test while the second-level ones use CL:EQUAL.")
(* ;; "The hash-table is initialized to have second-level tables for each of the required documentation types.")
(LET ((LISP::HT (LISP:MAKE-HASH-TABLE :TEST 'EQ :SIZE 10 :REHASH-SIZE 5)))
[FOR TYPE-LIST IN '((TYPES TYPE)
(SETFS LISP:SETF)
(STRUCTURES LISP:STRUCTURE RECORD RECORDS)
(FUNCTIONS LISP:FUNCTION FN FNS)
(VARIABLES LISP:VARIABLE VAR VARS))
DO (LET ((TABLE (LISP:MAKE-HASH-TABLE :TEST 'LISP:EQUAL :SIZE 50 :REHASH-SIZE 50)))
(FOR TYPE IN TYPE-LIST DO (LISP:SETF (LISP:GETHASH TYPE LISP::HT)
TABLE]
LISP::HT))
(LISP:DEFUN LISP:DOCUMENTATION (NAME DOC-TYPE)
(GETHASH NAME (HASH-TABLE-FOR-DOC-TYPE DOC-TYPE)))
(LISP:DEFUN HASH-TABLE-FOR-DOC-TYPE (DOC-TYPE)
(OR (GETHASH DOC-TYPE *DOCUMENTATION-HASH-TABLE*)
(AND FILEPKGFLG (GETHASH (SETQ DOC-TYPE (GETFILEPKGTYPE DOC-TYPE 'TYPE))
(* ;;
 "note that GETFILEPKGTYPE will signal an error if it doesn't recognize the type.")
*DOCUMENTATION-HASH-TABLE*))
(LISP:SETF (GETHASH DOC-TYPE *DOCUMENTATION-HASH-TABLE*)
(LISP:MAKE-HASH-TABLE :TEST 'LISP:EQUAL :SIZE 50 :REHASH-SIZE 50))))
(LISP:DEFUN SET-DOCUMENTATION (NAME DOC-TYPE NEW-STRING) (* ; "Edited 14-Apr-92 20:16 by jrb:")
(LISP:CHECK-TYPE NEW-STRING (OR (EQL NIL)
STRING))
(LISP:IF LISPXHIST
(UNDOABLY-SETF (GETHASH NAME (HASH-TABLE-FOR-DOC-TYPE DOC-TYPE))
NEW-STRING)
(LISP:SETF (GETHASH NAME (HASH-TABLE-FOR-DOC-TYPE DOC-TYPE))
NEW-STRING)))
(LISP:DEFSETF LISP:DOCUMENTATION SET-DOCUMENTATION)
(* ;; "Use the proper compiler")
(PUTPROPS CMLDOC FILETYPE LISP:COMPILE-FILE)
(PUTPROPS CMLDOC COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991 1992 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLDOC.LCOM Normal file

Binary file not shown.

2174
CLTL2/CMLEVAL Normal file

File diff suppressed because it is too large Load Diff

BIN
CLTL2/CMLEVAL.LCOM Normal file

Binary file not shown.

821
CLTL2/CMLEXEC Normal file
View File

@@ -0,0 +1,821 @@
(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP")
(FILECREATED " 8-Apr-92 22:06:20" {DSK}<usr>local>lde>lispcore>sources>CMLEXEC.;2 70091
changes to%: (ALISTS (BackgroundMenuCommands EXEC))
previous date%: "25-Jun-91 12:22:29" {DSK}<usr>local>lde>lispcore>sources>CMLEXEC.;1)
(* ; "
Copyright (c) 1985, 1986, 1987, 1988, 1990, 1991, 1992 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLEXECCOMS)
(RPAQQ CMLEXECCOMS ((FILES CMLUNDO PROFILE) (XCL:PROFILES "EXEC") (STRUCTURES COMMAND-ENTRY EXEC-EVENT-ID EXEC-EVENT HISTORY) (* ; "These are public except for command-entry.") (FUNCTIONS XCL::EXEC-CLOSEFN XCL::EXEC-SHRINKFN XCL::SETUP-EXEC-WINDOW XCL::EXEC-TITLE-FUNCTION FIX-FORM XCL::GET-PROCESS-PROFILE XCL::SAVE-CURRENT-EXEC-PROFILE XCL::SETF-GET-PROCESS-PROFILE XCL:SET-EXEC-TYPE XCL:SET-DEFAULT-EXEC-TYPE XCL::ENTER-EXEC-FUNCTION) (SETFS XCL::GET-PROCESS-PROFILE) (FUNCTIONS DO-EVENT EXEC EXEC-EVAL PRINT-ALL-DOCUMENTATION PRINT-DOCUMENTATION VALUE-OF ADD-EXEC EXEC-READ-LINE EXEC-EVENT-ID-PROMPT FIND-EXEC-COMMAND) (FUNCTIONS CIRCLAR-COPYER) (FNS COPY-CIRCLE) (* ; "CIRCLAR-COPYER and COPY-CIRCLE are the solution for AR#11172") (FNS EXEC-READ DIR) (VARIABLES *PER-EXEC-VARIABLES* CL:* CL:** CL:*** + CL:++ CL:+++ - / CL:// CL:/// *CURRENT-EVENT* *EXEC-ID* XCL:*EXEC-PROMPT* XCL:*EVAL-FUNCTION* *NOT-YET-EVALUATED* *THIS-EXEC-COMMANDS* *EXEC-COMMAND-TABLE* *DEBUGGER-COMMAND-TABLE* *CURRENT-EXEC-TYPE* *EXEC-MAKE-UNDOABLE-P*) (VARIABLES *EDIT-INPUT-WITH-TTYIN*) (FNS DO-APPLY-EVENT DO-HISTORY-SEARCH EVAL-INPUT EVENTS-INPUT EXEC-PRIN1 EXEC-VALUE-OF GET-NEXT-HISTORY-EVENT HISTORY-ADD-TO-SPELLING-LISTS HISTORY-NTH PRINT-HISTORY FIND-HISTORY-EVENTS PRINT-EVENT PRINT-EVENT-PROMPT PROCESS-EXEC-ID SEARCH-FOR-EVENT-NUMBER \PICK.EVALQT LISPXREPRINT) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (MOVD? (QUOTE READ) (QUOTE TTYINREAD)) (MOVD (QUOTE \PICK.EVALQT) (QUOTE \PROC.REPEATEDLYEVALQT)) (SETQ BackgroundMenu))) (FUNCTIONS CASE-EQUALP EXEC-EVENT-PROPS EXEC-PRINT EXEC-FORMAT) (ALISTS (BackgroundMenuCommands EXEC)) (ALISTS (SYSTEMINITVARS LISPXHISTORY GREETHIST)) (* ;; "Exec Commands") (DEFINE-TYPES COMMANDS) (FUNCTIONS DEFCOMMAND) (COMMANDS "?" "??" "CONN" "DA" "DIR" "DO-EVENTS" "FIX" "FORGET" "NAME" "NDIR" "PL" "REDO" "REMEMBER" "SHH" "UNDO" "USE" "PP") (* ;; "Arrange to use the correct compiler") (PROP FILETYPE CMLEXEC) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA DIR) (NLAML) (LAMA)))))
(FILESLOAD CMLUNDO PROFILE)
(XCL:DEFPROFILE "EXEC" (XCL:*DEBUGGER-PROMPT* "") (XCL:*EXEC-PROMPT* "") (*READTABLE* "XCL") (*PACKAGE* "XCL") (XCL:*EVAL-FUNCTION* (QUOTE CL:EVAL)))
(CL:DEFSTRUCT (COMMAND-ENTRY (:TYPE LIST)) ARGUMENTS FUNCTION MODE)
(CL:DEFSTRUCT (EXEC-EVENT-ID (:TYPE LIST)) NUMBER NAME dummy)
(CL:DEFSTRUCT (EXEC-EVENT (:TYPE LIST)) INPUT ID (VALUE *NOT-YET-EVALUATED*) dummy)
(CL:DEFSTRUCT (HISTORY (:TYPE LIST)) (EVENTS NIL) (INDEX 0) (SIZE 100) (MOD 100))
(* ; "These are public except for command-entry.")
(CL:DEFUN XCL::EXEC-CLOSEFN (XCL::WINDOW) (LET ((XCL::PROCESS (WINDOWPROP XCL::WINDOW (QUOTE PROCESS)))) (COND ((EQ (THIS.PROCESS) XCL::PROCESS) (ADD.PROCESS (BQUOTE (CLOSEW (QUOTE (\, XCL::WINDOW))))) (QUOTE DON'T)) ((PROCESSP XCL::PROCESS) (CL:IF (TTY.PROCESSP XCL::PROCESS) (TTY.PROCESS T)) (DEL.PROCESS XCL::PROCESS)))))
(CL:DEFUN XCL::EXEC-SHRINKFN (XCL::WINDOW) (LET ((XCL::PROCESS (WINDOWPROP XCL::WINDOW (QUOTE PROCESS)))) (COND ((EQ (THIS.PROCESS) XCL::PROCESS) (ADD.PROCESS (BQUOTE (SHRINKW (QUOTE (\, XCL::WINDOW))))) (QUOTE DON'T)) ((TTY.PROCESSP XCL::PROCESS) (TTY.PROCESS T) NIL))))
(CL:DEFUN XCL::SETUP-EXEC-WINDOW (XCL::WINDOW) "Add (non-title) properties to a new exec window." (WINDOWADDPROP XCL::WINDOW (QUOTE CLOSEFN) (QUOTE XCL::EXEC-CLOSEFN)) (WINDOWADDPROP XCL::WINDOW (QUOTE SHRINKFN) (QUOTE XCL::EXEC-SHRINKFN)) XCL::WINDOW)
(CL:DEFUN XCL::EXEC-TITLE-FUNCTION (XCL::WINDOW EXEC-ID) (WINDOWPROP XCL::WINDOW (QUOTE TITLE) (CL:FORMAT NIL "Exec ~A (~A)" EXEC-ID (READTABLEPROP *READTABLE* (QUOTE NAME)))))
(CL:DEFUN FIX-FORM (INPUT &OPTIONAL (CIRCLE-FLAG NIL)) (* ;;; "Edits a form, in the current window if it is shorter than ttyinfixlimit, or if longer in the display editor using edite. Returns the newly edited form.") (* ; "Edited by Tomoru Teruuchi") (COND ((OR (NOT *EDIT-INPUT-WITH-TTYIN*) (NOT (IMAGESTREAMP (TTYDISPLAYSTREAM))) (AND (NOT CIRCLE-FLAG) (EQUAL 0 (COUNTDOWN INPUT TTYINFIXLIMIT))) (* ; "(IGEQ (COUNT INPUT) TTYINFIXLIMIT) is Original Code. But This Codecan't accept circler. Edited by TT (31-May-1990)")) (EDITE (CL:IF (AND (EQ 1 (LENGTH INPUT)) (CL:CONSP (CAR INPUT))) (CAR INPUT) INPUT) NIL NIL T NIL :CLOSE-ON-COMPLETION) INPUT) (T (PRINT-EVENT-PROMPT *CURRENT-EVENT*) (DSPFONT INPUTFONT T) (CURSOR T) (* ; "make sure can edit (in case cursor smashed somehow?)") (CL:WHEN NIL (* ; "Old expression") (TTYIN "" NIL NIL (QUOTE LISPXREAD) NIL NIL BUFFER-EXPR-FROM-BELOW *READTABLE*)) (EXEC-READ-LINE (LET ((%#RPARS NIL) (FONTCHANGEFLG NIL) (*PRINT-ESCAPE* T) (*PRINT-RADIX* (NOT (= *READ-BASE* 10))) (*PRINT-BASE* *READ-BASE*) (*PRINT-LEVEL* NIL) (*PRINT-LENGTH* NIL) (*PRINT-GENSYM* (QUOTE :REREAD)) (*PRINT-ARRAY* T) (*PRINT-STRUCTURE* T)) (DECLARE (CL:SPECIAL %#RPARS FONTCHANGEFLG) (* ; "others are already globally special ")) (CL:WITH-OUTPUT-TO-STRING (STR) (FOR X ON INPUT DO (IF CIRCLE-FLAG THEN (* ; "Edited by TT (31-May-1990) CL:PRIN1 can print circlar") (CL:PRIN1 (CAR X) STR) ELSEIF (LISTP (CAR X)) THEN (PRINTDEF (CAR X) (POSITION STR) NIL NIL NIL STR) ELSE (PRIN2 (CAR X) STR)) (AND (CDR X) (PRIN1 " " STR)))))))))
(CL:DEFUN XCL::GET-PROCESS-PROFILE (&OPTIONAL (XCL::PROCESS (THIS.PROCESS))) (PROCESSPROP XCL::PROCESS (QUOTE PROFILE)))
(CL:DEFUN XCL::SAVE-CURRENT-EXEC-PROFILE NIL "Resave the profiled bindings of the exec process into their cache." (LET ((XCL::PROFILE (XCL::GET-PROCESS-PROFILE (THIS.PROCESS)))) (CL:IF (XCL:PROFILE-P XCL::PROFILE) (XCL:SAVE-PROFILE XCL::PROFILE))))
(CL:DEFUN XCL::SETF-GET-PROCESS-PROFILE (&OPTIONAL (XCL::PROCESS (THIS.PROCESS)) (XCL::PROFILE XCL:*PROFILE*)) (CL:SETQ XCL::PROFILE (XCL::PROFILIZE XCL::PROFILE)) (PROCESSPROP XCL::PROCESS (QUOTE PROFILE) XCL::PROFILE) XCL::PROFILE)
(CL:DEFUN XCL:SET-EXEC-TYPE (TYPE) "Set the current Exec's type to TYPE" (* ;; "The EXECA-FRAME bit is a gross hack to make this function work inside init files. The problem is that you want to affect the EXEC, regardless of who has bound the per-exec variables between here an the EXEC frame. Yech.") (LET ((XCL::EXECA-FRAME (STKPOS (QUOTE XCL::EXECA0001)))) (COND (XCL::EXECA-FRAME (ENVEVAL (BQUOTE (XCL:RESTORE-PROFILE (QUOTE (\, TYPE)))) XCL::EXECA-FRAME XCL::EXECA-FRAME)) (T (XCL:RESTORE-PROFILE TYPE)))))
(CL:DEFUN XCL:SET-DEFAULT-EXEC-TYPE (TYPE) (SETTOPVAL (QUOTE XCL:*PROFILE*) TYPE))
(CL:DEFUN XCL::ENTER-EXEC-FUNCTION (XCL::EXEC-FUNCTION XCL::PROFILE XCL::ID) "Start up an exec function in the proper profile, setting the default window title properly." (XCL:WITH-PROFILE (XCL:COPY-PROFILE XCL::PROFILE) (XCL::EXEC-TITLE-FUNCTION T (PROCESS-EXEC-ID (THIS.PROCESS) XCL::ID)) (CL:FUNCALL XCL::EXEC-FUNCTION)))
(CL:DEFSETF XCL::GET-PROCESS-PROFILE XCL::SETF-GET-PROCESS-PROFILE)
(CL:DEFUN DO-EVENT (ORIGINAL-INPUT ENVIRONMENT &OPTIONAL (FUNCTION (FUNCTION EVAL-INPUT))) (* ; "Edited by Tomoru Teruuchi") (PROG (TODO INPUT VALUES COM (ADD-TO-SPELLING-LIST ADDSPELLFLG) STR (RETRYFLAG NIL) (* ; "A really gross hack for RETRY to always break. It exists because: users can setq HELPFLAG anywhere (can't bind it in DO-EVENTand set it in RETRY), RETRY operates on commands (can't wrap the form with a binding of HELPFLAG).")) (DECLARE (CL:SPECIAL RETRYFLAG)) (* ; "RETRY command sets this variable if it wants to be sure to break.") (DSPFONT PRINTOUTFONT T) (SETQ INPUT ORIGINAL-INPUT) RETRY (SETQ TODO (COPY-CIRCLE INPUT)) (* ; "Break EQ link between input and evaluated form (todo), so that in-place mods don't affect history.") (COND ((AND (OR (STRINGP (CAR INPUT)) (CL:SYMBOLP (CAR INPUT))) (PROGN (SETQ STR (STRING (CAR INPUT))) (SOME *THIS-EXEC-COMMANDS* (FUNCTION (LAMBDA (TABLE) (SETQ COM (GETHASH STR TABLE))))))) (* ;; "Handle exec commands.") (CL:ECASE (COMMAND-ENTRY-MODE COM) (:QUIET (MAPC (SETQ VALUES (CL:MULTIPLE-VALUE-LIST (CL:FUNCALL (COMMAND-ENTRY-FUNCTION COM) INPUT ENVIRONMENT))) (FUNCTION (LAMBDA (X) (EXEC-PRINT X)))) (SETQ IT (CAR VALUES)) (* ; "just do it and return") (RETURN)) ((:HISTORY :INPUT) (* ; " create new input. If an error occurs while handling the command, the INPUT will be left as the original input.") (CL:WHEN *CURRENT-EVENT* (CL:SETF (EXEC-EVENT-INPUT *CURRENT-EVENT*) INPUT)) (SETQ INPUT (CL:FUNCALL (COMMAND-ENTRY-FUNCTION COM) INPUT ENVIRONMENT)) (CL:WHEN *CURRENT-EVENT* (CL:SETF (EXEC-EVENT-INPUT *CURRENT-EVENT*) INPUT) (* ; " Overwrite the original input with the newly generated one.") (CL:SETF (EXEC-EVENT-PROPS *CURRENT-EVENT*) (LIST* (QUOTE *HISTORY*) ORIGINAL-INPUT (EXEC-EVENT-PROPS *CURRENT-EVENT*)))) (GO RETRY) (* ; " could have generated a command")) ((NIL :EVAL) (* ; " normal kind of command, just apply") (SETQ TODO (BQUOTE ((CL:FUNCALL (QUOTE (\, (COMMAND-ENTRY-FUNCTION COM))) (QUOTE (\, INPUT)) (QUOTE (\, ENVIRONMENT)))))) (SETQ ADD-TO-SPELLING-LIST NIL) (CL:WHEN *CURRENT-EVENT* (CL:SETF (EXEC-EVENT-INPUT *CURRENT-EVENT*) INPUT))))) (T (* ;; "Handle non-exec commands (fns, functions, macros, etc.).") (CL:WHEN *CURRENT-EVENT* (CL:SETF (EXEC-EVENT-INPUT *CURRENT-EVENT*) INPUT)) (CL:WHEN *EXEC-MAKE-UNDOABLE-P* (if (CDR TODO) then (SETQ TODO (CONS (OR (CDR (ASSOC (CAR TODO) LISPXFNS)) (CAR TODO)) (CDR TODO))) else (SETQ TODO (LIST (XCL::MAKE-UNDOABLE (CAR TODO) NIL))))))) (AND ADD-TO-SPELLING-LIST (HISTORY-ADD-TO-SPELLING-LISTS TODO)) (SETQ LISPXHIST *CURRENT-EVENT*) (DSPFONT PRINTOUTFONT T) (RETURN (LET ((HELPCLOCK (CLOCK 2)) VALUES) (DECLARE (CL:SPECIAL HELPCLOCK)) (CL:SETQ CL:+++ CL:++ CL:++ + + - - (CAR INPUT)) (* ;; "the book doesn't define what - and friends should be when input is in APPLY format. Here it says it is just the function name.") (SETQ VALUES (CL:MULTIPLE-VALUE-LIST (CL:IF RETRYFLAG (LET ((HELPFLAG (QUOTE BREAK!))) (DECLARE (CL:SPECIAL HELPFLAG)) (CL:FUNCALL FUNCTION TODO ENVIRONMENT)) (CL:FUNCALL FUNCTION TODO ENVIRONMENT)))) (CL:SETQ CL:/// CL:// CL:// / / VALUES) (CL:UNLESS (EQ (QUOTE NOBIND) (CAR VALUES)) (* ; "Be a bit careful about NOBIND.") (CL:SETQ CL:*** CL:** CL:** CL:* CL:* (SETQ IT (CAR VALUES)))) (CL:WHEN *CURRENT-EVENT* (CL:SETF (EXEC-EVENT-VALUE *CURRENT-EVENT*) (CAR VALUES)) (CL:SETF (EXEC-EVENT-PROPS *CURRENT-EVENT*) (LIST* (QUOTE LISPXVALUES) VALUES (EXEC-EVENT-PROPS *CURRENT-EVENT*)))) (DSPFONT VALUEFONT T) (for X in VALUES do (EXEC-PRINT X)) VALUES))))
(CL:DEFUN EXEC (&KEY XCL::TOP-LEVEL-P (* ; "True of top level execs. Used for event number restarting and profile caching.") (XCL::WINDOW (WFROMDS (TTYDISPLAYSTREAM))) (* ; "Window for this exec, if any.") (XCL::TITLE NIL XCL::TITLE-SUPPLIED) (* ; "If given, specific title for this window.") ((:COMMAND-TABLES *THIS-EXEC-COMMANDS*) (LIST *EXEC-COMMAND-TABLE*)) (* ; "List of hash tables to look up commands in.") XCL::ENVIRONMENT (* ; "Lexical environment to evaluate things in, default NIL.") XCL::PROMPT (* ; "Special prompt to use (optional).") ((:FUNCTION XCL::FN) (QUOTE EVAL-INPUT)) (* ; "Function for processing input.") XCL::PROFILE (* ; "Optional profile, sets the exec's bindings.") XCL::ID (* ; "A handle on the exec.") &ALLOW-OTHER-KEYS (* ; "To catch obsolete calls") &AUX (*EXEC-ID* (PROCESS-EXEC-ID (THIS.PROCESS) XCL::ID)) (XCL::PROFILE-CACHE (XCL::GET-PROCESS-PROFILE (THIS.PROCESS))) (* ; "The exec's cached profile (if entering from a hardreset).")) (CL:PROGV (MAPCAR *PER-EXEC-VARIABLES* (FUNCTION CAR)) (MAPCAR *PER-EXEC-VARIABLES* (FUNCTION (LAMBDA (XCL::X) (EVAL (CADR XCL::X))))) (CL:WHEN (OR (NULL XCL::TOP-LEVEL-P) (NULL XCL::PROFILE-CACHE)) (* ; "If not hardresetting...") (CL:WHEN XCL::PROFILE (* ; "then initialize the profile vars.") (XCL:RESTORE-PROFILE XCL::PROFILE)) (CL:WHEN XCL::PROMPT (* ; "If a special prompt was provided (as from the debugger)...") (CL:SETQ XCL:*EXEC-PROMPT* XCL::PROMPT) (* ; "...use it."))) (CL:WHEN XCL::TOP-LEVEL-P (CL:IF (NULL XCL::PROFILE-CACHE) (* ; "This was a new entry into top level exec.") (CL:SETF (XCL::GET-PROCESS-PROFILE (THIS.PROCESS)) (XCL:SAVE-PROFILE (XCL:COPY-PROFILE "EXEC"))) (* ; "...make a fresh cache and save bindings into it.") (XCL:RESTORE-PROFILE XCL::PROFILE-CACHE) (* ; "...otherwise it was a HARDRESET."))) (CL:WHEN XCL::WINDOW (COND ((NOT XCL::TITLE-SUPPLIED) (* ; "If no title was supplied, set it to the default.") (XCL::EXEC-TITLE-FUNCTION XCL::WINDOW *EXEC-ID*)) (XCL::TITLE (* ; "If a non-nil title was supplied, set the title to it.") (WINDOWPROP XCL::WINDOW (QUOTE TITLE) XCL::TITLE))) (TTYDISPLAYSTREAM (DECODE/WINDOW/OR/DISPLAYSTREAM XCL::WINDOW))) (LET ((*CURRENT-EVENT* NIL) (* ; "the event being processed. Used by some commands") (XCL::OLD-DS (CL:IF XCL::WINDOW (TTYDISPLAYSTREAM (DECODE/WINDOW/OR/DISPLAYSTREAM XCL::WINDOW))))) (CL:LOOP (CL:FORMAT T "~&~%%") (* ; "newlines to notice that this is a new instance of the exec") (PROG1 (ERSETQ (CL:LOOP (* ; "loop until errors out") (CL:SETQ *CURRENT-EVENT* (GET-NEXT-HISTORY-EVENT LISPXHISTORY *EXEC-ID* XCL:*EXEC-PROMPT* (NOT XCL::TOP-LEVEL-P))) (* ; "This optimization keeps HARDRESET from generating all new event numbers for all execs that are open.") (PRINT-EVENT-PROMPT *CURRENT-EVENT*) (DSPFONT INPUTFONT T) (LET ((XCL::ORIGINAL-INPUT (EXEC-READ-LINE)) (LISPXHIST LISPXHIST) (HELPCLOCK 0)) (DECLARE (CL:SPECIAL LISPXHIST HELPCLOCK)) (CL:UNLESS (CL:EQUAL XCL::ORIGINAL-INPUT (QUOTE (NIL))) (DO-EVENT XCL::ORIGINAL-INPUT XCL::ENVIRONMENT XCL::FN) (CL:WHEN XCL::TOP-LEVEL-P (* ; "Used to determine whether to cache the settings of the profile back into the process (for retrieval in case of hardreset).") (XCL::SAVE-CURRENT-EXEC-PROFILE)))))) (CL:WHEN XCL::WINDOW (TTYDISPLAYSTREAM XCL::OLD-DS)))))))
(CL:DEFUN EXEC-EVAL (FORM &OPTIONAL ENVIRONMENT &KEY (PROMPT ">") (ID "eval/") ((:TYPE *CURRENT-EXEC-TYPE*) (QUOTE COMMON-LISP))) (* ; "Edited by JDS 16-Aug-90 12:55.") (LET ((*CURRENT-EVENT* (GET-NEXT-HISTORY-EVENT LISPXHISTORY ID PROMPT T)) (LISPXHIST LISPXHIST) (HELPCLOCK 0) VALUES) (DECLARE (CL:SPECIAL *CURRENT-EVENT* LISPXHIST HELPCLOCK)) (SETQ VALUES (CL:MULTIPLE-VALUE-LIST (EVAL-INPUT (CL:SETF (EXEC-EVENT-INPUT *CURRENT-EVENT*) (LIST FORM)) ENVIRONMENT))) (SETQ IT (CAR VALUES)) (COND (*CURRENT-EVENT* (* ;; "Only update the current event if it's not NIL. This might happen, e.g., if LISPXHIST has been set to NIL by the user.") (CL:SETF (EXEC-EVENT-PROPS *CURRENT-EVENT*) (LIST* (QUOTE LISPXVALUES) VALUES (EXEC-EVENT-PROPS *CURRENT-EVENT*))) (CL:SETF (EXEC-EVENT-VALUE *CURRENT-EVENT*) IT))) (CL:VALUES-LIST VALUES)))
(CL:DEFUN PRINT-ALL-DOCUMENTATION (NAME) "Print all documentation strings for NAME (as symbol and string)." (LET ((FOUND NIL)) (CL:DOLIST (TYPE FILEPKGTYPES) (CL:WHEN (AND (CL:SYMBOLP TYPE) (GET TYPE (QUOTE DEFINED-BY)) (HASH-TABLE-FOR-DOC-TYPE TYPE)) (SETQ FOUND (OR (PRINT-DOCUMENTATION NAME TYPE) FOUND)) (CL:WHEN (CL:SYMBOLP NAME) (SETQ FOUND (OR (PRINT-DOCUMENTATION (STRING NAME) TYPE) FOUND))))) (CL:UNLESS FOUND (CL:FORMAT *TERMINAL-IO* "No documentation found.~%%"))))
(CL:DEFUN PRINT-DOCUMENTATION (NAME TYPE) "If it exists, print documentation for NAME as TYPE. Returns T if doc was found, else NIL." (LET ((DOC (CL:DOCUMENTATION NAME TYPE))) (AND DOC (TRUE (CL:FORMAT *TERMINAL-IO* "~&~A (~A)" DOC (OR (CL:DOCUMENTATION NAME (QUOTE DEFINE-TYPES)) TYPE))))))
(DEFMACRO VALUE-OF (&REST EVENT-SPEC) (BQUOTE (EXEC-VALUE-OF (QUOTE (\, EVENT-SPEC)))))
(CL:DEFUN ADD-EXEC (&KEY (XCL::PROFILE XCL:*PROFILE*) XCL::REGION XCL::TTY (EXEC (QUOTE EXEC)) XCL::ID &ALLOW-OTHER-KEYS) (LET* ((XCL::WINDOW (XCL::SETUP-EXEC-WINDOW (CREATEW XCL::REGION "Exec"))) (XCL::HANDLE (ADD.PROCESS (BQUOTE (PROGN (TTYDISPLAYSTREAM (QUOTE (\, XCL::WINDOW))) (PROCESSPROP (THIS.PROCESS) (QUOTE WINDOW) (QUOTE (\, XCL::WINDOW))) (\, (CASE EXEC (EXEC (BQUOTE (EXEC :TOP-LEVEL-P T :PROFILE (QUOTE (\, XCL::PROFILE)) :ID (QUOTE (\, XCL::ID))))) (T (BQUOTE (XCL::ENTER-EXEC-FUNCTION (QUOTE (\, EXEC)) (QUOTE (\, XCL::PROFILE)) (QUOTE (\, XCL::ID))))))))) (QUOTE NAME) (QUOTE EXEC) (QUOTE RESTARTABLE) T))) (AND XCL::TTY (TTY.PROCESS XCL::HANDLE)) XCL::HANDLE))
(CL:DEFUN EXEC-READ-LINE (&OPTIONAL BUFFER-STRING) (* ;; "Code stolen from READLINE, and not cleaned up. ") (PROG (LINE SPACEFLG CHRCODE (*IN-THE-DEBUGGER* NIL)) (COND ((AND (READP T) (SYNTAXP (PEEKCCODE T T) (QUOTE EOL))) (* ; "Avoid picking up end of line as a NIL.") (READC T))) (SETQ LINE (LIST (EXEC-READ BUFFER-STRING))) TOP (COND ((LISTP (CAR LINE)) (* ; "If we got a list, return right away--it's a standard EVAL form of input") (GO OUT))) LP (SETQ SPACEFLG NIL) (* ; "to distinguish between") (* ; "FOO (A B)") (* ; "FOO(A B)") (* ; "the latter has no space and returns right away") LP1 (COND ((NOT (READP T)) (* ; "nothing more in line buffer, so must have consumed last thing on the line") (GO OUT)) ((NULL (SETQ CHRCODE (PEEKCCODE T T))) (* ; "PEEKCCODE can return NIL when stream is at EOF. However, we already checked for READP before getting here.") (GO OUT)) ((SYNTAXP CHRCODE (QUOTE EOL)) (READC T) (GO OUT)) ((OR (SYNTAXP CHRCODE (QUOTE RIGHTPAREN) *READTABLE*) (SYNTAXP CHRCODE (QUOTE RIGHTBRACKET) *READTABLE*)) (AND (READ T *READTABLE*) (SHOULDNT)) (AND (NULL (CDR LINE)) (SETQ LINE (NCONC1 LINE NIL))) (* ; " A %")%" is treated as NIL if it is the second thing on the line when EXEC-READ-LINE is called") (GO OUT)) ((EQ CHRCODE (CHARCODE SPACE)) (SETQ SPACEFLG T) (READC T) (GO LP1))) (SETQ LINE (NCONC1 LINE (EXEC-READ))) (COND ((NULL (OR (SYNTAXP (SETQ CHRCODE (CHCON1 (LASTC T))) (QUOTE RIGHTPAREN) *READTABLE*) (SYNTAXP CHRCODE (QUOTE RIGHTBRACKET) *READTABLE*))) (GO LP)) ((NOT SPACEFLG) (* ; "A list terminates the line if it is the second element on the line, not preceded by a space.") (* ;; "[JDS 1/12/88: This used to test (AND (NOT SPACEFLG) (READP T)), and loop if there were more input pending. This seems wrong, because when you type it should throw the carriage at once, and not depend on how fast you're typing. Further, when there's type-ahead, it's often followed by a SPACE, to prevent output pausing. With the old test here, that would hang up a final eval-quote form without executing it.]") (GO OUT)) (T (GO LP))) (GO LP) OUT (RETURN (COND ((AND (LISTP LINE) CTRLUFLG) (* ; "Edit interrupt during reading--forces structure editor use.") (SETQ CTRLUFLG NIL) (LET ((*EDIT-INPUT-WITH-TTYIN* NIL)) (FIX-FORM LINE))) (T LINE)))))
(DEFMACRO EXEC-EVENT-ID-PROMPT (EVENT-ID) (BQUOTE (CDDR (\, EVENT-ID))))
(CL:DEFUN FIND-EXEC-COMMAND (NAME TABLE) "Find an exec command based on its name (either a string or a symbol). Returns the command entry or NIL if not found." (CL:WHEN (OR (CL:STRINGP NAME) (CL:SYMBOLP NAME)) (LET ((STR (CL:IF (CL:SYMBOLP NAME) (CL:SYMBOL-NAME NAME) NAME))) (CL:SOME (CL:FUNCTION (CL:LAMBDA (TABLE) (SETQ COM (GETHASH STR TABLE)))) TABLE))))
(CL:DEFUN CIRCLAR-COPYER (INPUT) (* ; "Edited by TT 31-May-1990") (PROG (SCANBUF REST VAL NEW BODY ID AUX (CIRCLAR-FLAG NIL)) (COND ((NLISTP INPUT) (RETURN INPUT)) (T (push SCANBUF (CONS INPUT (SETQ VAL (CONS NIL NIL)))) (push REST VAL) (RPLACA VAL (CAR INPUT)) (RPLACD VAL (CDR INPUT)) (* ;;; "(COND ((EQ X (CAR X)) (RPLACA VAL VAL)) (T (RPLACA VAL (CAR X)))) (COND ((EQ X (CDR X)) (RPLACD VAL VAL)) (T (RPLACD VAL (CDR X))))"))) (* ; "Initialization is over") LP (SETQ BODY (pop REST)) LP0 (COND ((NULL BODY) (RETURN (CL:VALUES VAL CIRCLAR-FLAG))) ((NLISTP BODY) (GO LP)) (T (SETQ NEW BODY) (COND ((NLISTP (CDR NEW))) ((SETQ ID (FASSOC (CDR NEW) SCANBUF)) (SETQ CIRCLAR-FLAG T) (RPLACD NEW (CDR ID))) (T (push REST (SETQ AUX (CONS (CADR NEW) (CDDR NEW)))) (push SCANBUF (CONS (CDR NEW) AUX)) (RPLACD NEW AUX))) (COND ((NLISTP (CAR NEW))) ((SETQ ID (FASSOC (CAR NEW) SCANBUF)) (SETQ CIRCLAR-FLAG T) (RPLACA NEW (CDR ID))) (T (push REST (SETQ AUX (CONS (CAAR NEW) (CDAR NEW)))) (push SCANBUF (CONS (CAR NEW) AUX)) (RPLACA NEW AUX))))) (GO LP)))
(DEFINEQ
(COPY-CIRCLE
(LAMBDA (X) (* ; "Edited 23-May-90 15:02 by Tomtom") (PROG (SCANBUF REST VAL NEW BODY ID AUX) (COND ((NLISTP X) (RETURN X)) (T (push SCANBUF (CONS X (SETQ VAL (CONS NIL NIL)))) (push REST VAL) (RPLACA VAL (CAR X)) (RPLACD VAL (CDR X)) (* ;;; "(COND ((EQ X (CAR X)) (RPLACA VAL VAL)) (T (RPLACA VAL (CAR X)))) (COND ((EQ X (CDR X)) (RPLACD VAL VAL)) (T (RPLACD VAL (CDR X))))"))) (* ; "Initialization is over") LP (SETQ BODY (pop REST)) LP0 (COND ((NULL BODY) (RETURN VAL)) ((NLISTP BODY) (GO LP)) (T (SETQ NEW BODY) (COND ((NLISTP (CDR NEW))) ((SETQ ID (FASSOC (CDR NEW) SCANBUF)) (RPLACD NEW (CDR ID))) (T (push REST (SETQ AUX (CONS (CADR NEW) (CDDR NEW)))) (push SCANBUF (CONS (CDR NEW) AUX)) (RPLACD NEW AUX))) (COND ((NLISTP (CAR NEW))) ((SETQ ID (FASSOC (CAR NEW) SCANBUF)) (RPLACA NEW (CDR ID))) (T (push REST (SETQ AUX (CONS (CAAR NEW) (CDAR NEW)))) (push SCANBUF (CONS (CAR NEW) AUX)) (RPLACA NEW AUX))))) (GO LP)))
)
)
(* ; "CIRCLAR-COPYER and COPY-CIRCLE are the solution for AR#11172")
(DEFINEQ
(EXEC-READ
[CL:LAMBDA (&OPTIONAL BUFFER-STRING) (* ; "Edited 4-Feb-88 18:22 by amd")
(* ;;; "Reads structure from the user (in the exec), taking care to handle read errors so that they will be edited and fixed.")
(HANDLER-BIND [[XCL:SYMBOL-COLON-ERROR #'(LAMBDA (CONDITION)
(DECLARE (CL:SPECIAL CTRLUFLG))
(CL:FORMAT *TERMINAL-IO* "~a~%%" CONDITION)
(SETQ CTRLUFLG T)
(XCL::ESCAPE-COLONS-PROCEED)
(SHOULDNT
"Didn't find XCL::ESCAPE-COLONS-PROCEED"]
[XCL:MISSING-EXTERNAL-SYMBOL #'(LAMBDA (CONDITION)
(DECLARE (CL:SPECIAL CTRLUFLG))
(CL:FORMAT *TERMINAL-IO* "~a~%%" CONDITION)
(SETQ CTRLUFLG T)
(XCL:MAKE-INTERNAL-PROCEED)
(SHOULDNT
"Didn't find XCL:MAKE-INTERNAL-PROCEED"
]
(XCL:MISSING-PACKAGE #'(LAMBDA (CONDITION)
(DECLARE (CL:SPECIAL CTRLUFLG))
(CL:FORMAT *TERMINAL-IO* "~a~%%" CONDITION)
(SETQ CTRLUFLG T)
(XCL:UGLY-SYMBOL-PROCEED)
(SHOULDNT "Didn't find XCL:UGLY-SYMBOL-PROCEED"]
(COND
([OR (NOT (GETD 'TTYIN))
(NOT *EDIT-INPUT-WITH-TTYIN*)
(NOT (DISPLAYSTREAMP (GETSTREAM T 'OUTPUT]
(* ;
 "If debugging and TTYIN breaks, don't want to die")
(CL:READ T))
(T (LET (X)
(COND
((OR (LINEBUFFER-SKIPSEPRS T *READTABLE*)
(until (SETQ X (TTYIN "" NIL NIL '(EVALQT FILLBUFFER NOPROMPT)
NIL NIL BUFFER-STRING *READTABLE*))
do
(* ;; "Until he types something at all, keep printing the event-number prompt.")
(PRINT-EVENT-PROMPT *CURRENT-EVENT*)
(DSPFONT INPUTFONT T))
(EQ X T))
(CL:READ-PRESERVING-WHITESPACE T))
(T (CAR X])
(DIR
[NLAMBDA ARGS (* ; "Edited 12-Mar-87 16:08 by raf")
(DODIR ARGS])
)
(CL:DEFPARAMETER *PER-EXEC-VARIABLES* (QUOTE ((CL:* CL:*) (CL:** CL:**) (CL:*** CL:***) (+ +) (CL:++ CL:++) (CL:+++ CL:+++) (- -) (/ /) (CL:// CL://) (CL:/// CL:///) (HELPFLAG T) (*EVALHOOK* NIL) (*APPLYHOOK* NIL) (*ERROR-OUTPUT* *TERMINAL-IO*) (*READTABLE* *READTABLE*) (*PACKAGE* *PACKAGE*) (XCL:*EVAL-FUNCTION* XCL:*EVAL-FUNCTION*) (XCL:*EXEC-PROMPT* XCL:*EXEC-PROMPT*) (XCL:*DEBUGGER-PROMPT* XCL:*DEBUGGER-PROMPT*))) "List of (non-profile) variables rebound for each Exec")
(CL:DEFVAR CL:* NIL)
(CL:DEFVAR CL:** NIL)
(CL:DEFVAR CL:*** NIL)
(CL:DEFVAR + NIL)
(CL:DEFVAR CL:++ NIL)
(CL:DEFVAR CL:+++ NIL)
(CL:DEFVAR - NIL)
(CL:DEFVAR / NIL "Holds a list of all the values returned by the most recent top-level EVAL.")
(CL:DEFVAR CL:// NIL "Gets the previous value of / when a new value is computed.")
(CL:DEFVAR CL:/// NIL "Gets the previous value of // when a new value is computed.")
(CL:DEFVAR *CURRENT-EVENT* NIL "contains the current event being processed. Used for communicating between Exec and commands")
(CL:DEFVAR *EXEC-ID* NIL "A unique per-exec-process ID so that commands that search the history list can find this Exec's events")
(CL:DEFVAR XCL:*EXEC-PROMPT* "> " "Default prompt used by exec")
(CL:DEFPARAMETER XCL:*EVAL-FUNCTION* (QUOTE CL:EVAL) "The evaluator to use in the exec")
(CL:DEFVAR *NOT-YET-EVALUATED* "<not yet evaluated>")
(CL:DEFVAR *THIS-EXEC-COMMANDS* NIL "List of command hash-tables for the current executive")
(DEFGLOBALVAR *EXEC-COMMAND-TABLE* (HASHARRAY 30 NIL (QUOTE STRING-EQUAL-HASHBITS) (QUOTE STRING-EQUAL)) "hash-table for top level exec commands")
(DEFGLOBALVAR *DEBUGGER-COMMAND-TABLE* (HASHARRAY 20 NIL (QUOTE STRING-EQUAL-HASHBITS) (QUOTE STRING-EQUAL)) "string-equal hash-table for debugger commands")
(CL:DEFVAR *CURRENT-EXEC-TYPE* NIL "Rebound under Exec; if NIL, means use default")
(CL:DEFPARAMETER *EXEC-MAKE-UNDOABLE-P* T "global parameter controls whether the exec makes input undoable")
(CL:DEFVAR *EDIT-INPUT-WITH-TTYIN* T)
(DEFINEQ
(DO-APPLY-EVENT
[LAMBDA (TODO) (* lmm "31-Jul-86 03:22")
(CL:IF (CL:MACRO-FUNCTION (CAR TODO))
(CL:IF (EQ (ARGTYPE (CAR TODO))
3)
(CL:FUNCALL (CAR TODO)
(CL:IF (CDDR TODO)
(CDR TODO)
(CADR TODO)))
(CL:EVAL TODO))
(CL:APPLY (CAR TODO)
(CADR TODO])
(DO-HISTORY-SEARCH
[LAMBDA (SPEC PRED-P VALUE-P) (* ; "Edited 10-Mar-87 18:53 by raf")
(* ;;
"SEARCHES HISTORY LIST, LOOKING FOR SPEC AND RESETTING *EVENTS* TO THE CORRESPONDING TAIL.")
(PROG (PAT1 PAT2 TEM PRED)
(DECLARE (CL:SPECIAL *EVENTS*)) (* ; "Setup by FIND-HISTORY-EVENTS")
[COND
((NOT PRED-P)
(SETQ PAT2 (EDITFPAT SPEC T]
LP [COND
((EQ (CAR *EVENTS*)
*CURRENT-EVENT*)
(SETQ *EVENTS* (CDR *EVENTS*]
[COND
((COND
(PRED-P (APPLY* SPEC (CAR *EVENTS*)))
[PAT1 (EDIT4E PAT1 (CAR (EXEC-EVENT-INPUT (CAR *EVENTS*]
(T (EDITFINDP [COND
(VALUE-P (CL:GETF (EXEC-EVENT-PROPS (CAR *EVENTS*))
'LISPXVALUES))
(T (EXEC-EVENT-INPUT (CAR *EVENTS*]
PAT2 T)))
(RETURN *EVENTS*))
(T (SETQ *EVENTS* (CDR *EVENTS*]
LP1 (COND
((NULL *EVENTS*)
(RETURN NIL)))
(GO LP])
(EVAL-INPUT
[CL:LAMBDA
(TODO ENV) (* ; "Edited 23-Nov-87 13:07 by raf")
(CASE XCL:*EVAL-FUNCTION*
[EVAL (* ; "Interlisp EVAL")
(COND
[(CDR TODO) (* ; "this is the 'apply' case")
(* ;; "we first check for input of things like macros in apply format or Interlisp NLAMBDA functions (which have a MACRO-FUNCTION)")
(if [OR (CDDR TODO)
(AND (CADR TODO)
(NLISTP (CADR TODO]
then
(if (FMEMB (ARGTYPE (CAR TODO))
'(1 3))
then (* ;
"this is an Interlisp NLAMBDA function (1 = spread, 3 = nospread).")
[if (AND (EQ (ARGTYPE (CAR TODO))
3)
(CDDR TODO))
then
(APPLY (CAR TODO)
(CDR TODO))
else
(if (CDDR TODO)
then
(PRIN1 "... = ")
(PRINT TODO)
(APPLY (CAR TODO)
(CDR TODO))
else
(APPLY (CAR TODO)
(CADR TODO]
else
(* ;; "evaluate the entire input list as if it were typed in with parens around it, e.g. a 'FOR I FROM 1 TO 10 DO ...' possibly bogus 'DWIM' case")
(EVAL TODO))
else (* ; "a normal apply case")
(if (CDDR TODO)
then
(PRIN1 "... = ")
(PRINT TODO)
(APPLY (CAR TODO)
(MAPCAR (CDR TODO)
(FUNCTION EVAL)))
else
(APPLY (CAR TODO)
(CADR TODO]
(T (* ; "a normal eval case")
(EVAL (CAR TODO]
(T (* ; "Common Lisp EVAL")
(* ;; "maybe should have used ECASE and checked for Common-Lisp explicitly, but could get recursive errors if *current-exec-type* was rebound")
(COND
[(CDR TODO) (* ; "this is the 'apply' case")
(* ;; "we first check for input of things like macros in apply format or Interlisp NLAMBDA functions (which have a MACRO-FUNCTION)")
(COND
[(CL:MACRO-FUNCTION (CAR TODO))
(COND
[(FMEMB (ARGTYPE (CAR TODO))
'(1 3)) (* ;
"this is an Interlisp NLAMBDA function (1 = spread, 3 = nospread).")
(COND
((AND (EQ (ARGTYPE (CAR TODO))
3)
(CDDR TODO))
(APPLY (CAR TODO)
(CDR TODO)))
(T (COND
((CDDR TODO)
(PRIN1 "... = ")
(PRINT TODO)
(APPLY (CAR TODO)
(CDR TODO)))
(T (APPLY (CAR TODO)
(CADR TODO]
(T
(* ;; "evaluate the entire input list as if it were typed in with parens around it, e.g. a 'FOR I FROM 1 TO 10 DO ...' possibly bogus 'DWIM' case")
(CL:EVAL TODO ENV]
(T (* ; "a normal apply case")
(COND
[(CDDR TODO)
(PRIN1 "... = ")
(PRINT TODO)
(CL:APPLY (CAR TODO)
(CL:MAPCAR #'(CL:LAMBDA (A)
(CL:EVAL A ENV)) (CDR TODO]
(T (CL:APPLY (CAR TODO)
(CADR TODO]
(T (* ; "a normal eval case")
(CL:EVAL (CAR TODO)
ENV])
(EVENTS-INPUT
[CL:LAMBDA (EVENTS) (* ; "Edited 26-Nov-86 11:16 by lmm")
(* ;
"takes a list of events and returns the input concatenated into a single event, as appropriate ")
(IF (CDR EVENTS)
THEN
[CONS 'DO-EVENTS (FOR EVENT IN EVENTS COLLECT (IF (CDR (EXEC-EVENT-INPUT
EVENT))
THEN
(CONS 'EVENT (
 EXEC-EVENT-INPUT
EVENT))
ELSE
(CAR (EXEC-EVENT-INPUT
EVENT]
ELSE
(LET* ((INPUT (EXEC-EVENT-INPUT (CAR EVENTS)))
(TAIL (FMEMB HISTSTR0 INPUT)))
(IF TAIL THEN (LDIFF INPUT TAIL)
ELSE INPUT])
(EXEC-PRIN1
(CL:LAMBDA (VALUE) (* ; "Edited 23-Feb-87 18:15 by raf")
(WRITE VALUE :STREAM *TERMINAL-IO* :ESCAPE T)))
(EXEC-VALUE-OF
[LAMBDA (EVENT-SPEC) (* lmm "11-Sep-86 17:28")
(CL:VALUES-LIST (LISTGET (EXEC-EVENT-PROPS (CAR (FIND-HISTORY-EVENTS EVENT-SPEC
LISPXHISTORY)))
'LISPXVALUES])
(GET-NEXT-HISTORY-EVENT
[LAMBDA (HISTORY ID PROMPT FIRST-ONLY) (* ; "Edited 2-Mar-87 15:34 by raf")
(for EVENT in (HISTORY-EVENTS HISTORY)
do
(CL:WHEN (EQ (CADR (LISTP (EXEC-EVENT-ID EVENT)))
ID)
(CL:IF (AND (NULL (EXEC-EVENT-INPUT EVENT))
(NULL (EXEC-EVENT-PROPS EVENT)))
(PROGN (CL:SETF (CDDR (EXEC-EVENT-ID EVENT))
PROMPT)
(RETURN EVENT))
(GO $$OUT)))
(if FIRST-ONLY then (* ; "only do this for the first event")
(GO $$OUT))
finally
(COND
(HISTORY (* ; "Watch out for NIL LISPXHISTORY")
(SETQ EVENT (MAKE-EXEC-EVENT :ID (LIST* (CL:INCF (HISTORY-INDEX
HISTORY))
ID PROMPT)))
(CL:PUSH EVENT (HISTORY-EVENTS HISTORY))
(CL:SETF (CDR (CL:NTHCDR (CL:1- (HISTORY-SIZE HISTORY))
(HISTORY-EVENTS HISTORY)))
NIL)
(RETURN EVENT])
(HISTORY-ADD-TO-SPELLING-LISTS
[LAMBDA (INPUT) (* lmm "31-Jul-86 02:22")
(COND
((CDR INPUT) (* ;
"Add to the spelling list if it has a definition")
(AND (LITATOM (CAR INPUT))
(FGETD (CAR INPUT))
(ADDSPELL (CAR INPUT)
2)))
([AND (CL:CONSP (CAR INPUT))
(LITATOM (CAR (CAR INPUT] (* ; "looks like a valid function")
(AND [OR (CL:FBOUNDP (CAR (CAR INPUT)))
(CL:SPECIAL-FORM-P (CAR (CAR INPUT]
(ADDSPELL (CAR (CAR INPUT))
2)))
((AND (CL:SYMBOLP (CAR INPUT))
(BOUNDP (CAR INPUT)))
(ADDSPELL (CAR INPUT)
3])
(HISTORY-NTH
[LAMBDA (LST N ID) (* lmm " 6-Nov-86 01:40")
(bind EVENT while LST do (if (<= N 0)
then
(RETURN))
(SETQ EVENT (CAR LST))
(CL:IF (AND (EXEC-EVENT-INPUT EVENT)
(NEQ EVENT *CURRENT-EVENT*)
(OR (NOT (STRINGP ID))
(EQ (CADR (LISTP (EXEC-EVENT-ID EVENT)))
ID)))
(if (<= (CL:DECF N)
0)
then
(RETURN LST)))
(pop LST])
(PRINT-HISTORY
[CL:LAMBDA (HISTORY EVENT-SPECS &OPTIONAL NOVALUES) (* lmm " 5-Nov-86 23:29")
(PROG [HELPCLOCK (EVENTS (CL:IF EVENT-SPECS (FIND-HISTORY-EVENTS EVENT-SPECS
HISTORY)
(HISTORY-EVENTS HISTORY]
(TERPRI T)
(for X in EVENTS do (PRINT-EVENT X NOVALUES)
(FRESHLINE T)
(TERPRI T))
(TERPRI T)
(RETURN (CL:VALUES])
(FIND-HISTORY-EVENTS
[LAMBDA (EVENT-SPEC HISTORY) (* ; "Edited 6-Nov-87 15:22 by raf")
(PROG [(*EVENTS* (HISTORY-EVENTS HISTORY))
(ORIGINAL-EVENT-SPEC EVENT-SPEC)
SPEC TEM VALUE-P VAL PRED-P ALL-P (AND-SPEC (CL:MEMBER "AND" EVENT-SPEC :TEST
'STRING.EQUAL]
(DECLARE (CL:SPECIAL *EVENTS*)) (* ; "Used by DO-HISTORY-SEARCH")
[if AND-SPEC then (RETURN (APPEND (SETQ *EVENTS* (FIND-HISTORY-EVENTS
(LDIFF EVENT-SPEC
AND-SPEC)
HISTORY))
(for X in (FIND-HISTORY-EVENTS (CDR
AND-SPEC
)
HISTORY)
when
(NOT (FMEMB X *EVENTS*))
collect X]
LP (CL:WHEN (EQ (CAR *EVENTS*)
*CURRENT-EVENT*)
(SETQ *EVENTS* (CDR *EVENTS*)))
[CASE-EQUALP (SETQ SPEC (CAR EVENT-SPEC))
(ALL (SETQ ALL-P T)
(pop EVENT-SPEC)
(GO LP))
(F [COND
((SETQ TEM (CDR EVENT-SPEC))
(* ;
"Otherwise, F is not a special symbol, e.g. user types REDO F, meaning search for F itself.")
(SETQ EVENT-SPEC (CDR EVENT-SPEC))
(SETQ SPEC (CAR EVENT-SPEC]
(DO-HISTORY-SEARCH SPEC PRED-P VALUE-P))
[FROM (LET ((EVENTS (FIND-HISTORY-EVENTS (CDR EVENT-SPEC)
HISTORY)))
(CL:WHEN (CDR EVENTS)
(ERROR "from?"))
(RETURN (REVERSE (LDIFF *EVENTS*
(CDR (CL:MEMBER
(CAR EVENTS)
*EVENTS*]
(SUCHTHAT
(* ;; "What follows SUCHTHAT is a function to be applied to the entire event; and if true, approves that event.")
(SETQ PRED-P T)
(SETQ EVENT-SPEC (CDR EVENT-SPEC))
(SETQ SPEC (CAR EVENT-SPEC))
(DO-HISTORY-SEARCH SPEC PRED-P VALUE-P))
(= (SETQ VALUE-P T)
(GO LP))
(T (COND
((NOT (CL:INTEGERP SPEC))
(DO-HISTORY-SEARCH SPEC PRED-P VALUE-P)
(* ; "Does searching.")
)
[(< SPEC 0) (* ; "count backward")
(SETQ *EVENTS* (HISTORY-NTH *EVENTS* (- SPEC)
(AND (NOT ALL-P)
*EXEC-ID*]
(T (* ; "absolute event number")
(SETQ *EVENTS* (SEARCH-FOR-EVENT-NUMBER *EVENTS* HISTORY SPEC]
[COND
((NULL *EVENTS*)
(COND
(ALL-P (RETURN VAL)))
(ERROR SPEC '" ?" T))
((NULL (SETQ EVENT-SPEC (CDR EVENT-SPEC)))
(COND
[(NULL ALL-P)
(RETURN (LIST (CAR *EVENTS*]
(T (SETQ VAL (NCONC1 VAL (CAR *EVENTS*)))
(SETQ EVENT-SPEC ORIGINAL-EVENT-SPEC]
(SETQ *EVENTS* (CDR *EVENTS*))
(CL:WHEN (EQ (CAR *EVENTS*)
*CURRENT-EVENT*)
(SETQ *EVENTS* (CDR *EVENTS*)))
(SETQ VALUE-P NIL)
(SETQ PRED-P NIL)
(GO LP])
(PRINT-EVENT
[CL:LAMBDA (EVENT &OPTIONAL NOVALUES) (* ; "Edited 9-Mar-87 11:02 by raf")
(PROG ((INPUT (EXEC-EVENT-INPUT EVENT))
(FILE (\GETSTREAM T 'OUTPUT))
(POSITION (STRINGWIDTH "99/9999>" T))
Y TEM EVENT#)
(FRESHLINE FILE)
(if (SETQ TEM (LISTGET (EXEC-EVENT-PROPS EVENT)
'*HISTORY*))
then
(DSPXPOSITION POSITION FILE)
(CL:FORMAT FILE "~{~S ~}~&" TEM))
(PRINT-EVENT-PROMPT EVENT)
(DSPXPOSITION (MAX POSITION (DSPXPOSITION NIL FILE))
T)
(DSPFONT INPUTFONT FILE)
LP [COND
((SETQ Y (FMEMB HISTSTR0 (LISTP INPUT)))
(SETQ INPUT (LDIFF INPUT Y]
[COND
[(NLISTP INPUT)
(COND
((NULL INPUT)
(if (EXEC-EVENT-PROPS EVENT)
then (* ; "don't do anything")
else
(PRIN1 "<in progress>" FILE)))
(T (* ; "shouldn't happen??")
(EXEC-PRIN1 INPUT]
[(CDDR INPUT) (* ;
"a command, just print out all elements")
(CASE (CAR INPUT)
(DO-EVENTS (* ;
" special generated combination event")
(DSPFONT DEFAULTFONT FILE)
(CL:FORMAT FILE "~A" (CAR INPUT))
(DSPFONT INPUTFONT FILE)
(for X in (CDR INPUT)
do
(FRESHLINE FILE)
(DSPXPOSITION POSITION FILE)
(CL:FORMAT FILE " ~S" X)))
(T (CL:FORMAT FILE "~{~S ~}~&" INPUT]
[(CDR INPUT) (* ; "APPLY format")
(EXEC-PRIN1 (CAR INPUT))
(COND
((NULL (SETQ TEM (CADR INPUT)))
(PRIN1 ")" FILE))
(T (COND
((NLISTP TEM)
(SPACES 1 FILE)))
(EXEC-PRIN1 TEM]
(T (* ; "EVAL input")
(EXEC-PRIN1 (CAR INPUT]
(COND
(Y (SETQ INPUT (CDR Y))
(TERPRI FILE)
(DSPXPOSITION POSITION FILE)
(GO LP)))
LP1 [LET [(RNT (CL:GETF (EXEC-EVENT-PROPS EVENT)
'*LISPXPRINT*]
(if RNT then (DSPFONT PRINTOUTFONT FILE)
(FRESHLINE FILE)
(MAPC RNT (FUNCTION (LAMBDA (X)
(LISPXREPRINT X FILE]
(COND
((NOT NOVALUES)
(DSPFONT VALUEFONT FILE)
(for X in (LISTGET (CDDDR EVENT)
'LISPXVALUES)
do
(FRESHLINE FILE)
(DSPXPOSITION POSITION FILE)
(EXEC-PRIN1 X])
(PRINT-EVENT-PROMPT
[LAMBDA (EVENT) (* ; "Edited 2-Mar-87 16:47 by raf")
(LET [(TERM (\GETSTREAM T 'OUTPUT] (* ;
"Crock because format interprets T to mean primary output, not terminal")
(FRESHLINE TERM)
(if (CL:CONSP (EXEC-EVENT-ID EVENT))
then
(DSPFONT PROMPTFONT TERM)
(DESTRUCTURING-BIND (INDEX ID . PROMPT)
(EXEC-EVENT-ID EVENT)
(IF (CL:EQUAL ID "")
THEN
(CL:FORMAT TERM "~D~A" INDEX PROMPT)
ELSE
(CL:FORMAT TERM "~A/~D~A" ID INDEX PROMPT)))
elseif LISPXHISTORY then (CL:FORMAT TERM "~D~A" (ENTRY# LISPXHISTORY EVENT)
(EXEC-EVENT-ID EVENT))
else (* ;
"No prompt availible, use the default.")
(CL:FORMAT TERM "~A" XCL:*EXEC-PROMPT*])
(PROCESS-EXEC-ID
(CL:LAMBDA (PROCESS &OPTIONAL ID) (* ; "Edited 5-Mar-87 17:29 by raf")
(OR (PROCESSPROP PROCESS 'ID)
(LET ((NAME (PROCESS.NAME PROCESS)))
[PROCESSPROP PROCESS 'ID (OR ID (SETQ ID
(COND
((STRPOS "EXEC" NAME 1 NIL T)
(OR (SUBSTRING NAME 6 -1)
""))
(T
(* ; "under some other process")
(STRING NAME]
ID))))
(SEARCH-FOR-EVENT-NUMBER
[LAMBDA (EVENTS HISTORY SPEC) (* lmm "11-Sep-86 10:53")
(while EVENTS do (if [LET [(ID (EXEC-EVENT-ID (CAR EVENTS]
(COND
((LISTP ID)
(EQL (CAR ID)
SPEC))
(T (EQL SPEC (ENTRY# HISTORY (CAR EVENTS]
then
(RETURN EVENTS)
else
(pop EVENTS])
(\PICK.EVALQT
[LAMBDA NIL (* ; "Edited 27-Feb-87 17:40 by raf")
(* ;;;
"Replacement for \PROC.REPEATEDLYEVALQT. Activated by the HARDRESET at the end of LOADUP.LISP")
(INPUT T)
(OUTPUT T)
(TTYDISPLAYSTREAM \TopLevelTtyWindow)
(\RESETSYSTEMSTATE)
(EXEC :TOP-LEVEL-P T :PROFILE XCL:*PROFILE* :WINDOW (XCL::SETUP-EXEC-WINDOW
\TopLevelTtyWindow])
(LISPXREPRINT
[LAMBDA (X FILE) (* ; "Edited 19-Jan-87 16:03 by bvm:")
(* ;
"takes an element from a *LISPXPRINT* property and prints it properly.")
[OR FILE (SETQ FILE (\GETSTREAM T 'OUTPUT]
(COND
((STRINGP X)
(PRIN1 X FILE))
((NLISTP X)
(PRIN2 X FILE))
((CL:STRINGP (CAR X))
(CL:APPLY (FUNCTION CL:FORMAT)
FILE X))
(T (SELECTQ (CAR X)
((PRINT PRIN1 PRIN2 SPACES)
(APPLY* (CAR X)
(CADR X)
FILE
(CADDDR X)))
(TAB (TAB (CADR X)
(CADDR X)
FILE))
(TERPRI (TERPRI FILE))
(LISPXPRINTDEF0 [APPLY (CAR X)
(CONS (CADR X)
(CONS FILE (CDDDR X])
(APPLY (CAR X)
(CONS (CADR X)
(CONS FILE (CDDDR X])
)
(DECLARE%: DONTEVAL@LOAD DOCOPY
(MOVD? (QUOTE READ) (QUOTE TTYINREAD))
(MOVD (QUOTE \PICK.EVALQT) (QUOTE \PROC.REPEATEDLYEVALQT))
(SETQ BackgroundMenu)
)
(DEFMACRO CASE-EQUALP (SELECTOR &REST CASES) (LET* ((KV (CL:IF (CL:SYMBOLP SELECTOR) SELECTOR (GENSYM))) (CLAUSES (for STRING-CASE in CASES collect (COND ((FMEMB (CAR STRING-CASE) (QUOTE (T CL:OTHERWISE))) (BQUOTE (T (\,@ (CDR STRING-CASE))))) ((NOT (CL:CONSP (CAR STRING-CASE))) (BQUOTE ((STRING.EQUAL (\, KV) (QUOTE (\, (CAR STRING-CASE)))) (\,@ (CDR STRING-CASE))))) (T (BQUOTE ((OR (\,@ (CL:DO ((X (CAR STRING-CASE) (CDR X)) (Y NIL)) ((CL:ATOM X) (REVERSE Y)) (CL:PUSH (BQUOTE (STRING.EQUAL (\, KV) (QUOTE (\, (CAR X))))) Y)))) (\,@ (CDR STRING-CASE))))))))) (CL:IF (EQ KV SELECTOR) (BQUOTE (COND (\,@ CLAUSES))) (BQUOTE (LET (((\, KV) (\, SELECTOR))) (COND (\,@ CLAUSES)))))))
(DEFMACRO EXEC-EVENT-PROPS (X) (BQUOTE (CDDDR (\, X))))
(CL:DEFUN EXEC-PRINT (VALUE) (FRESHLINE T) (WRITE VALUE :STREAM *TERMINAL-IO* :ESCAPE T))
(CL:DEFUN EXEC-FORMAT (FORMAT-STRING &REST ARGS) (AND (CL:STRINGP FORMAT-STRING) (LISPXPUT (QUOTE *LISPXPRINT*) (LIST (CONS FORMAT-STRING ARGS)) T *CURRENT-EVENT*)) (CL:APPLY (QUOTE CL:FORMAT) (\GETSTREAM T (QUOTE OUTPUT)) FORMAT-STRING ARGS))
(ADDTOVAR BackgroundMenuCommands (EXEC (QUOTE (ADD-EXEC :TTY T)) "Start a new Exec using XCL:*PROFILE*" (SUBITEMS ("Xerox Common Lisp" (QUOTE (ADD-EXEC :PROFILE "XCL" :TTY T)) "Start a new Exec using XCL profile") ("Common Lisp" (QUOTE (ADD-EXEC :PROFILE "COMMON-LISP" :TTY T)) "Start a Common Lisp Exec" (SUBITEMS ("Old Common Lisp" (QUOTE (ADD-EXEC :PROFILE "LISP" :TTY T)) "Start an old Common Lisp (LISP package) Exec"))) ("Interlisp" (QUOTE (ADD-EXEC :PROFILE "INTERLISP" :TTY T)) "Start an Interlisp Exec" (SUBITEMS ("Old-Interlisp" (QUOTE (ADD-EXEC :PROFILE "OLD-INTERLISP-T" :EXEC (QUOTE EVALQT) :TTY T)) "Start an old-style LISPX window"))))))
(ADDTOVAR SYSTEMINITVARS (LISPXHISTORY NIL 0 100 100) (GREETHIST))
(* ;; "Exec Commands")
(DEF-DEFINE-TYPE COMMANDS "Exec Commands")
(DEFDEFINER (DEFCOMMAND (:NAME (CL:LAMBDA (WHOLE) (LET ((NAME (CL:SECOND WHOLE))) (CL:IF (CL:CONSP NAME) (CAR NAME) NAME))))) COMMANDS (NAME ARGUMENTS &ENVIRONMENT ENV &BODY BODY) (LET ((COMMAND-LEVEL (QUOTE *EXEC-COMMAND-TABLE*)) (COMMAND-TYPE :EVAL) (PREFIX "exec-")) (if (LISTP NAME) then (SETQ NAME (PROG1 (CAR NAME) (for X in (CDR NAME) do (CL:ECASE X ((:QUIET :HISTORY :INPUT :EVAL :MACRO) (SETQ COMMAND-TYPE X)) ((:DEBUGGER :BREAK) (SETQ COMMAND-LEVEL (QUOTE *DEBUGGER-COMMAND-TABLE*)) (SETQ PREFIX "break-"))))))) (LET* ((CMACRONAME (PACK* PREFIX NAME)) (STRINGNAME (STRING NAME))) (CL:MULTIPLE-VALUE-BIND (PARSED-BODY PARSED-DECLARATIONS PARSED-DOCSTRING) (PARSE-DEFMACRO ARGUMENTS (QUOTE $$MACRO-FORM) BODY NAME ENV :ENVIRONMENT (QUOTE $$MACRO-ENV)) (BQUOTE (PROGN (CL:SETF (CL:SYMBOL-FUNCTION (QUOTE (\, CMACRONAME))) (FUNCTION (CL:LAMBDA ($$MACRO-FORM $$MACRO-ENV) (\,@ PARSED-DECLARATIONS) (\, PARSED-BODY)))) (CL:SETF (CL:DOCUMENTATION (\, STRINGNAME) (QUOTE COMMANDS)) (\, PARSED-DOCSTRING)) (PUTHASH (\, STRINGNAME) (QUOTE (\, (MAKE-COMMAND-ENTRY :FUNCTION CMACRONAME :MODE COMMAND-TYPE :ARGUMENTS (\SIMPLIFY.CL.ARGLIST ARGUMENTS)))) (\, COMMAND-LEVEL))))))))
(DEFCOMMAND ("?" :QUIET) (&OPTIONAL (NAME NIL NAMEP)) "Show forms of valid input. ? <name> shows name's documentation." (CL:IF NAMEP (PRINT-ALL-DOCUMENTATION NAME) (PROGN (CL:FORMAT T "~&You are typing at the Exec. Enter~&") (DSPFONT INPUTFONT T) (CL:FORMAT T "<expression>") (DSPFONT DEFAULTFONT T) (CL:FORMAT T " ~20Tto evaluate an expression~&") (DSPFONT INPUTFONT T) (CL:FORMAT T "function(arg1 arg2 ...)") (DSPFONT DEFAULTFONT T) (CL:FORMAT T " ~20Tto apply function to the arguments given~&~%%or one of:") (FOR X ON (REVERSE *THIS-EXEC-COMMANDS*) DO (LET (COMS) (MAPHASH (CAR X) (CL:FUNCTION (CL:LAMBDA (VAL KEY) (AND (NOT (SOME (CDR X) (CL:FUNCTION (CL:LAMBDA (TAB) (GETHASH KEY TAB))))) (PUSH COMS (LIST KEY VAL)))))) (CL:MAPC (CL:FUNCTION (CL:LAMBDA (COM) (CL:FORMAT T "~&") (DSPFONT INPUTFONT T) (CL:FORMAT T "~A " (CAR COM)) (DSPFONT COMMENTFONT T) (PRINT-ARGLIST (COMMAND-ENTRY-ARGUMENTS (CADR COM))) (DSPFONT DEFAULTFONT T) (LET ((DOC (CL:DOCUMENTATION (CAR COM) (QUOTE COMMANDS)))) (CL:WHEN DOC (TAB 20 1 T) (CL:FORMAT T "~A" DOC))))) (CL:SORT COMS (CL:FUNCTION CL:STRING<) :KEY (CL:FUNCTION CAR))))))) (CL:VALUES))
(DEFCOMMAND ("??" :QUIET) (&REST EVENT-SPECS) "Show events specified EVENT-SPECS (or all events)" (IF (AND EVENT-SPECS (EQ (CAR EVENT-SPECS) (QUOTE :INPUT))) THEN (PRINT-HISTORY LISPXHISTORY (CDR EVENT-SPECS) T) ELSE (PRINT-HISTORY LISPXHISTORY EVENT-SPECS)) (CL:VALUES))
(DEFCOMMAND ("CONN" :EVAL) (&OPTIONAL DIRECTORY) "Change default pathname to DIRECTORY" (/CNDIR DIRECTORY))
(DEFCOMMAND "DA" NIL "Returns current time & date" (DATE))
(DEFCOMMAND ("DIR" :EVAL) (&OPTIONAL PATHNAME &REST KEYWORDS) "Show directory listing for PATHNAME" (DODIR (CONS PATHNAME (MAPCAR KEYWORDS (FUNCTION (LAMBDA (CL:KEYWORD) (IF (CL:SYMBOLP CL:KEYWORD) THEN (CL:INTERN (CL:SYMBOL-NAME CL:KEYWORD) "INTERLISP") ELSE CL:KEYWORD)))))))
(DEFCOMMAND "DO-EVENTS" (&REST INPUTS &ENVIRONMENT ENV) "Execute the multiple events in INPUTS, using the environment ENV for all evaluations." (LET ((OUTER-EVENT (AND *CURRENT-EVENT* (COPY-EXEC-EVENT *CURRENT-EVENT*))) (* ; "DO-EVENT smashes *CURRENT-EVENT*, so we copy and save it.")) (CL:WHEN OUTER-EVENT (CL:SETF (EXEC-EVENT-INPUT OUTER-EVENT) (CONS (QUOTE DO-EVENTS) INPUTS)) (* ; "Each of these is fixed up below.")) (ERSETQ (CL:MAPL (CL:FUNCTION (CL:LAMBDA (INPUT) (LET ((TODO (CL:IF (EQ (CAR (LISTP (CAR INPUT))) (QUOTE EVENT)) (CDR (CAR INPUT)) (LIST (CAR INPUT)))) VALUES) (CL:WHEN ADDSPELLFLG (HISTORY-ADD-TO-SPELLING-LISTS TODO)) (SETQ VALUES (DO-EVENT TODO ENV)) (* ; "If it exists, *CURRENT-EVENT* gets smashed here.") (CL:WHEN OUTER-EVENT (* ; "If there is an outer event...") (* ;; "Fix the outer event's list of inputs with the expanded input.") (RPLACA INPUT (CAR (EXEC-EVENT-INPUT *CURRENT-EVENT*))) (CL:WHEN VALUES (* ; "If the last sub-event generated some values...") (* ;; "Add the new values to the outer event's values.") (LET ((OLD-VALUES (CL:GETF (EXEC-EVENT-PROPS OUTER-EVENT) (QUOTE LISPXVALUES)))) (CL:IF OLD-VALUES (NCONC OLD-VALUES VALUES) (CL:SETF (EXEC-EVENT-PROPS OUTER-EVENT) (LIST* (QUOTE LISPXVALUES) VALUES (EXEC-EVENT-PROPS OUTER-EVENT)))))))))) INPUTS)) (CL:WHEN *CURRENT-EVENT* (* ; "If there was a current event...") (* ; "Smash saved values back from OUTER-EVENT.") (CL:SETF (EXEC-EVENT-INPUT *CURRENT-EVENT*) (EXEC-EVENT-INPUT OUTER-EVENT)) (CL:SETF (EXEC-EVENT-ID *CURRENT-EVENT*) (EXEC-EVENT-ID OUTER-EVENT)) (CL:SETF (EXEC-EVENT-VALUE *CURRENT-EVENT*) (EXEC-EVENT-VALUE OUTER-EVENT)) (CL:SETF (EXEC-EVENT-PROPS *CURRENT-EVENT*) (EXEC-EVENT-PROPS OUTER-EVENT)))) (SETQ *CURRENT-EVENT* NIL) (* ; "Keeps the DO-EVENT which is evaluating us from setting the event's results to (the result of evaluating) the NIL we return. This is alright since *CURRENT-EVENT* is already pointed to by the history list.") (CL:VALUES) (* ; "We've evaluated all the subforms directly with DO-EVENT so we don't return a form to EVAL."))
(DEFCOMMAND ("FIX" :HISTORY) (&REST EVENT-SPEC) "Edit input for specified events" (APPLY (QUOTE FIX-FORM) (CL:MULTIPLE-VALUE-LIST (CIRCLAR-COPYER (EVENTS-INPUT (FIND-HISTORY-EVENTS (OR EVENT-SPEC (QUOTE (-1))) LISPXHISTORY))))))
(DEFCOMMAND "FORGET" (&REST EVENT-SPEC) "Erase UNDO information (for specified events)." (FOR EVENT IN (FIND-HISTORY-EVENTS (OR EVENT-SPEC (QUOTE (-1))) LISPXHISTORY) DO (UNDOLISPX2 EVENT T) FINALLY (CL:FORMAT T "Forgotten.~&")) (CL:VALUES))
(DEFCOMMAND "NAME" (COMMAND-NAME &OPTIONAL ARGUMENT-LIST &REST EVENT-SPEC) "NAME command-name [argument-list] [event-spec] defines new command containing the event." (CL:UNLESS (LISTP ARGUMENT-LIST) (CL:PUSH ARGUMENT-LIST EVENT-SPEC) (SETQ ARGUMENT-LIST NIL)) (LET ((EVENTS (FIND-HISTORY-EVENTS EVENT-SPEC LISPXHISTORY)) (ARGNAMES (FOR I FROM 1 AS X IN ARGUMENT-LIST COLLECT (PACK* (QUOTE ARG) I)))) (CL:EVAL (BQUOTE (DEFCOMMAND ((\, COMMAND-NAME) :HISTORY) (\, ARGNAMES) (SUBPAIR (QUOTE (\, ARGNAMES)) (LIST (\,@ ARGNAMES)) (QUOTE (\, (SUBPAIR ARGUMENT-LIST ARGNAMES (EVENTS-INPUT EVENTS) T)))))))))
(DEFCOMMAND ("NDIR" :EVAL) (&OPTIONAL PATHNAME &REST KEYWORDS) "Show directory listing for PATHNAME in abbreviated format" (DODIR (CONS PATHNAME KEYWORDS) (QUOTE (P COLUMNS 20)) (QUOTE *) ""))
(DEFCOMMAND "PL" (CL:SYMBOL) "Show property list of SYMBOL" (PRINTPROPS CL:SYMBOL) (CL:VALUES))
(DEFCOMMAND ("REDO" :HISTORY) (&REST EVENT-SPEC) "Re-execute specified event(s)" (EVENTS-INPUT (FIND-HISTORY-EVENTS (OR EVENT-SPEC (QUOTE (-1))) LISPXHISTORY)))
(DEFCOMMAND ("REMEMBER" :EVAL) (&REST EVENT-SPEC) "Tell Manager to remember type-in from specified event(s)" (MARKASCHANGED (GETEXPRESSIONFROMEVENTSPEC EVENT-SPEC) (QUOTE EXPRESSIONS)))
(DEFCOMMAND ("SHH" :QUIET) (&REST LINE) "Execute LINE without history processing" (EVAL-INPUT LINE))
(DEFCOMMAND "UNDO" (&REST EVENT-SPEC) "Undo side effects associated with the specified event (or last undoable one)" (FOR EVENT IN (FIND-HISTORY-EVENTS (OR EVENT-SPEC (QUOTE (-1))) LISPXHISTORY) DO (LET ((INPUT (CAR (EXEC-EVENT-INPUT EVENT))) (RESULT (UNDOLISPX2 EVENT))) (CL:IF (LISTP INPUT) (SETQ INPUT (CAR INPUT))) (COND ((NULL RESULT) (CL:FORMAT T "No undo info saved for ~A.~&" INPUT)) ((EQ RESULT (QUOTE already)) (CL:FORMAT T "~A already undone.~&" INPUT)) (T (CL:FORMAT T "~A undone.~&" INPUT))))) (CL:VALUES))
(DEFCOMMAND ("USE" :HISTORY) (&REST LINE) "USE <new> [FOR <old>] [IN <event-spec>]" (* ;; "this code stolen from LISPXUSE in HIST and edited. The structure is still pretty incomprehensible") (PROG (EVENT-SPECS EXPR ARGS VARS (STATE (QUOTE VARS)) LST TEM USE-ARGS GENLST) LP (COND ((OR (NULL LST) (NULL (CDR LINE)) (NULL (CASE-EQUALP (CAR LINE) (* ; "look for one of the special keywords") (FOR (COND ((EQ STATE (QUOTE VARS)) (SETQ VARS (NCONC1 VARS LST)) (SETQ TEM (APPEND LST TEM)) (SETQ STATE (QUOTE ARGS)) (SETQ LST NIL) T))) (AND (COND ((EQ STATE (QUOTE EXPR)) NIL) (T (COND ((EQ STATE (QUOTE ARGS)) (SETQ ARGS (NCONC1 ARGS LST))) ((EQ STATE (QUOTE VARS)) (* ; "E.g. user types USE A AND B following previous USE command.") (SETQ VARS (NCONC1 VARS LST)))) (SETQ STATE (QUOTE VARS)) (SETQ LST NIL) T))) (IN (COND ((AND (EQ STATE (QUOTE VARS)) (NULL ARGS)) (SETQ VARS (NCONC1 VARS LST)) (SETQ TEM (APPEND LST TEM)) (SETQ STATE (QUOTE EXPR)) (SETQ LST NIL) T) ((EQ STATE (QUOTE ARGS)) (SETQ ARGS (NCONC1 ARGS LST)) (SETQ STATE (QUOTE EXPR)) (SETQ LST NIL) T)))))) (SETQ LST (NCONC1 LST (COND (NIL (MEMBER (CAR LINE) TEM) (* ;; "This enables USE A B FOR B A, USE A FOR B AND B FOR A, or USE A FOR B AND B C FOR A") (LET ((TEMP (CONCAT "temp string"))) (CL:PUSH (CONS (CAR LINE) TEMP) GENLST) TEMP)) (T (CAR LINE))))))) (COND ((SETQ LINE (CDR LINE)) (GO LP))) (CL:ECASE STATE (VARS (SETQ VARS (NCONC1 VARS LST))) (ARGS (SETQ ARGS (NCONC1 ARGS LST))) (EXPR (SETQ EXPR LST))) (CL:WHEN (NULL EXPR) (CL:IF ARGS (SETQ EXPR (LIST (QUOTE F) (CAAR ARGS))) (SETQ EXPR (QUOTE (-1))))) (* ;; "EXPR specifies expressions to be substituted into, e.g. USE FOO FOR FIE IN FUM or USE FOO FOR FIE. In the latter case, searches for FIE. The F is added to avoid confusion with event numbers, etc.") (* ;; "") (SETQ EXPR (MAPCAR (FIND-HISTORY-EVENTS EXPR LISPXHISTORY) (FUNCTION EXEC-EVENT-INPUT))) (* ; "EXPR is now a list of event inputs") (* ;; "at this point, VARS is a list of list of old things, the extra list corresponding to the clauses of an AND, e.g. ") (* ;; "USE A B FOR C AND D E FOR F would have ") (* ;; "((A B) (D E)) for VARS and") (* ;; "((C) (F)) for ARGS.") (IF (NULL ARGS) THEN (SETQ EXPR (FOR X IN EXPR JOIN (FOR VAR IN VARS COLLECT (IF (CL:CONSP (CAR X)) THEN (CONS (CONS (CAR VAR) (CDAR X)) (CDR X)) ELSE (CONS (CAR VAR) (CDR X)))))) ELSE (WHILE ARGS DO (SETQ EXPR (LISPXUSE1 (POP VARS) (POP ARGS) EXPR)) FINALLY (COND (VARS (ERROR (QUOTE "use what??") "" T))) (MAPC GENLST (FUNCTION (LAMBDA (X) (LISPXSUBST (CAR X) (CDR X) EXPR T)))) (* ;; "samples:") (* ;; " USE A B C D FOR X Y means substitute A for X and B for Y and then do it again with C for X and D for Y") (* ;; " Equivalent to USE A C FOR X AND B D FOR Y") (* ;; " USE A B C FOR D AND X Y Z FOR W means 3 operations:") (* ;; " A for D and X for W in the first") (* ;; " B for D and Y for W in the second") (* ;; " C for D and Z for W in the third") (* ;; "USE A B C FOR D AND X FOR Y means 3 operations:") (* ;; " A for D and X for Y in first") (* ;; " B for D and X for Y in second, etc.") (* ;; "USE A B C FOR D AND X Y FOR Z causes error") (* ;; "") (* ;; " USE A B FOR B A will work correctly, but USE A FOR B AND B FOR A will result in all B's being changed to A's.") (* ;; "") (* ;; "The general rule is substitution proceeds from left to right with each %%'AND' handled separately. Whenever the number of variables exceeds the number of expressions available, the expressions multiply."))) (RETURN (COND ((CDR EXPR) (CONS (QUOTE DO-EVENTS) (for X in EXPR collect (COND ((CDR X) (CONS (QUOTE EVENT) X)) (T (CAR X)))))) (T (CAR EXPR))))))
(DEFCOMMAND "PP" (&OPTIONAL (NAME LASTWORD) &REST TYPES) "Show TYPES (or any) definition for NAME" (CL:BLOCK NIL (* ;; "returned from if no definitions found") (for TYPE in (OR TYPES (TYPESOF NAME NIL NIL (QUOTE ?) (FUNCTION (LAMBDA (TYPE) (NEQ (GET TYPE (QUOTE EDITDEF)) (QUOTE NILL))))) (TYPESOF (SETQ NAME (OR (FIXSPELL NAME NIL USERWORDS NIL NIL (FUNCTION (LAMBDA (WORD) (TYPESOF WORD NIL (QUOTE (FIELDS FILES)) (QUOTE CURRENT)))) NIL NIL NIL (QUOTE MUSTAPPROVE)) (PROGN (CL:FORMAT *TERMINAL-IO* "No definitions found for ~S." NAME) (RETURN NIL)))) NIL NIL (QUOTE ?) (FUNCTION (LAMBDA (TYPE) (NEQ (GET TYPE (QUOTE EDITDEF)) (QUOTE NILL)))))) do (CL:FORMAT *TERMINAL-IO* "~A definition for ~S:~%%" TYPE NAME) (SHOWDEF NAME TYPE))) (CL:VALUES))
(* ;; "Arrange to use the correct compiler")
(PUTPROPS CMLEXEC FILETYPE CL:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA DIR)
(ADDTOVAR NLAML)
(ADDTOVAR LAMA)
)
(PRETTYCOMPRINT CMLEXECCOMS)
(RPAQQ CMLEXECCOMS ((FILES CMLUNDO PROFILE) (XCL:PROFILES "EXEC") (STRUCTURES COMMAND-ENTRY EXEC-EVENT-ID EXEC-EVENT HISTORY) (* ; "These are public except for command-entry.") (FUNCTIONS XCL::EXEC-CLOSEFN XCL::EXEC-SHRINKFN XCL::SETUP-EXEC-WINDOW XCL::EXEC-TITLE-FUNCTION FIX-FORM XCL::GET-PROCESS-PROFILE XCL::SAVE-CURRENT-EXEC-PROFILE XCL::SETF-GET-PROCESS-PROFILE XCL:SET-EXEC-TYPE XCL:SET-DEFAULT-EXEC-TYPE XCL::ENTER-EXEC-FUNCTION) (SETFS XCL::GET-PROCESS-PROFILE) (FUNCTIONS DO-EVENT EXEC EXEC-EVAL PRINT-ALL-DOCUMENTATION PRINT-DOCUMENTATION VALUE-OF ADD-EXEC EXEC-READ-LINE EXEC-EVENT-ID-PROMPT FIND-EXEC-COMMAND) (FUNCTIONS CIRCLAR-COPYER) (FNS COPY-CIRCLE) (* ; "CIRCLAR-COPYER and COPY-CIRCLE are the solution for AR#11172") (FNS EXEC-READ DIR) (VARIABLES *PER-EXEC-VARIABLES* CL:* CL:** CL:*** + CL:++ CL:+++ - / CL:// CL:/// *CURRENT-EVENT* *EXEC-ID* XCL:*EXEC-PROMPT* XCL:*EVAL-FUNCTION* *NOT-YET-EVALUATED* *THIS-EXEC-COMMANDS* *EXEC-COMMAND-TABLE* *DEBUGGER-COMMAND-TABLE* *CURRENT-EXEC-TYPE* *EXEC-MAKE-UNDOABLE-P*) (VARIABLES *EDIT-INPUT-WITH-TTYIN*) (FNS DO-APPLY-EVENT DO-HISTORY-SEARCH EVAL-INPUT EVENTS-INPUT EXEC-PRIN1 EXEC-VALUE-OF GET-NEXT-HISTORY-EVENT HISTORY-ADD-TO-SPELLING-LISTS HISTORY-NTH PRINT-HISTORY FIND-HISTORY-EVENTS PRINT-EVENT PRINT-EVENT-PROMPT PROCESS-EXEC-ID SEARCH-FOR-EVENT-NUMBER \PICK.EVALQT LISPXREPRINT) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (MOVD? (QUOTE READ) (QUOTE TTYINREAD)) (MOVD (QUOTE \PICK.EVALQT) (QUOTE \PROC.REPEATEDLYEVALQT)) (SETQ BackgroundMenu))) (FUNCTIONS CASE-EQUALP EXEC-EVENT-PROPS EXEC-PRINT EXEC-FORMAT) (ALISTS (BackgroundMenuCommands EXEC)) (ALISTS (SYSTEMINITVARS LISPXHISTORY GREETHIST)) (* ;; "Exec Commands") (DEFINE-TYPES COMMANDS) (FUNCTIONS DEFCOMMAND) (COMMANDS "?" "??" "CONN" "DA" "DIR" "DO-EVENTS" "FIX" "FORGET" "NAME" "NDIR" "PL" "REDO" "REMEMBER" "SHH" "UNDO" "USE" "PP") (* ;; "Arrange to use the correct compiler") (PROP FILETYPE CMLEXEC) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA PROCESS-EXEC-ID PRINT-EVENT PRINT-HISTORY EXEC-PRIN1 EVENTS-INPUT EVAL-INPUT EXEC-READ)))))
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA)
(ADDTOVAR NLAML)
(ADDTOVAR LAMA PROCESS-EXEC-ID PRINT-EVENT PRINT-HISTORY EXEC-PRIN1 EVENTS-INPUT EVAL-INPUT EXEC-READ)
)
(PUTPROPS CMLEXEC COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1988 1990 1991 1992))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (20107 21061 (COPY-CIRCLE 20117 . 21059)) (21139 24444 (EXEC-READ 21149 . 24310) (DIR
24312 . 24442)) (26450 53584 (DO-APPLY-EVENT 26460 . 27022) (DO-HISTORY-SEARCH 27024 . 28481) (
EVAL-INPUT 28483 . 33912) (EVENTS-INPUT 33914 . 35292) (EXEC-PRIN1 35294 . 35470) (EXEC-VALUE-OF 35472
. 35811) (GET-NEXT-HISTORY-EVENT 35813 . 37308) (HISTORY-ADD-TO-SPELLING-LISTS 37310 . 38298) (
HISTORY-NTH 38300 . 39050) (PRINT-HISTORY 39052 . 39673) (FIND-HISTORY-EVENTS 39675 . 44736) (
PRINT-EVENT 44738 . 48959) (PRINT-EVENT-PROMPT 48961 . 50165) (PROCESS-EXEC-ID 50167 . 51112) (
SEARCH-FOR-EVENT-NUMBER 51114 . 51742) (\PICK.EVALQT 51744 . 52255) (LISPXREPRINT 52257 . 53582)))))
STOP

BIN
CLTL2/CMLEXEC.LCOM Normal file

Binary file not shown.

156
CLTL2/CMLFILESYS Normal file
View File

@@ -0,0 +1,156 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10)
(FILECREATED "18-Oct-93 11:06:53" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLFILESYS.;2" 8169
|previous| |date:| " 3-Aug-91 11:23:10" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLFILESYS.;1"
)
; Copyright (c) 1986, 1987, 1988, 1990, 1991, 1993 by Venue & Xerox Corporation. All rights reserved.
(PRETTYCOMPRINT CMLFILESYSCOMS)
(RPAQQ CMLFILESYSCOMS ((FUNCTIONS LISP:DIRECTORY LISP:FILE-AUTHOR LISP:FILE-LENGTH
LISP:FILE-POSITION LISP:USER-HOMEDIR-PATHNAME LISP:FILE-WRITE-DATE)
(FUNCTIONS LISP:PROBE-FILE LISP:RENAME-FILE LISP:DELETE-FILE)
(PROP FILETYPE CMLFILESYS)))
(LISP:DEFUN LISP:DIRECTORY (PATHNAME)
(LISP:WHEN (LISP::LOGICAL-PATHNAME-P PATHNAME)
(LISP:SETQ PATHNAME (LISP:TRANSLATE-LOGICAL-PATHNAME PATHNAME)))
(LET (GENERATOR FILE)
(DECLARE (LISP:SPECIAL GENERATOR))
(RESETLST
(|if| (EQL \\MACHINETYPE \\MAIKO)
|then| (RESETSAVE NIL '(AND RESETSTATE (\\UFS.ABORT.CL-DIRECTORY))))
(LISP:SETQ GENERATOR (\\GENERATEFILES (DIRECTORY.FILL.PATTERN (LISP:NAMESTRING PATHNAME))
NIL
'(SORT RESETLST)))
(|while| (SETQ FILE (\\GENERATENEXTFILE GENERATOR)) |collect| (PATHNAME FILE)))))
(LISP:DEFUN LISP:FILE-AUTHOR (LISP::FILE)
(* |;;;| "Returns author of file as string, or NIL if it cannot be determined. FILE is a filename or stream.")
(LET ((LISP::AUTHOR (GETFILEINFO LISP::FILE 'AUTHOR)))
(LISP:IF LISP::AUTHOR
(COERCE LISP::AUTHOR 'LISP:SIMPLE-STRING)
NIL)))
(LISP:DEFUN LISP:FILE-LENGTH (FILE-STREAM)
(|if| (AND (STREAMP FILE-STREAM)
(OPENP FILE-STREAM))
|then| (GETEOFPTR FILE-STREAM)))
(LISP:DEFUN LISP:FILE-POSITION (LISP::FILE-STREAM &OPTIONAL (LISP:POSITION NIL LISP::POSITIONP)
)
(LISP:UNLESS (STREAMP LISP::FILE-STREAM)
(\\ILLEGAL.ARG LISP::FILE-STREAM))
(LISP:IF LISP::POSITIONP
(LISP:IF (RANDACCESSP LISP::FILE-STREAM)
(PROGN (SETFILEPTR LISP::FILE-STREAM (CASE LISP:POSITION
(:START 0)
(:END (GETEOFPTR LISP::FILE-STREAM))
(T LISP:POSITION)))
T)
NIL)
(GETFILEPTR LISP::FILE-STREAM)))
(LISP:DEFUN LISP:USER-HOMEDIR-PATHNAME (&OPTIONAL HOST)
(DECLARE (GLOBALVARS LOGINHOST/DIR *DEFAULT-PATHNAME-DEFAULTS*))
(LISP:IF (MACHINETYPE 'MAIKO)
(LISP:IF (AND HOST (LISP:STRING-NOT-EQUAL (STRING HOST)
(UNIX-GETPARM "HOSTNAME")))
NIL
(LISP:MAKE-PATHNAME :HOST :DSK :DIRECTORY (UNPACKFILENAME.STRING (UNIX-GETENV "HOME")
'DIRECTORY
'RETURN)))
(PATHNAME (OR LOGINHOST/DIR *DEFAULT-PATHNAME-DEFAULTS*))))
(LISP:DEFUN LISP:FILE-WRITE-DATE (FILE)
(* |;;| "Return file's creation date, or NIL if it doesn't exist.")
(* |;;| "N.B. date is returned in Common Lisp Universal Time, not Interlisp-D internal time")
(LET ((TN (LISP:PROBE-FILE FILE)))
(LISP:WHEN TN
(%CONVERT-INTERNAL-TIME-TO-CLUT (GETFILEINFO TN 'ICREATIONDATE)))))
(LISP:DEFUN LISP:PROBE-FILE (FILE)
(* |;;;| "Return a pathname which is the truename of the file if it exists, NIL otherwise. Returns NIL for non-file args.")
(LISP:TYPECASE FILE
(STREAM (IF (OPENP FILE)
THEN (PATHNAME (FETCH (STREAM FULLNAME) OF FILE))
ELSE (LET ((NAMESTRING-IF-EXISTS (INFILEP (FETCH (STREAM FULLNAME)
OF FILE))))
(AND NAMESTRING-IF-EXISTS (PATHNAME NAMESTRING-IF-EXISTS)))))
(LISP:LOGICAL-PATHNAME (LISP:PROBE-FILE (LISP:TRANSLATE-LOGICAL-PATHNAME FILE)))
(T (LET ((INFILEP (\\GETFILENAME FILE 'OLD)))
(IF INFILEP
THEN (PATHNAME INFILEP)
ELSE NIL)))))
(LISP:DEFUN LISP:RENAME-FILE (LISP::FILE LISP::NEW-NAME)
(* |;;;| "Give FILE the new name NEW-NAME. If FILE is an open stream, error. Otherwise, do the rename. If successful, return three values: the new name, truename of original file, truename of new file.")
(* |;;;| "NEW MESSINESS resulting from acceptance of logical-pathnames: the CLtL2 spec for the first argument, (MERGE-PATHNAMES NEW-NAME FILE), makes no sense if either of FILE or NEW-NAME is a logical-pathname, since the logical-to-normal translation process can do arbitrary weird stuff. Therefore, if either argument is a logical-pathname, we punt and return the new truename as the first argument.")
(LET* ((LISP::LOGICAL-USED? NIL)
(LISP::OLD-PATHNAME (LISP:IF (LISP::LOGICAL-PATHNAME-P LISP::FILE)
(PROGN (LISP:SETQ LISP::LOGICAL-USED? T)
(LISP:TRANSLATE-LOGICAL-PATHNAME LISP::FILE))
(PATHNAME LISP::FILE)))
(LISP::NEW-FULLNAME))
(LISP:WHEN (LISP::LOGICAL-PATHNAME-P LISP::NEW-NAME)
(LISP:SETQ LISP::LOGICAL-USED? T LISP::NEW-NAME (LISP:TRANSLATE-LOGICAL-PATHNAME
LISP::NEW-NAME)))
(IF (STREAMP LISP::FILE)
THEN (IF (OPENP LISP::FILE)
THEN (LISP:ERROR "Renaming open streams is not supported: ~S"
LISP::FILE)
ELSE (LISP:SETQ LISP::NEW-FULLNAME (RENAMEFILE (LISP:SETQ
LISP::FILE
(FETCH (STREAM
FULLNAME
)
OF LISP::FILE))
LISP::NEW-NAME)))
ELSE
(* |;;| "IL:RENAMEFILE will accept logical-pathnames")
(LISP:SETQ LISP::NEW-FULLNAME (RENAMEFILE (LISP:IF LISP::LOGICAL-USED?
LISP::OLD-PATHNAME
LISP::FILE)
LISP::NEW-NAME)))
(IF LISP::NEW-FULLNAME
THEN (LISP:VALUES (LISP:IF LISP::LOGICAL-USED?
(PATHNAME LISP::NEW-FULLNAME)
(LISP:MERGE-PATHNAMES LISP::NEW-NAME LISP::FILE))
LISP::OLD-PATHNAME
(PATHNAME LISP::NEW-FULLNAME))
ELSE (LISP:ERROR "Rename failed"))))
(LISP:DEFUN LISP:DELETE-FILE (FILE)
(* * "Delete the specified file.")
(LET ((TN (LISP:PROBE-FILE FILE)))
(LISP:WHEN (STREAMP FILE)
(LISP:CLOSE FILE :ABORT T))
(LISP:IF TN
(LET ((NS (INTERLISP-NAMESTRING TN)))
(LISP:UNLESS (DELFILE NS)
(LISP:ERROR "Could not delete the file ~S" FILE)))
(LISP:UNLESS (STREAMP FILE)
(LISP:ERROR "File to be deleted does not exist: ~S" FILE))))
T)
(PUTPROPS CMLFILESYS FILETYPE LISP:COMPILE-FILE)
(PUTPROPS CMLFILESYS COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1990 1991 1993))
(DECLARE\: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLFILESYS.LCOM Normal file

Binary file not shown.

385
CLTL2/CMLFLOAT Normal file
View File

@@ -0,0 +1,385 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "LISP")
(IL:FILECREATED "24-Mar-92 13:57:12" IL:|{DSK}<usr>local>lde>lispcore>sources>CMLFLOAT.;2| 42560
IL:|changes| IL:|to:| (IL:VARS IL:CMLFLOATCOMS) (IL:VARIABLES CL:LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT CL:LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT CL:LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT CL:LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT CL:LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT CL:LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT CL:LEAST-POSITIVE-NORMALIZED-LONG-FLOAT CL:LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT)
IL:|previous| IL:|date:| "16-May-90 13:16:23"
IL:|{DSK}<usr>local>lde>lispcore>sources>CMLFLOAT.;1|)
; Copyright (c) 1986, 1987, 1988, 1990, 1992 by Venue & Xerox Corporation. All rights reserved.
(IL:PRETTYCOMPRINT IL:CMLFLOATCOMS)
(IL:RPAQQ IL:CMLFLOATCOMS ((IL:* IL:|;;;| "CMLFLOAT -- Covering sections 12.5-12.5.3 irrational, transcendental, exponential, logarithmic, trigonometric, and hyperbolic functions. Section 12.10, implementation parameters. ") (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:* IL:\; "To generate unboxed opcodes") (IL:FILES IL:UNBOXEDOPS) (IL:* IL:\; "To get constants from llfloat ") (IL:FILES (IL:LOADCOMP) IL:LLFLOAT)) (IL:COMS (IL:* IL:|;;| "Section 12.10, implementation parameters. ") (IL:* IL:|;;| "%FLOAT allows us to recreate FLOATPs in a way that is independent of the ordinairy reading and printing FLOATPs to files which involves loss of the last couple bits of accuracy due to rounding effects.") (IL:* IL:|;;| "Reading and printing of floats has since been fixed, so LISP::%FLOAT is not technically necessary anymore - JRB") (IL:FUNCTIONS %FLOAT) (IL:VARIABLES MOST-POSITIVE-FIXNUM MOST-NEGATIVE-FIXNUM) (IL:VARIABLES MOST-POSITIVE-SINGLE-FLOAT LEAST-POSITIVE-SINGLE-FLOAT LEAST-NEGATIVE-SINGLE-FLOAT MOST-NEGATIVE-SINGLE-FLOAT) (IL:VARIABLES MOST-POSITIVE-SHORT-FLOAT LEAST-POSITIVE-SHORT-FLOAT LEAST-NEGATIVE-SHORT-FLOAT MOST-NEGATIVE-SHORT-FLOAT MOST-POSITIVE-DOUBLE-FLOAT LEAST-POSITIVE-DOUBLE-FLOAT LEAST-NEGATIVE-DOUBLE-FLOAT MOST-NEGATIVE-DOUBLE-FLOAT MOST-POSITIVE-LONG-FLOAT LEAST-POSITIVE-LONG-FLOAT LEAST-NEGATIVE-LONG-FLOAT MOST-NEGATIVE-LONG-FLOAT) (IL:* IL:|;;| "CLtL2 implementation parameters ") (IL:VARIABLES CL:LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT CL:LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT CL:LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT CL:LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT CL:LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT CL:LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT CL:LEAST-POSITIVE-NORMALIZED-LONG-FLOAT CL:LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT) (IL:* IL:|;;| "EPSILON is the smallest positive floating point number such that (NOT (= (FLOAT 1 EPSILON) (+ (FLOAT 1 EPSILON) EPSILON))) ") (IL:VARIABLES SINGLE-FLOAT-EPSILON) (IL:VARIABLES SHORT-FLOAT-EPSILON DOUBLE-FLOAT-EPSILON LONG-FLOAT-EPSILON) (IL:* IL:|;;| "NEGATIVE-EPSILON is the smallest negative floating point number such that (NOT (= (FLOAT 1 NEGATIVE-EPSILON) (- (FLOAT 1 NEGATIVE-EPSILON) NEGATIVE-EPSILON))) ") (IL:VARIABLES SINGLE-FLOAT-NEGATIVE-EPSILON) (IL:VARIABLES SHORT-FLOAT-NEGATIVE-EPSILON DOUBLE-FLOAT-NEGATIVE-EPSILON LONG-FLOAT-NEGATIVE-EPSILON) (IL:VARIABLES PI)) (IL:COMS (IL:* IL:|;;| "Internal constants") (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES %E %2PI %PI %2PI/3 %PI/2 %-PI/2 %PI/3 %PI/4 %-PI/4 %PI/6 %2/PI))) (IL:COMS (IL:* IL:|;;| "Utility macros") (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:FUNCTIONS %FLOAT-UNBOX %GET-TABLE-ENTRY %POLYEVAL %UFTRUNCATE %UMAKE-FLOAT))) (IL:* IL:|;;| " Unpack floating point functions") (IL:COMS (IL:FUNCTIONS DECODE-FLOAT SCALE-FLOAT FLOAT-RADIX FLOAT-SIGN FLOAT-DIGITS FLOAT-PRECISION INTEGER-DECODE-FLOAT)) (IL:COMS (IL:* IL:|;;| "Exp (e to the power x)") (IL:COMS (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES %LOG-BASE2-E)) (IL:VARIABLES %EXP-POLY %EXP-TABLE)) (IL:FUNCTIONS %EXP-FLOAT) (IL:FUNCTIONS EXP)) (IL:COMS (IL:* IL:|;;| "Expt (x to the power y)") (IL:FUNCTIONS %EXPT-INTEGER %EXPT-FLOAT-INTEGER) (IL:FUNCTIONS EXPT)) (IL:COMS (IL:* IL:|;;| "Log (log base e)") (IL:COMS (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES %LOG2 %SQRT2)) (IL:VARIABLES %LOG-PPOLY %LOG-QPOLY)) (IL:FUNCTIONS %LOG-FLOAT) (IL:FUNCTIONS LOG)) (IL:COMS (IL:* IL:|;;| "Sqrt") (IL:FUNCTIONS %SQRT-FLOAT %SQRT-COMPLEX) (IL:FUNCTIONS SQRT)) (IL:COMS (IL:* IL:|;;| "Sin and Cos") (IL:COMS (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES %SIN-EPSILON)) (IL:VARIABLES %SIN-PPOLY %SIN-QPOLY)) (IL:FUNCTIONS %SIN-FLOAT) (IL:FUNCTIONS SIN COS)) (IL:COMS (IL:* IL:|;;| "Tan") (IL:COMS (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES %TAN-EPSILON)) (IL:VARIABLES %TAN-PPOLY %TAN-QPOLY)) (IL:FUNCTIONS %TAN-FLOAT) (IL:FUNCTIONS TAN)) (IL:COMS (IL:* IL:|;;| "Asin and Acos") (IL:COMS (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES %ASIN-EPSILON)) (IL:VARIABLES %ASIN-PPOLY %ASIN-QPOLY)) (IL:FUNCTIONS %ASIN-FLOAT) (IL:FUNCTIONS ASIN ACOS)) (IL:COMS (IL:* IL:|;;| "Atan ") (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES %SQRT3 %2-SQRT3 %INV-2-SQRT3)) (IL:FUNCTIONS %ATAN-FLOAT) (IL:FUNCTIONS ATAN)) (IL:COMS (IL:* IL:|;;| "Cis (exp (i x))") (IL:FUNCTIONS CIS)) (IL:COMS (IL:* IL:|;;| "Sinh, Cosh Tanh") (IL:FUNCTIONS SINH COSH TANH)) (IL:COMS (IL:* IL:|;;| "Asinh Acosh Atanh") (IL:FUNCTIONS ASINH ACOSH ATANH)) (IL:COMS (IL:* IL:|;;| "rational and rationalize ") (IL:FUNCTIONS %RATIONAL-FLOAT %RATIONALIZE-FLOAT)) (IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:LOCALVARS . T)) (IL:PROP (IL:MAKEFILE-ENVIRONMENT IL:FILETYPE) IL:CMLFLOAT)))
(IL:* IL:|;;;|
"CMLFLOAT -- Covering sections 12.5-12.5.3 irrational, transcendental, exponential, logarithmic, trigonometric, and hyperbolic functions. Section 12.10, implementation parameters. "
)
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(IL:FILESLOAD IL:UNBOXEDOPS)
(IL:FILESLOAD (IL:LOADCOMP) IL:LLFLOAT)
)
(IL:* IL:|;;| "Section 12.10, implementation parameters. ")
(IL:* IL:|;;|
"%FLOAT allows us to recreate FLOATPs in a way that is independent of the ordinairy reading and printing FLOATPs to files which involves loss of the last couple bits of accuracy due to rounding effects."
)
(IL:* IL:|;;|
"Reading and printing of floats has since been fixed, so LISP::%FLOAT is not technically necessary anymore - JRB"
)
(DEFUN %FLOAT (HIWORD LOWORD) (IL:\\FLOATBOX (IL:\\VAG2 HIWORD LOWORD)))
(DEFCONSTANT MOST-POSITIVE-FIXNUM 65535)
(DEFCONSTANT MOST-NEGATIVE-FIXNUM -65536)
(DEFCONSTANT MOST-POSITIVE-SINGLE-FLOAT (%FLOAT 32639 65535))
(DEFCONSTANT LEAST-POSITIVE-SINGLE-FLOAT (%FLOAT 0 1))
(DEFCONSTANT LEAST-NEGATIVE-SINGLE-FLOAT (%FLOAT 32768 1))
(DEFCONSTANT MOST-NEGATIVE-SINGLE-FLOAT (%FLOAT 65407 65535))
(DEFCONSTANT MOST-POSITIVE-SHORT-FLOAT MOST-POSITIVE-SINGLE-FLOAT)
(DEFCONSTANT LEAST-POSITIVE-SHORT-FLOAT LEAST-POSITIVE-SINGLE-FLOAT)
(DEFCONSTANT LEAST-NEGATIVE-SHORT-FLOAT LEAST-NEGATIVE-SINGLE-FLOAT)
(DEFCONSTANT MOST-NEGATIVE-SHORT-FLOAT MOST-NEGATIVE-SINGLE-FLOAT)
(DEFCONSTANT MOST-POSITIVE-DOUBLE-FLOAT MOST-POSITIVE-SINGLE-FLOAT)
(DEFCONSTANT LEAST-POSITIVE-DOUBLE-FLOAT LEAST-POSITIVE-SINGLE-FLOAT)
(DEFCONSTANT LEAST-NEGATIVE-DOUBLE-FLOAT LEAST-NEGATIVE-SINGLE-FLOAT)
(DEFCONSTANT MOST-NEGATIVE-DOUBLE-FLOAT MOST-NEGATIVE-SINGLE-FLOAT)
(DEFCONSTANT MOST-POSITIVE-LONG-FLOAT MOST-POSITIVE-SINGLE-FLOAT)
(DEFCONSTANT LEAST-POSITIVE-LONG-FLOAT LEAST-POSITIVE-SINGLE-FLOAT)
(DEFCONSTANT LEAST-NEGATIVE-LONG-FLOAT LEAST-NEGATIVE-SINGLE-FLOAT)
(DEFCONSTANT MOST-NEGATIVE-LONG-FLOAT MOST-NEGATIVE-SINGLE-FLOAT)
(IL:* IL:|;;| "CLtL2 implementation parameters ")
(DEFCONSTANT CL:LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT (%FLOAT 128 0) "Documentation string")
(DEFCONSTANT CL:LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT (%FLOAT 32896 0))
(DEFCONSTANT CL:LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT (%FLOAT 128 0))
(DEFCONSTANT CL:LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT (%FLOAT 32896 0))
(DEFCONSTANT CL:LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT (%FLOAT 128 0))
(DEFCONSTANT CL:LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT (%FLOAT 32896 0))
(DEFCONSTANT CL:LEAST-POSITIVE-NORMALIZED-LONG-FLOAT (%FLOAT 128 0))
(DEFCONSTANT CL:LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT (%FLOAT 32896 0))
(IL:* IL:|;;|
"EPSILON is the smallest positive floating point number such that (NOT (= (FLOAT 1 EPSILON) (+ (FLOAT 1 EPSILON) EPSILON))) "
)
(DEFCONSTANT SINGLE-FLOAT-EPSILON (%FLOAT (ASH 103 7) 1))
(DEFCONSTANT SHORT-FLOAT-EPSILON SINGLE-FLOAT-EPSILON)
(DEFCONSTANT DOUBLE-FLOAT-EPSILON SINGLE-FLOAT-EPSILON)
(DEFCONSTANT LONG-FLOAT-EPSILON SINGLE-FLOAT-EPSILON)
(IL:* IL:|;;|
"NEGATIVE-EPSILON is the smallest negative floating point number such that (NOT (= (FLOAT 1 NEGATIVE-EPSILON) (- (FLOAT 1 NEGATIVE-EPSILON) NEGATIVE-EPSILON))) "
)
(DEFCONSTANT SINGLE-FLOAT-NEGATIVE-EPSILON (%FLOAT 13184 0))
(DEFCONSTANT SHORT-FLOAT-NEGATIVE-EPSILON SINGLE-FLOAT-NEGATIVE-EPSILON)
(DEFCONSTANT DOUBLE-FLOAT-NEGATIVE-EPSILON SINGLE-FLOAT-NEGATIVE-EPSILON)
(DEFCONSTANT LONG-FLOAT-NEGATIVE-EPSILON SINGLE-FLOAT-NEGATIVE-EPSILON)
(DEFCONSTANT PI (%FLOAT 16457 4059))
(IL:* IL:|;;| "Internal constants")
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT %E (%FLOAT 16429 63572))
(DEFCONSTANT %2PI (%FLOAT 16585 4059))
(DEFCONSTANT %PI (%FLOAT 16457 4059))
(DEFCONSTANT %2PI/3 (%FLOAT 16390 2706))
(DEFCONSTANT %PI/2 (%FLOAT 16329 4059))
(DEFCONSTANT %-PI/2 (%FLOAT 49097 4059))
(DEFCONSTANT %PI/3 (%FLOAT 16262 2706))
(DEFCONSTANT %PI/4 (%FLOAT 16201 4059))
(DEFCONSTANT %-PI/4 (%FLOAT 48969 4059))
(DEFCONSTANT %PI/6 (%FLOAT 16134 2706))
(DEFCONSTANT %2/PI (%FLOAT 16162 63875))
)
(IL:* IL:|;;| "Utility macros")
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFMACRO %FLOAT-UNBOX (FLOAT SIGN EXP HI LO &OPTIONAL DONTSHIFT) (IL:* IL:|;;| "If dontshift is T -- the floatp fields are simply unpacked (with the hiddenbit restored -- and exp set to 1 for denormalized numbers). If dontshift is NIL -- exp, hi and lo are fiddled so the high bit of hi is on.") (IL:BQUOTE (LET ((FLONUM (FLOAT (IL:\\\, FLOAT)))) (SETQ (IL:\\\, SIGN) (IL:|fetch| (IL:FLOATP IL:SIGNBIT) IL:|of| FLONUM)) (SETQ (IL:\\\, EXP) (IL:|fetch| (IL:FLOATP IL:EXPONENT) IL:|of| FLONUM)) (SETQ (IL:\\\, HI) (IL:|fetch| (IL:FLOATP IL:HIFRACTION) IL:|of| FLONUM)) (SETQ (IL:\\\, LO) (IL:|fetch| (IL:FLOATP IL:LOFRACTION) IL:|of| FLONUM)) (IF (EQ (IL:\\\, EXP) IL:\\MAX.EXPONENT) (IL:* IL:\; "might want to check for NaN's here if EXP = \\MAX.EXPONENT") (ERROR "Not a number: ~s" FLONUM)) (IF (EQ 0 (IL:\\\, EXP)) (WHEN (NOT (AND (EQ 0 (IL:\\\, HI)) (EQ 0 (IL:\\\, LO)))) (IL:* IL:\; "Denormalized number") (SETQ (IL:\\\, EXP) 1) (IL:\\\,@ (IF (NULL DONTSHIFT) (IL:BQUOTE ((LOOP (IF (NOT (EQ 0 (LOGAND (IL:\\\, HI) IL:\\HIDDENBIT))) (RETURN NIL)) (IL:.LLSH1. (IL:\\\, HI) (IL:\\\, LO)) (SETQ (IL:\\\, EXP) (1- (IL:\\\, EXP))))))))) (IL:* IL:\; " Restore the hidden bit") (SETQ (IL:\\\, HI) (+ (IL:\\\, HI) IL:\\HIDDENBIT))) (IL:\\\,@ (IF (NULL DONTSHIFT) (IL:BQUOTE ((IL:.LLSH8. (IL:\\\, HI) (IL:\\\, LO)))))) NIL)))
(DEFMACRO %GET-TABLE-ENTRY (ARRAY INDEX) (IL:BQUOTE (IL:\\GETBASEFLOATP (IL:|fetch| (IL:ONED-ARRAY IL:BASE) IL:|of| (IL:\\\, ARRAY)) (IL:LLSH (IL:\\\, INDEX) 1))))
(DEFMACRO %POLYEVAL (X COEFFS DEGREE) (IL:BQUOTE (IL:\\FLOATBOX ((IL:OPCODES IL:UBFLOAT3 0) (IL:\\FLOATUNBOX (IL:\\\, X)) (IL:|fetch| (IL:ONED-ARRAY IL:BASE) IL:|of| (IL:\\\, COEFFS)) (IL:\\\, DEGREE)))))
(DEFMACRO %UFTRUNCATE (INT REM FLOAT &OPTIONAL DIVISOR) (IL:* IL:|;;| "As in truncate. Assumes FLOAT and DIVISOR are unboxed floatp's. ") (IF DIVISOR (IL:BQUOTE (LET ((FFLOAT (IL:\\\, FLOAT)) (FDIVISOR (IL:\\\, DIVISOR))) (DECLARE (TYPE FLOAT FFLOAT FDIVISOR)) (SETQ (IL:\\\, INT) (IL:UFIX (IL:FQUOTIENT FFLOAT FDIVISOR))) (SETQ (IL:\\\, REM) (- FFLOAT (* FDIVISOR (FLOAT (IL:\\\, INT))))) NIL)) (IL:BQUOTE (LET ((FFLOAT (IL:\\\, FLOAT))) (DECLARE (TYPE FLOAT FFLOAT)) (SETQ (IL:\\\, INT) (IL:UFIX FFLOAT)) (SETQ (IL:\\\, REM) (- FFLOAT (FLOAT (IL:\\\, INT)))) NIL))))
(DEFMACRO %UMAKE-FLOAT (SIGN EXP HI LOW) (IL:* IL:|;;| "as in \\makefloat -- but produces an unboxed number") (IL:BQUOTE (IL:\\FLOATBOX ((IL:OPENLAMBDA (SIGN EXP HI LO) (IL:.LRSH8. HI LO) (SETQ HI (+ (ASH EXP 7) (LOGAND 127 HI))) (IF (EQ SIGN 1) (SETQ HI (LOGIOR IL:\\SIGNBIT HI))) (IL:\\VAG2 HI LO)) (IL:\\\, SIGN) (IL:\\\, EXP) (IL:\\\, HI) (IL:\\\, LOW)))))
)
(IL:* IL:|;;| " Unpack floating point functions")
(DEFUN DECODE-FLOAT (FLOAT) (SETQ FLOAT (FLOAT FLOAT)) (IF (= FLOAT 0.0) (VALUES 0.0 0 1.0) (LET (SIGN EXP HI LO) (%FLOAT-UNBOX FLOAT SIGN EXP HI LO) (VALUES (IL:\\MAKEFLOAT 0 (1- IL:\\EXPONENT.BIAS) HI LO) (- EXP (1- IL:\\EXPONENT.BIAS)) (IF (EQ SIGN 0) 1.0 -1.0)))))
(DEFUN SCALE-FLOAT (FLOAT INTEGER &OPTIONAL OLD-BOX) (SETQ FLOAT (FLOAT FLOAT)) (IF (= FLOAT 0.0) 0.0 (LET (SIGN EXP HI LO) (%FLOAT-UNBOX FLOAT SIGN EXP HI LO) (IL:\\MAKEFLOAT SIGN (+ EXP INTEGER) HI LO NIL OLD-BOX))))
(DEFUN FLOAT-RADIX (FLOAT) 2)
(DEFUN FLOAT-SIGN (FLOAT1 &OPTIONAL FLOAT2 OLD-BOX) (IL:* IL:|;;| "Old-box is a floatp box to reuse (may be eq to float2)") (IF (FLOATP FLOAT1) (IF (NULL FLOAT2) (IF (MINUSP FLOAT1) -1.0 1.0) (IF (FLOATP FLOAT2) (IF (EQ (MINUSP FLOAT1) (MINUSP FLOAT2)) FLOAT2 (IF (FLOATP OLD-BOX) (LET ((NEW-SIGN-BIT (IF (EQ 0 (IL:FETCH (IL:FLOATP IL:SIGNBIT) IL:OF FLOAT2)) 1 0))) (IL:* IL:|;;| "Now smash the old-box") (IL:\\PUTBASEFLOATP OLD-BOX 0 FLOAT2) (IL:|replace| (IL:FLOATP IL:SIGNBIT) IL:|of| OLD-BOX IL:|with| NEW-SIGN-BIT) OLD-BOX) (- FLOAT2))) (%NOT-FLOAT-ERROR FLOAT2))) (%NOT-FLOAT-ERROR FLOAT1)))
(DEFUN FLOAT-DIGITS (FLOAT) (IF (FLOATP FLOAT) 24 (%NOT-FLOAT-ERROR FLOAT)))
(DEFUN FLOAT-PRECISION (FLOAT) (IF (FLOATP FLOAT) (IF (= FLOAT 0.0) 0 (LET (SIGN EXP HI LO) (%FLOAT-UNBOX FLOAT SIGN EXP HI LO T) (IF (< HI IL:\\HIDDENBIT) (IL:* IL:\; "Denormalized number") (IF (EQ HI 0) (INTEGER-LENGTH LO) (+ 16 (INTEGER-LENGTH HI))) (IL:* IL:\; "Normalized number") 24))) (%NOT-FLOAT-ERROR FLOAT)))
(DEFUN INTEGER-DECODE-FLOAT (FLOAT) (IL:* IL:|;;| "As in decode-float -- but returns integers") (SETQ FLOAT (FLOAT FLOAT)) (IF (= FLOAT 0.0) (VALUES 0 0 1) (LET (SIGN EXP HI LO) (%FLOAT-UNBOX FLOAT SIGN EXP HI LO T) (VALUES (+ (ASH HI 16) LO) (- EXP (+ IL:\\EXPONENT.BIAS 23)) (IF (EQ SIGN 0) 1 -1)))))
(IL:* IL:|;;| "Exp (e to the power x)")
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT %LOG-BASE2-E (%FLOAT 16312 43579))
)
(XCL:DEFGLOBALVAR %EXP-POLY (IL:* IL:|;;| "%EXP-POLY contains P and Q coefficients of Hart et al EXPB 1103 rational approximation to (EXPT 2 X) in interval (0 .125). ") (MAKE-ARRAY 6 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 15549 17659) (%FLOAT 16256 0) (%FLOAT 16801 38273) (%FLOAT 17257 7717) (%FLOAT 17597 11739) (%FLOAT 17800 30401))))
(XCL:DEFGLOBALVAR %EXP-TABLE (IL:* IL:|;;| " %EXP-TABLE contains values of powers (EXPT 2 (/ N 8)) . ") (MAKE-ARRAY 8 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 16256 0) (%FLOAT 16267 38338) (%FLOAT 16280 14320) (%FLOAT 16293 65239) (%FLOAT 16309 1267) (%FLOAT 16325 26410) (%FLOAT 16343 17661) (%FLOAT 16362 49351))))
(DEFUN %EXP-FLOAT (X) (IL:* IL:|;;| "(CL:EXP X) for float X calculated via EXPB 1103 rational approximation of Hart et al. ") (LET ((FX (FLOAT X)) R M N ANSWER RECIPFLG) (DECLARE (TYPE FLOAT FX R)) (IL:* IL:|;;| "First, arrange X to be in interval (0 infinity) via identity (CL:EXP (minus X)) = (/ 1.0 (CL:EXP X))") (WHEN (IL:UFLESSP FX 0.0) (SETQ FX (IL:UFMINUS FX)) (SETQ RECIPFLG T)) (IL:* IL:|;;| "Next, the problem of (CL:EXP X) is converted into a problem (EXPT 2 Y) where Y = (* %LOG-BASE2-E X). ") (IL:* IL:|;;| "Then range reduction is accomplished via (EXPT 2 Y) = (* (EXPT 2 M) (EXPT 2 (/ N 8)) (EXPT 2 R)) where M and N are integers and R is a float in the interval (0.0 .125). ") (IL:* IL:|;;| "After M, N, R are determined, (EXPT 2 M) is effected by scaling, (EXPT 2 (/ N 8)) is found by table lookup, and (EXPT 2 R) is calculated by rational approximation EXPB 1103 of Hart et al. ") (%UFTRUNCATE M R (* %LOG-BASE2-E FX)) (%UFTRUNCATE N R R 0.125) (SETQ FX (IL:FTIMES (%GET-TABLE-ENTRY %EXP-TABLE N) (IL:FQUOTIENT (%POLYEVAL R %EXP-POLY 5) (%POLYEVAL (IL:UFMINUS R) %EXP-POLY 5)))) (COND (RECIPFLG (SETQ ANSWER (SETQ FX (IL:FQUOTIENT 1.0 FX))) (SCALE-FLOAT ANSWER (- M) ANSWER)) (T (SETQ ANSWER FX) (SCALE-FLOAT ANSWER M ANSWER)))))
(DEFUN EXP (NUMBER) (TYPECASE NUMBER (COMPLEX (LET ((EXP (%EXP-FLOAT (COMPLEX-REALPART NUMBER))) (Y (COMPLEX-IMAGPART NUMBER))) (COMPLEX (* EXP (COS Y)) (* EXP (SIN Y))))) (NUMBER (%EXP-FLOAT NUMBER)) (OTHERWISE (%NOT-NUMBER-ERROR NUMBER))))
(IL:* IL:|;;| "Expt (x to the power y)")
(DEFUN %EXPT-INTEGER (BASE POWER) (IL:* IL:|;;| "(EXPT BASE POWER) where BASE is an integer and POWER is an integer. ") (COND ((MINUSP POWER) (/ (%EXPT-INTEGER BASE (- POWER)))) ((EQ BASE 2) (ASH 1 POWER)) (T (IL:* IL:|;;| "Integer to positive integer power") (IL:* IL:\; "Must check first for infinity cases") (COND ((EQ BASE IL:MIN.INTEGER) (IF (INTEGERP POWER) (COND ((< POWER 0) 0) ((EQ POWER 0) 1) ((EQ POWER IL:MAX.INTEGER) (ERROR "Can't raise negative infinity to infinite power.")) ((EVENP POWER) IL:MAX.INTEGER) (T (IL:* IL:\; "Odd integer POWER") IL:MIN.INTEGER)) (ERROR "Can't raise negative infinity to noninteger power." POWER))) ((EQ BASE IL:MAX.INTEGER) (IF (EQ POWER 0) 1 IL:MAX.INTEGER)) ((EQ POWER IL:MAX.INTEGER) (COND ((EQ BASE 0) 0) ((> BASE 0) IL:MAX.INTEGER) (T (ERROR "Can't expt negative number to infinite power.")))) (T (LET ((TOTAL 1)) (LOOP (IF (ODDP POWER) (SETQ TOTAL (* BASE TOTAL))) (SETQ POWER (ASH POWER -1)) (IF (EQ 0 POWER) (RETURN TOTAL)) (SETQ BASE (* BASE BASE)))))))))
(DEFUN %EXPT-FLOAT-INTEGER (BASE POWER) (IL:* IL:|;;| "(EXPT BASE POWER) where BASE is a float and POWER is an integer. ") (COND ((MINUSP POWER) (IL:FQUOTIENT 1.0 (%EXPT-FLOAT-INTEGER BASE (- POWER)))) (T (IL:* IL:|;;| "float to positive integer power") (LET ((FBASE (FLOAT BASE)) (TOTAL 1.0)) (DECLARE (TYPE FLOAT FBASE TOTAL)) (LOOP (IF (ODDP POWER) (SETQ TOTAL (* FBASE TOTAL))) (SETQ POWER (ASH POWER -1)) (IF (EQ 0 POWER) (RETURN TOTAL)) (SETQ FBASE (* FBASE FBASE)))))))
(DEFUN EXPT (BASE-NUMBER POWER-NUMBER) (IL:* IL:|;;| "This function calculates BASE-NUMBER raised to the nth power. It separates the cases by the type of POWER-NUMBER for efficiency reasons, as powers can be calculated more efficiently if POWER-NUMBER is a positive integer, Therefore, All integer values of POWER-NUMBER are calculated as positive integers, and inverted if negative. ") (TYPECASE POWER-NUMBER (INTEGER (IF (EQ POWER-NUMBER 0) (TYPECASE BASE-NUMBER (FLOAT 1.0) ((COMPLEX FLOAT) (COMPLEX 1.0 0.0)) (NUMBER 1) (OTHERWISE (%NOT-NUMBER-ERROR BASE-NUMBER))) (TYPECASE BASE-NUMBER (INTEGER (%EXPT-INTEGER BASE-NUMBER POWER-NUMBER)) (RATIO (%MAKE-RATIO (%EXPT-INTEGER (RATIO-NUMERATOR BASE-NUMBER) POWER-NUMBER) (%EXPT-INTEGER (RATIO-DENOMINATOR BASE-NUMBER) POWER-NUMBER))) (FLOAT (%EXPT-FLOAT-INTEGER BASE-NUMBER POWER-NUMBER)) (COMPLEX (* (%EXPT-FLOAT-INTEGER (%COMPLEX-ABS BASE-NUMBER) POWER-NUMBER) (CIS (* POWER-NUMBER (PHASE BASE-NUMBER))))) (OTHERWISE (%NOT-NUMBER-ERROR BASE-NUMBER))))) (NUMBER (IF (= BASE-NUMBER 0) BASE-NUMBER (EXP (* POWER-NUMBER (LOG BASE-NUMBER))))) (OTHERWISE (%NOT-NUMBER-ERROR POWER-NUMBER))))
(IL:* IL:|;;| "Log (log base e)")
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT %LOG2 (%FLOAT 16177 29208))
(DEFCONSTANT %SQRT2 (%FLOAT 16309 1267))
)
(XCL:DEFGLOBALVAR %LOG-PPOLY (IL:* IL:|;;| "%LOG-PPOLY and %LOG-QPOLY contain P and Q coefficients of Hart et al LOGE 2707 rational approximation to (LOG X) in interval ((SQRT .5) (SQRT 2))") (MAKE-ARRAY 5 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 16042 22803) (%FLOAT 49484 23590) (%FLOAT 17044 17982) (%FLOAT 49926 37153) (%FLOAT 17046 5367))))
(XCL:DEFGLOBALVAR %LOG-QPOLY (IL:* IL:|;;| "%LOG-PPOLY and %LOG-QPOLY contain P and Q coefficients of Hart et al LOGE 2707 rational approximation to (LOG X) in interval ((SQRT .5) (SQRT 2))") (MAKE-ARRAY 5 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 16256 0) (%FLOAT 49512 9103) (%FLOAT 16992 42274) (%FLOAT 49823 38048) (%FLOAT 16918 5367))))
(DEFUN %LOG-FLOAT (X) (IL:* IL:|;;| "(LOG X) for positive float X. ") (IF (<= (SETQ X (FLOAT X)) 0.0) (ERROR "Log of zero: ~s" X)) (IL:* IL:|;;| "Range reduce to an R in interval ((SQRT 0.5) (SQRT 2)) via identity (LOG X) = (+ (LOG R) (* %LOG-2 EXP)) for a suitable integer EXP. exp is found from the exponent field of the iee floating point number representation of x.") (LET (R EXP ANSWER) (DECLARE (TYPE FLOAT R)) (LET (SIGN HI LO) (%FLOAT-UNBOX X SIGN EXP HI LO) (SETQ EXP (- EXP IL:\\EXPONENT.BIAS)) (SETQ R (%UMAKE-FLOAT SIGN IL:\\EXPONENT.BIAS HI LO)) NIL) (WHEN (IL:UFGREATERP R %SQRT2) (SETQ EXP (1+ EXP)) (SETQ R (IL:FQUOTIENT R 2.0))) (IL:* IL:|;;| "(LOG R) is calculated by rational approximation LOGE 2707 of Hart et al.") (LET* ((Z (IL:FQUOTIENT (1- R) (1+ R))) (Z2 (* Z Z))) (DECLARE (TYPE FLOAT Z Z2)) (SETQ ANSWER (SETQ R (+ (* Z (IL:FQUOTIENT (%POLYEVAL Z2 %LOG-PPOLY 4) (%POLYEVAL Z2 %LOG-QPOLY 4))) (* %LOG2 EXP))))) ANSWER))
(DEFUN LOG (NUMBER &OPTIONAL BASE) (IF BASE (IL:QUOTIENT (LOG NUMBER) (LOG BASE)) (TYPECASE NUMBER ((OR FLOAT RATIONAL) (IF (MINUSP NUMBER) (COMPLEX (%LOG-FLOAT (- NUMBER)) PI) (%LOG-FLOAT NUMBER))) (COMPLEX (COMPLEX (%LOG-FLOAT (%COMPLEX-ABS NUMBER)) (PHASE NUMBER))) (OTHERWISE (%NOT-NUMBER-ERROR NUMBER)))))
(IL:* IL:|;;| "Sqrt")
(DEFUN %SQRT-FLOAT (X) (IL:* IL:|;;| "(SQRT X) for nonnegative float X") (SETQ X (FLOAT X)) (IF (<= X 0.0) 0.0 (LET ((FX X) V) (DECLARE (TYPE FLOAT FX V)) (LET (SIGN EXP HI LO) (%FLOAT-UNBOX X SIGN EXP HI LO) (IL:* IL:|;;| "First guess") (SETQ V (%UMAKE-FLOAT 0 (+ (ASH EXP -1) (IL:CONSTANT (1+ (ASH IL:\\EXPONENT.BIAS -1)))) HI LO)) NIL) (IL:* IL:|;;| "Four step newton-raphson") (DOTIMES (I 4 V) (SETQ V (* 0.5 (+ V (IL:FQUOTIENT FX V))))))))
(DEFUN %SQRT-COMPLEX (Z) (IL:* IL:|;;| "(SQRT X) for complex X. ") (LET ((R (FLOAT (COMPLEX-REALPART Z))) (I (FLOAT (COMPLEX-IMAGPART Z))) (ABS (SQRT (ABS Z))) (PHASE (IL:FQUOTIENT (PHASE Z) 2.0)) C D E ANSWER) (DECLARE (TYPE FLOAT ABS R I)) (IL:* IL:|;;| "Newton's method.") (LET ((C (* ABS (COS PHASE))) (D (* ABS (SIN PHASE))) E) (DECLARE (TYPE FLOAT C D E)) (DOTIMES (K 4 (COMPLEX C D)) (SETQ E (+ (* C C) (* D D))) (SETQ C (* 0.5 (+ C (IL:FQUOTIENT (+ (* R C) (* I D)) E)))) (SETQ D (* 0.5 (+ D (IL:FQUOTIENT (- (* I C) (* R D)) E))))))))
(DEFUN SQRT (NUMBER) (IF (= NUMBER 0) 0.0 (TYPECASE NUMBER (COMPLEX (%SQRT-COMPLEX NUMBER)) (NUMBER (IF (MINUSP NUMBER) (IL:* IL:\; "Negative real axis maps into positive imaginary axis.") (COMPLEX 0 (SQRT (- NUMBER))) (%SQRT-FLOAT NUMBER))) (OTHERWISE (%NOT-NUMBER-ERROR NUMBER)))))
(IL:* IL:|;;| "Sin and Cos")
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT %SIN-EPSILON (IL:* IL:|;;| "%SIN-EPSILON is sufficiently small that (SIN X) = X for X in interval (0 %SIN-EPSILON). It suffices to take %SIN-EPSILON a little bit smaller than (SQRT (* 6 SINGLE-FLOAT-EPSILON)) which we get by the Taylor series expansion (SIN X) = (+ X (/ (EXPT X 3) 6) ...) (The relative error caused by ommitting (/ (EXPT X 3) 6) isn't observable.) Comparison against %SIN-EPSILON is used to avoid POLYEVAL microcode underflow when computing SIN.") (%FLOAT 14720 0))
)
(XCL:DEFGLOBALVAR %SIN-PPOLY (IL:* IL:|;;| "%SIN-PPOLY and %SIN-QPOLY contain adapted P and Q coefficients of Hart et al SIN 3374 rational approximation to (SIN X) in interval (0 (/ PI 2)). The coefficients for %SIN-PPOLY and %SIN-QPOLY have been computed from Hart using extended precision routines and the relations %SIN-PPOLY = (REVERSE (for I from 0 as ENTRY in PS collect (/ (* (EXPT (/ 2 PI) (1+ (* 2 I))) ENTRY) Q0))) and %SIN-QPOLY = (REVERSE (for I from 0 as ENTRY in QS collect (/ (* (EXPT (/ 2 PI) (* 2 I)) ENTRY) Q0)))") (MAKE-ARRAY 6 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 45236 25611) (%FLOAT 13589 26148) (%FLOAT 47286 34797) (%FLOAT 15295 3306) (%FLOAT 48666 34805) (%FLOAT 16256 0))))
(XCL:DEFGLOBALVAR %SIN-QPOLY (IL:* IL:|;;| "%SIN-PPOLY and %SIN-QPOLY contain adapted P and Q coefficients of Hart et al SIN 3374 rational approximation to (SIN X) in interval (0 (/ PI 2)). The coefficients for %SIN-PPOLY and %SIN-QPOLY have been computed from Hart using extended precision routines and the relations %SIN-PPOLY = (REVERSE (for I from 0 as ENTRY in PS collect (/ (* (EXPT (/ 2 PI) (1+ (* 2 I))) ENTRY) Q0))) and %SIN-QPOLY = (REVERSE (for I from 0 as ENTRY in QS collect (/ (* (EXPT (/ 2 PI) (* 2 I)) ENTRY) Q0))) *") (MAKE-ARRAY 6 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 11384 52865) (%FLOAT 12553 9550) (%FLOAT 13604 38385) (%FLOAT 14593 18841) (%FLOAT 15489 5549) (%FLOAT 16256 0))))
(DEFUN %SIN-FLOAT (X COS-FLG) (IL:* IL:|;;| "SIN of a FLOAT X calculated via SIN 3374 rational approximation of Hart et al. ") (LET ((THETA (FLOAT X)) (SIGN 1.0) SIGN) (DECLARE (TYPE FLOAT THETA SIGN)) (IL:* IL:|;;| "If this function is called by COS then use (COS X) = (SIN (-- %PI/2 X)) = (SIN (+ %PI/2 X)). Case out on sign of X for improved numerical stability. Avoids unnecessary rounding and promotes symmetric properties. (COS X) = (COS (-- X)) is guaranteed by this strategy.") (IF COS-FLG (IF (IL:UFGREATERP THETA 0.0) (SETQ THETA (- %PI/2 THETA)) (SETQ THETA (+ %PI/2 THETA)))) (IL:* IL:|;;| "First range reduce to (0 infinity) by (SIN (minus X)) = (minus (SIN X)) This strategy guarantees (SIN (minus X)) = (minus (SIN X))") (WHEN (IL:UFLESSP THETA 0.0) (SETQ SIGN -1.0) (SETQ THETA (IL:UFMINUS THETA))) (IL:* IL:|;;| "Next range reduce to interval (0 %2PI) by (SIN X) = (SIN (MOD X %2PI)) ") (IF (IL:UFGEQ THETA %2PI) (SETQ THETA (- THETA (* %2PI (FLOAT (IL:UFIX (IL:FQUOTIENT THETA %2PI))))))) (IL:* IL:|;;| "Next range reduce to interval (0 PI) by (SIN (+ X PI)) = (minus (SIN X)) ") (WHEN (IL:UFGREATERP THETA PI) (SETQ THETA (- THETA PI)) (SETQ SIGN (IL:UFMINUS SIGN))) (IL:* IL:|;;| "Next range reduce to interval (0 %PI/2) by (SIN (+ X %PI/2)) = (SIN (minus %PI/2 X))") (IF (IL:UFGREATERP THETA %PI/2) (SETQ THETA (- PI THETA))) (IF (IL:UFLESSP THETA %SIN-EPSILON) (IL:* IL:|;;| "If R is in the interval (0 %SIN-EPSILON) then (SIN R) = R to the precision that we can offer. Return R because (1) it is desirable that (SIN R) = R exactly for small R and (2) microcode POLYEVAL will underflow on sufficiently small positive R") (SETQ THETA (* SIGN THETA)) (IL:* IL:|;;| "Now use SIN 3374 rational approximation of Harris et al. which works on interval (0 %PI/2) ") (LET ((R2 (* THETA THETA))) (DECLARE (TYPE FLOAT R2)) (SETQ THETA (* SIGN THETA (IL:FQUOTIENT (%POLYEVAL R2 %SIN-PPOLY 5) (%POLYEVAL R2 %SIN-QPOLY 5))))))))
(DEFUN SIN (RADIANS) (TYPECASE RADIANS (COMPLEX (LET ((X (COMPLEX-REALPART RADIANS)) (Y (COMPLEX-IMAGPART RADIANS))) (COMPLEX (* (SIN X) (COSH Y)) (* (COS X) (SINH Y))))) (NUMBER (%SIN-FLOAT RADIANS NIL)) (OTHERWISE (%NOT-NUMBER-ERROR RADIANS))))
(DEFUN COS (RADIANS) (TYPECASE RADIANS (COMPLEX (LET ((X (COMPLEX-REALPART RADIANS)) (Y (COMPLEX-IMAGPART RADIANS))) (COMPLEX (* (COS X) (COSH Y)) (- (* (SIN X) (SINH Y)))))) (NUMBER (%SIN-FLOAT RADIANS T)) (OTHERWISE (%NOT-NUMBER-ERROR RADIANS))))
(IL:* IL:|;;| "Tan")
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT %TAN-EPSILON (IL:* IL:|;;| "%TAN-EPSILON is sufficiently small that (TAN X) = X for X in interval (0 %TAN-EPSILON). It suffices to take %TAN-EPSILON a little bit smaller than (SQRT (* 3 SINGLE-FLOAT-EPSILON)) which we get by the Taylor series expansion (TAN X) = (+ X (/ (EXPT X 3) 3) ...) (The relative error caused by ommitting (/ (EXPT X 3) 3) isn't observable.) Comparison against %TAN-EPSILON is used to avoid POLYEVAL microcode underflow when computing TAN.") (%FLOAT 14720 0))
)
(XCL:DEFGLOBALVAR %TAN-PPOLY (IL:* IL:|;;| "%TAN-PPOLY and %TAN-QPOLY contain adapted P and Q coefficients of Hart et al TAN 4288 rational approximation to (TAN X) in interval (-PI/4 PI/4). The coefficients for %TAN-PPOLY and %TAN-QPOLY have been computed from Hart using extended precision routines and the relations %TAN-PPOLY = (REVERSE (for I from 0 as ENTRY in PS collect (/ (* (EXPT (/ 4 PI) (1+ (* 2 I))) ENTRY) Q0))) and %TAN-QPOLY = (REVERSE (for I from 0 as ENTRY in QS collect (/ (* (EXPT (/ 4 PI) (* 2 I)) ENTRY) Q0))) ") (MAKE-ARRAY 5 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 13237 21090) (%FLOAT 47141 15825) (%FLOAT 15246 8785) (%FLOAT 48655 48761) (%FLOAT 16256 0))))
(XCL:DEFGLOBALVAR %TAN-QPOLY (IL:* IL:|;;| "%TAN-PPOLY and %TAN-QPOLY contain adapted P and Q coefficients of Hart et al TAN 4288 rational approximation to (TAN X) in interval (-PI/4 PI/4). The coefficients for %TAN-PPOLY and %TAN-QPOLY have been computed from Hart using extended precision routines and the relations %TAN-PPOLY = (REVERSE (for I from 0 as ENTRY in PS collect (/ (* (EXPT (/ 4 PI) (1+ (* 2 I))) ENTRY) Q0))) and %TAN-QPOLY = (REVERSE (for I from 0 as ENTRY in QS collect (/ (* (EXPT (/ 4 PI) (* 2 I)) ENTRY) Q0))) ") (MAKE-ARRAY 6 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 45267 36947) (%FLOAT 13848 46875) (%FLOAT 47612 53738) (%FLOAT 15596 52854) (%FLOAT 48882 35303) (%FLOAT 16256 0))))
(DEFUN %TAN-FLOAT (X) (IL:* IL:|;;| "TAN of a FLOAT X calculated via TAN 4288 rational approximation of Hart et al.") (LET ((FX (FLOAT X)) (SIGN 1.0) RECIPFLG) (DECLARE (TYPE FLOAT FX SIGN)) (IL:* IL:|;;| "First range reduce to (0 infinity) by (TAN (minus X)) = (minus (TAN X))") (WHEN (IL:UFLESSP FX 0.0) (SETQ SIGN -1.0) (SETQ FX (IL:UFMINUS FX))) (IL:* IL:|;;| "Next range reduce to (0 PI)") (IF (IL:UFGEQ FX PI) (SETQ FX (- FX (* PI (FLOAT (IL:UFIX (IL:FQUOTIENT FX PI))))))) (IL:* IL:|;;| "Next, range reduce to (-PI/4 PI/4) using (TAN X) = (TAN (minus X PI)) to get into interval (-PI/2 PI/2) and then (TAN X) = (/ (TAN (minus PI/2 X))) to get into interval (-PI/4 PI/4) ") (COND ((IL:UFGREATERP FX %PI/2) (SETQ FX (- FX PI)) (WHEN (IL:UFLESSP FX %-PI/4) (SETQ RECIPFLG T) (SETQ FX (- %-PI/2 FX)))) (T (WHEN (IL:UFGREATERP FX %PI/4) (SETQ RECIPFLG T) (SETQ FX (- %PI/2 FX))))) (COND ((IL:UFLESSP (IL:UFABS FX) %TAN-EPSILON) (IL:* IL:|;;| "If R is in the interval (0 %TAN-EPSILON) then (TAN R) = R to the precision that we can offer. Return R because (1) it is desirable that (TAN R) = R exactly for small R and (2) microcode POLYEVAL will underflow on sufficiently small positive R.") (SETQ FX (* SIGN FX)) (IF RECIPFLG (SETQ FX (IL:FQUOTIENT 1.0 FX)) FX)) (T (IL:* IL:|;;| "Now use TAN 4288 rational approximation of Hart et al. which works on interval (0 %PI/4)") (LET ((R2 (* FX FX))) (DECLARE (TYPE FLOAT R2)) (SETQ FX (* SIGN FX (IL:FQUOTIENT (%POLYEVAL R2 %TAN-PPOLY 4) (%POLYEVAL R2 %TAN-QPOLY 5)))) (IF RECIPFLG (SETQ FX (IL:FQUOTIENT 1.0 FX)) FX))))))
(DEFUN TAN (RADIANS) (TYPECASE RADIANS (COMPLEX (LET* ((X (* 2.0 (COMPLEX-REALPART RADIANS))) (Y (* 2.0 (COMPLEX-IMAGPART RADIANS))) (DENOM (+ (COS X) (COSH Y)))) (COMPLEX (IL:QUOTIENT (SIN X) DENOM) (IL:QUOTIENT (SINH Y) DENOM)))) (NUMBER (%TAN-FLOAT RADIANS)) (OTHERWISE (%NOT-NUMBER-ERROR RADIANS))))
(IL:* IL:|;;| "Asin and Acos")
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT %ASIN-EPSILON (IL:* IL:|;;| "%ASIN-EPSILON is sufficiently small that (ASIN X) = X for X in interval (0 %ASIN-EPSILON). It suffices to take %ASIN-EPSILON a little bit smaller than (* 2 SINGLE-FLOAT-EPSILON) which we get by the Taylor series expansion (ASIN X) = (+ X (/ (EXPT X 3) 6) ...) (The relative error caused by ommitting (/ (EXPT X 3) 6) isn't observable.) Comparison against %ASIN-EPSILON is used to avoid POLYEVAL microcode underflow when computing SIN.") (%FLOAT 14720 0))
)
(XCL:DEFGLOBALVAR %ASIN-PPOLY (IL:* IL:|;;| "%ASIN-PPOLY and %ASIN-QPOLY contain P and Q coefficients of Hart et al ARCSN 4671 rational approximation to (ASIN X) in interval (0 (SQRT .5)).") (MAKE-ARRAY 7 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 16007 50045) (%FLOAT 49549 8020) (%FLOAT 17236 15848) (%FLOAT 50285 63464) (%FLOAT 17650 31235) (%FLOAT 50403 62852) (%FLOAT 17440 39471))))
(XCL:DEFGLOBALVAR %ASIN-QPOLY (IL:* IL:|;;| "%ASIN-PPOLY and %ASIN-QPOLY contain P and Q coefficients of Hart et al ARCSN 4671 rational approximation to (ASIN X) in interval (0 (SQRT .5)).") (MAKE-ARRAY 7 :ELEMENT-TYPE (QUOTE SINGLE-FLOAT) :INITIAL-CONTENTS (LIST (%FLOAT 16256 0) (%FLOAT 49672 25817) (%FLOAT 17308 55260) (%FLOAT 50326 38098) (%FLOAT 17674 22210) (%FLOAT 50417 22451) (%FLOAT 17440 39471))))
(DEFUN %ASIN-FLOAT (X ACOS-FLG) (IL:* IL:|;;| "(ASIN X) for float X calculated via ARCSN 4671 rational approximation of Hart et al.") (IF (OR (< X -1.0) (> X 1.0)) (ERROR "Arg not in range: ~s" X)) (LET ((FX (FLOAT X)) NEGATIVE REDUCED) (DECLARE (TYPE FLOAT FX)) (IL:* IL:|;;| "Range reduce to (0 1) via identity (ASIN (minus X)) = (minus (ASIN X)) ") (WHEN (IL:UFLESSP FX 0.0) (SETQ NEGATIVE T) (SETQ FX (IL:UFMINUS FX))) (IL:* IL:|;;| "Range reduce to (0 0.5) via identity (ASIN X) = (minus %PI/2 (* 2.0 (ASIN (SQRT (* 0.5 (minus 1.0 R)))))) Avoids numerical instability calculating (ASIN X) for X near one. SIN is horizontally flat near %PI/2 so calculating (ASIN X) by rational approximation wouldn't work well for X near (SIN %PI/2) = 1") (WHEN (IL:UFGREATERP FX 0.5) (SETQ REDUCED T) (SETQ FX (SQRT (SETQ FX (* 0.5 (- 1.0 FX)))))) (IL:* IL:|;;| "R is now in range (0 0.5) Use ARCSN 4671 rational approximation to calculate (ASIN R) ") (IF (IL:UFGREATERP FX %ASIN-EPSILON) (IL:* IL:|;;| "If R is in the interval (0 %SIN-EPSILON) then (ASIN R) = R to the precision that we can offer. ") (LET ((R2 (* FX FX))) (DECLARE (TYPE FLOAT R2)) (SETQ FX (* FX (IL:QUOTIENT (%POLYEVAL R2 %ASIN-PPOLY 6) (%POLYEVAL R2 %ASIN-QPOLY 6)))) NIL)) (IF REDUCED (SETQ FX (- %PI/2 (* 2.0 FX)))) (IF NEGATIVE (SETQ FX (IL:UFMINUS FX))) (IL:* IL:|;;| "In case we want (ACOS X) then use identity (ACOS X) = (minus %PI/2 (ASIN X))") (IF ACOS-FLG (SETQ FX (- %PI/2 FX))) FX))
(DEFUN ASIN (NUMBER) (TYPECASE NUMBER (COMPLEX (LET ((Z (LOG (+ (COMPLEX (- (COMPLEX-IMAGPART NUMBER)) (COMPLEX-REALPART NUMBER)) (SQRT (- 1 (* NUMBER NUMBER))))))) (COMPLEX (COMPLEX-IMAGPART Z) (- (COMPLEX-REALPART Z))))) (NUMBER (%ASIN-FLOAT NUMBER NIL)) (OTHERWISE (%NOT-NUMBER-ERROR NUMBER))))
(DEFUN ACOS (RADIANS) (TYPECASE RADIANS (COMPLEX (LET ((Z (SQRT (- 1 (* RADIANS RADIANS))))) (SETQ Z (LOG (+ RADIANS (COMPLEX (- (COMPLEX-IMAGPART Z)) (COMPLEX-REALPART Z))))) (COMPLEX (COMPLEX-IMAGPART Z) (- (COMPLEX-REALPART Z))))) (NUMBER (%ASIN-FLOAT RADIANS T)) (OTHERWISE (%NOT-NUMBER-ERROR RADIANS))))
(IL:* IL:|;;| "Atan ")
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT %SQRT3 (%FLOAT 16349 46039))
(DEFCONSTANT %2-SQRT3 (%FLOAT 16009 12451))
(DEFCONSTANT %INV-2-SQRT3 (%FLOAT 16494 55788))
)
(DEFUN %ATAN-FLOAT (Y &OPTIONAL X) (LET ((FY (FLOAT Y)) FX FARG) (DECLARE (TYPE FLOAT FY FX FARG)) (IL:* IL:|;;| "Compute farg") (COND ((NULL X) (IF (= Y 0.0) (RETURN-FROM %ATAN-FLOAT 0.0) (SETQ FARG FY))) (T (IL:* IL:|;;| "Don't use unboxed version of =, because it doesn't return t on comparison of 0.0 and -0.0") (SETQ FX (FLOAT X)) (COND ((= X 0.0) (IF (= Y 0.0) (ERROR "Both args to atan are 0.0") (RETURN-FROM %ATAN-FLOAT (IF (> Y 0.0) %PI/2 (- %PI/2))))) ((= Y 0.0) (RETURN-FROM %ATAN-FLOAT (IF (> X 0.0) 0.0 PI))) ((> Y 0.0) (IF (> X 0.0) (SETQ FARG (IL:FQUOTIENT FY FX)) (SETQ FARG (IL:FQUOTIENT (IL:UFMINUS FY) FX)))) ((> X 0.0) (SETQ FARG (IL:FQUOTIENT FY (IL:UFMINUS FX)))) (T (SETQ FARG (IL:FQUOTIENT FY FX)))))) (IL:* IL:|;;| "Compute result") (LET ((CONSTANT 0.0) (CONSTANT-FLAG T) NEGATE-FLAG ADD-FLAG) (DECLARE (TYPE FLOAT CONSTANT)) (IL:* IL:|;;| "(ATAN (minus X)) = (minus (ATAN X)) ") (WHEN (IL:UFLESSP FARG 0.0) (SETQ NEGATE-FLAG T) (SETQ FARG (IL:UFMINUS FARG))) (IL:* IL:|;;| "Range reduce to (0, 2-sqrt(3))") (COND ((IL:UFGEQ FARG %INV-2-SQRT3) (IL:* IL:|;;| "(ATAN X) = (minus %PI/2 (ATAN (/ X)))") (SETQ CONSTANT %PI/2) (SETQ FARG (IL:FQUOTIENT 1.0 FARG))) ((IL:UFGEQ FARG 1.0) (SETQ CONSTANT %PI/3) (SETQ FARG (IL:FQUOTIENT (- %SQRT3 FARG) (+ 1.0 (* FARG %SQRT3))))) ((IL:UFGEQ FARG %2-SQRT3) (SETQ ADD-FLAG T) (SETQ CONSTANT %PI/6) (SETQ FARG (IL:FQUOTIENT (- (* FARG %SQRT3) 1.0) (+ %SQRT3 FARG)))) (T (SETQ CONSTANT-FLAG NIL))) (IL:* IL:|;;| "Power series expansion cons'ed up on the fly") (LET ((SQR (IL:UFMINUS (* FARG FARG))) (INT 1.0) (POW FARG) (OLD 0.0)) (DECLARE (TYPE FLOAT SQR INT POW OLD)) (LOOP (IF (IL:UFEQP FARG OLD) (RETURN NIL)) (SETQ INT (+ INT 2.0)) (SETQ POW (* POW SQR)) (SETQ OLD FARG) (SETQ FARG (+ FARG (IL:FQUOTIENT POW INT))))) (IF CONSTANT-FLAG (IF ADD-FLAG (SETQ FARG (+ CONSTANT FARG)) (SETQ FARG (- CONSTANT FARG)))) (IF NEGATE-FLAG (SETQ FARG (IL:UFMINUS FARG)))) (IL:* IL:|;;| "Fix up") (IF X (COND ((IL:UFGREATERP FY 0.0) (IF (IL:UFLESSP FX 0.0) (SETQ FARG (- PI FARG)))) ((IL:UFGREATERP FX 0.0) (SETQ FARG (IL:UFMINUS FARG))) (T (SETQ FARG (- FARG PI))))) (IL:* IL:|;;| "Box and return") FARG))
(DEFUN ATAN (Y &OPTIONAL X) (COND (X (%ATAN-FLOAT (FLOAT Y) (FLOAT X))) ((COMPLEXP Y) (LET ((R (COMPLEX-REALPART Y)) (I (COMPLEX-IMAGPART Y))) (IF (NOT (AND (ZEROP R) (= (ABS I) 1))) (LET ((Z (COMPLEX (- I) R))) (SETQ Z (* 0.5 (LOG (/ (+ 1 Z) (- 1 Z))))) (COMPLEX (COMPLEX-IMAGPART Z) (- (COMPLEX-REALPART Z)))) (ERROR "Argument not in domain for atan. ~S" Y)))) (T (%ATAN-FLOAT Y))))
(IL:* IL:|;;| "Cis (exp (i x))")
(DEFUN CIS (RADIANS) (IF (TYPEP RADIANS (QUOTE (AND NUMBER (NOT COMPLEX)))) (COMPLEX (%SIN-FLOAT RADIANS T) (%SIN-FLOAT RADIANS)) (%NOT-NONCOMPLEX-NUMBER-ERROR RADIANS)))
(IL:* IL:|;;| "Sinh, Cosh Tanh")
(DEFUN SINH (NUMBER) (IL:* IL:|;;| "Computed directly from its ") (IF (COMPLEXP NUMBER) (LET ((Z (EXP NUMBER))) (/ (- Z (/ Z)) 2)) (LET ((FZ (%EXP-FLOAT NUMBER))) (DECLARE (TYPE FLOAT FZ)) (SETQ FZ (IL:FQUOTIENT (- FZ (IL:FQUOTIENT 1.0 FZ)) 2.0)))))
(DEFUN COSH (NUMBER) (IF (COMPLEXP NUMBER) (LET ((Z (EXP NUMBER))) (/ (+ Z (/ Z)) 2)) (LET ((FZ (%EXP-FLOAT NUMBER))) (DECLARE (TYPE FLOAT FZ)) (SETQ FZ (IL:FQUOTIENT (+ FZ (IL:FQUOTIENT 1.0 FZ)) 2.0)))))
(DEFUN TANH (NUMBER) (IF (COMPLEXP NUMBER) (/ (SINH NUMBER) (COSH NUMBER)) (LET* ((FX (%EXP-FLOAT (* 2 NUMBER))) (FY (IL:FQUOTIENT 1.0 FX))) (DECLARE (TYPE FLOAT FX FY)) (SETQ FX (- (IL:FQUOTIENT 1.0 (+ 1.0 FY)) (IL:FQUOTIENT 1.0 (+ 1.0 FX)))))))
(IL:* IL:|;;| "Asinh Acosh Atanh")
(DEFUN ASINH (NUMBER) (IF (COMPLEXP NUMBER) (LOG (+ NUMBER (SQRT (+ (* NUMBER NUMBER) 1)))) (LET ((FX (FLOAT NUMBER)) BOX) (DECLARE (TYPE FLOAT FX BOX)) (LOG (SETQ BOX (+ FX (SQRT (SETQ BOX (+ (* FX FX) 1.0)))))))))
(DEFUN ACOSH (NUMBER) (IF (OR (COMPLEXP NUMBER) (< NUMBER 1)) (LOG (+ NUMBER (* (+ NUMBER 1) (SQRT (/ (- NUMBER 1) (+ NUMBER 1)))))) (LET ((FX (FLOAT NUMBER)) BOX) (DECLARE (TYPE FLOAT FX BOX)) (LOG (SETQ BOX (+ FX (SQRT (SETQ BOX (- (* FX FX) 1.0)))))))))
(DEFUN ATANH (NUMBER) (IF (OR (COMPLEXP NUMBER) (> (ABS NUMBER) 1)) (IF (AND (ZEROP (IMAGPART NUMBER)) (= (ABS (REALPART NUMBER)) 1)) (ERROR "Argument out of range. ~s" NUMBER) (* 0.5 (LOG (/ (+ 1 NUMBER) (- 1 NUMBER))))) (IF (= NUMBER 1.0) (ERROR "Argument out of range. ~s" NUMBER) (LET ((FX (FLOAT NUMBER)) BOX) (DECLARE (TYPE FLOAT FX BOX)) (SETQ BOX (* 0.5 (LOG (SETQ BOX (IL:FQUOTIENT (+ 1.0 FX) (- 1.0 FX))))))))))
(IL:* IL:|;;| "rational and rationalize ")
(DEFUN %RATIONAL-FLOAT (NUMBER) (IF (= NUMBER 0.0) 0 (LET (SIGN EXP HI LO MANT) (%FLOAT-UNBOX NUMBER SIGN EXP HI LO T) (SETQ MANT (+ (ASH HI 16) LO)) (IF (EQ SIGN 1) (SETQ MANT (- MANT))) (SETQ EXP (- EXP 23 IL:\\EXPONENT.BIAS)) (IF (< EXP 0) (%BUILD-RATIO MANT (ASH 1 (- EXP))) (ASH MANT EXP)))))
(DEFUN %RATIONALIZE-FLOAT (X) (IL:* IL:|;;| "Produce a rational approximating X. ") (IL:* IL:|;;| "This routine presupposes familiarity with topics in number theory and IEEE FLOATP representation. The algorithm uses a standard mathematical technique for approximating a real valued number, but in very sophisticated form more amenable to the computer and the nature of IEEE FLOATPs and is not an algorithm you are likely to find published anywhere. ") (IF (= X 0.0) (IL:* IL:\; "In case X = 0, just return 0 ") 0 (LET (SIGN EXPT HI LO XNUM XDEN R) (IL:* IL:|;;| "First of all, X is range reduced to the interval ((SQRT .5) (SQRT 2)) excluding (SQRT 2) This strategy has the property that FLOATPs differing only by sign and a power of two rationalize into rationals differing only by sign and a power of two. The choice of interval ((SQRT .5) (SQRT 2)) versus another interval such as (.5 1) is due to our wanting there to be roughly the same number of significant bits in the numerator as in the denominator of the answer that is returned. Here, significant bits is taken to mean the number of bits in the results returned by the continued fraction approximation and excludes the bits resulting from multiplying by the power of two. ") (IL:* IL:\; "Get SIGN XNUM XDEN and EXPT for X. ") (LET (BIT-SIGN EXP HI LO) (%FLOAT-UNBOX X BIT-SIGN EXP HI LO T) (SETQ XNUM (+ (ASH HI 16) LO)) (SETQ EXPT (- EXP (+ IL:\\EXPONENT.BIAS 23))) (SETQ SIGN (IF (EQ BIT-SIGN 0) 1 -1)) (IL:* IL:\; "Compute r") (LOOP (IF (NOT (EQ 0 (LOGAND HI IL:\\HIDDENBIT))) (RETURN NIL)) (IL:* IL:\; "Handle the denormalized case") (IL:.LLSH1. HI LO)) (IL:.LLSH8. HI LO) (SETQ R (IL:\\MAKEFLOAT 0 (1- IL:\\EXPONENT.BIAS) HI LO))) (IL:* IL:\; "24 because FLOATPs have 24 bit mantissas. ") (SETQ XDEN (IL:CONSTANT (ASH 1 24))) (SETQ EXPT (+ EXPT 24)) (COND ((< XNUM 11863283) (IL:* IL:\; "11863283 = (SQRT 0.5) mantissa. ") (SETQ XDEN (ASH XDEN -1)) (SETQ EXPT (1- EXPT)) (SETQ R (* 2 R)))) (IL:* IL:|;;| "At this point, X = (* (/ XNUM XDEN) (EXPT 2 EXPT)) and (/ XNUM XDEN) is in the interval ((SQRT 0.5) (SQRT 2)) ") (LET ((OLDNUM 1) (OLDDEN 0) (NUM 0) (DEN 1)) (IL:* IL:\; "Continued fraction approximation loop. ") (LOOP (COND ((AND (NOT (EQ DEN 0)) (= (IL:FQUOTIENT NUM DEN) R)) (COND ((> EXPT 0) (SETQ NUM (ASH NUM EXPT))) ((< EXPT 0) (SETQ DEN (ASH DEN (- EXPT))))) (RETURN (/ (* SIGN NUM) DEN)))) (ROTATEF XNUM XDEN) (LET ((TRUNC (IL:IQUOTIENT XNUM XDEN))) (SETQ NUM (+ OLDNUM (* TRUNC (SETQ OLDNUM NUM)))) (SETQ DEN (+ OLDDEN (* TRUNC (SETQ OLDDEN DEN)))) (SETQ XNUM (- XNUM (* XDEN TRUNC)))))))))
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(IL:DECLARE\: IL:DOEVAL@COMPILE IL:DONTCOPY
(IL:LOCALVARS . T)
)
)
(IL:PUTPROPS IL:CMLFLOAT IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "LISP"))
(IL:PUTPROPS IL:CMLFLOAT IL:FILETYPE COMPILE-FILE)
(IL:PUTPROPS IL:CMLFLOAT IL:COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1990 1992))
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL)))
IL:STOP

BIN
CLTL2/CMLFLOAT.LCOM Normal file

Binary file not shown.

600
CLTL2/CMLFLOATARRAY Normal file
View File

@@ -0,0 +1,600 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "19-Oct-93 10:48:08" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLFLOATARRAY.;1" 29993
previous date%: "11-Jun-90 14:41:02" "{Pele:mv:envos}<LispCore>Sources>CMLFLOATARRAY.;1")
(* ; "
Copyright (c) 1985, 1986, 1987, 1990, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLFLOATARRAYCOMS)
(RPAQQ CMLFLOATARRAYCOMS
[(DECLARE%: DONTCOPY DOEVAL@COMPILE (FILES (SYSLOAD FROM VALUEOF DIRECTORIES)
UNBOXEDOPS FLOAT-ARRAY-SUPPORT))
(* ;; "MAPARRAY fns and macros")
(FNS MAP-ARRAY)
(FUNCTIONS MAP-ARRAY-1 MAP-ARRAY-2)
(FUNCTIONS REDUCE-ARRAY EVALUATE-POLYNOMIAL FIND-ARRAY-ELEMENT-INDEX)
(FUNCTIONS FLATTEN-ARG MAX-ABS MIN-ABS)
(FUNCTIONS %%MAP-FLOAT-ARRAY-ABS %%MAP-FLOAT-ARRAY-FLOAT %%MAP-FLOAT-ARRAY-MINUS
%%MAP-FLOAT-ARRAY-NEGATE %%MAP-FLOAT-ARRAY-PLUS %%MAP-FLOAT-ARRAY-QUOTIENT
%%MAP-FLOAT-ARRAY-TIMES %%MAP-FLOAT-ARRAY-TRUNCATE %%REDUCE-FLOAT-ARRAY-MAX
%%REDUCE-FLOAT-ARRAY-MAX-ABS %%REDUCE-FLOAT-ARRAY-MIN %%REDUCE-FLOAT-ARRAY-MIN-ABS
%%REDUCE-FLOAT-ARRAY-PLUS %%REDUCE-FLOAT-ARRAY-TIMES)
(* ;; "For convenience")
(PROP FILETYPE CMLFLOATARRAY)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (LOCALVARS . T))
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
(NLAML)
(LAMA MAP-ARRAY])
(DECLARE%: DONTCOPY DOEVAL@COMPILE
(FILESLOAD (SYSLOAD FROM VALUEOF DIRECTORIES)
UNBOXEDOPS FLOAT-ARRAY-SUPPORT)
)
(* ;; "MAPARRAY fns and macros")
(DEFINEQ
(MAP-ARRAY
[LAMBDA ARGS (* ; "Edited 9-Apr-87 16:22 by jop")
(* ;; "First arg, RESULT, may either be an array of the correct type, or a symbol indicating the element-type of the result, or NIL if the map is for effect. Second arg is the mapping functions. Other args are arrays, all of which must have the same number of elements, or non-arrays which will be treated as scalars ")
(LISP:IF (< ARGS 3)
(LISP:ERROR "MAPARRAY takes at least three args"))
(LET ((RESULT (ARG ARGS 1))
(MAPFN (ARG ARGS 2))
(ARRAY1 (ARG ARGS 3))
FIRST-ARRAY)
(* ;; "Arg checking. First-array is the first array map argument")
(LISP:IF (NOT (TYPEP MAPFN 'LISP:FUNCTION))
(LISP:ERROR "Not a function: ~S" MAPFN))
(LISP:DO ((I 3 (LISP:1+ I))
MAP-ARG)
((> I ARGS))
(SETQ MAP-ARG (ARG ARGS I))
(LISP:WHEN (LISP:ARRAYP MAP-ARG)
(LISP:IF FIRST-ARRAY
(LISP:IF (NOT (EQUAL-DIMENSIONS-P MAP-ARG FIRST-ARRAY))
(LISP:ERROR "Dimensions mismatch" MAP-ARG))
(SETQ FIRST-ARRAY MAP-ARG))))
(* ;; "Coerce RESULT into an array or NIL")
(LISP:TYPECASE RESULT
(LISP:ARRAY (LISP:IF [NOT (OR (EQUAL-DIMENSIONS-P RESULT FIRST-ARRAY)
(AND (NULL FIRST-ARRAY)
(EQ 0 (LISP:ARRAY-RANK RESULT]
(LISP:ERROR "Dimensions mismatch: ~S" RESULT)))
((OR LISP:SYMBOL CONS) (SETQ RESULT (LISP:IF FIRST-ARRAY
(LISP:MAKE-ARRAY (LISP:ARRAY-DIMENSIONS
FIRST-ARRAY)
:ELEMENT-TYPE RESULT)
(LISP:MAKE-ARRAY NIL :ELEMENT-TYPE RESULT))))
(T (OR (NULL RESULT)
(LISP:ERROR "RESULT must be an array, an element type, or NIL: ~S" RESULT))))
(LISP:IF FIRST-ARRAY
(LISP:IF (AND RESULT (< ARGS 5))
(LISP:ECASE ARGS
(3 (* ;
 "Note: in this case (EQ ARRAY1 FIRST-ARRAY)")
(MAP-ARRAY-1 RESULT MAPFN ARRAY1))
(4 (MAP-ARRAY-2 RESULT MAPFN ARRAY1 (ARG ARGS 4))))
[LET* ((FLATTENED-RESULT (FLATTEN-ARG RESULT))
(SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
[FLATTENED-ARRAYS (for I from 3 to ARGS
collect (FLATTEN-ARG (ARG ARGS I]
(ELT-SLICE (LISP:COPY-LIST FLATTENED-ARRAYS))
VALUE)
(LISP:DOTIMES (INDEX SIZE RESULT)
[SETQ VALUE (LISP:APPLY MAPFN (LISP:DO ((%%SUBSLICE ELT-SLICE (CDR
%%SUBSLICE
))
(%%SUBARRAYS FLATTENED-ARRAYS
(CDR %%SUBARRAYS)))
((NULL %%SUBARRAYS)
ELT-SLICE)
(AND (LISP:ARRAYP (CAR %%SUBARRAYS))
(RPLACA %%SUBSLICE
(LISP:AREF (CAR %%SUBARRAYS)
INDEX))))]
(LISP:IF RESULT
(LISP:SETF (LISP:AREF FLATTENED-RESULT INDEX)
VALUE)))])
(LISP:IF RESULT
[LISP:SETF (LISP:AREF RESULT)
(LISP:APPLY MAPFN (for I from 3 to ARGS
collect (ARG ARGS I]
(LISP:APPLY MAPFN (for I from 3 to ARGS collect (ARG ARGS I)))))])
)
(LISP:DEFUN MAP-ARRAY-1 (RESULT MAPFN ARRAY)
(* ;;
 "Does something fast for MAPFNS - abs truncate float and EXPONENT. ARRAY is always an array.")
[LET [(RESULT-FLOAT-P (EQ (LISP:ARRAY-ELEMENT-TYPE RESULT)
'LISP:SINGLE-FLOAT))
(ARRAY-FLOAT-P (EQ (LISP:ARRAY-ELEMENT-TYPE ARRAY)
'LISP:SINGLE-FLOAT] (* ; "Coerce MAPFN to standard form")
(SETQ MAPFN (LISP:TYPECASE MAPFN
(LISP:SYMBOL (CASE MAPFN
(MINUS '-)
(FIX 'LISP:TRUNCATE)
(T MAPFN)))
(COMPILED-CLOSURE (COND
((OR (LISP::%%EQCODEP MAPFN '-)
(LISP::%%EQCODEP MAPFN 'MINUS))
'-)
((LISP::%%EQCODEP MAPFN 'ABS)
'ABS)
((OR (LISP::%%EQCODEP MAPFN 'FIX)
(LISP::%%EQCODEP MAPFN 'LISP:TRUNCATE))
'LISP:TRUNCATE)
((LISP::%%EQCODEP MAPFN 'FLOAT)
'FLOAT)
(T MAPFN)))
(T MAPFN)))
(COND
((AND (EQ MAPFN '-)
RESULT-FLOAT-P ARRAY-FLOAT-P)
(%%MAP-FLOAT-ARRAY-NEGATE RESULT ARRAY))
((AND (EQ MAPFN 'ABS)
RESULT-FLOAT-P ARRAY-FLOAT-P)
(%%MAP-FLOAT-ARRAY-ABS RESULT ARRAY))
((AND (EQ MAPFN 'LISP:TRUNCATE)
ARRAY-FLOAT-P)
(%%MAP-FLOAT-ARRAY-TRUNCATE RESULT ARRAY))
((AND (EQ MAPFN 'FLOAT)
RESULT-FLOAT-P)
(%%MAP-FLOAT-ARRAY-FLOAT RESULT ARRAY))
(T (LET ((FLATTENED-RESULT (FLATTEN-ARG RESULT))
(FLATTENED-ARRAY (FLATTEN-ARG ARRAY)))
(LISP:DOTIMES (INDEX (LISP:ARRAY-TOTAL-SIZE RESULT)
RESULT)
(LISP:SETF (LISP:AREF FLATTENED-RESULT INDEX)
(LISP:FUNCALL MAPFN (LISP:AREF FLATTENED-ARRAY INDEX))))])
(LISP:DEFUN MAP-ARRAY-2 (RESULT MAPFN ARRAY-1 ARRAY-2)
(* ;; "Does something fast for MAPFNS + - * /. At least one of ARRAY-1 and ARRAY-2 is an array")
[LET [(ARRAYS-FLOAT-P (AND (EQ (LISP:ARRAY-ELEMENT-TYPE RESULT)
'LISP:SINGLE-FLOAT)
[OR (TYPEP ARRAY-1 '(LISP:ARRAY LISP:SINGLE-FLOAT))
(TYPEP ARRAY-1 '(OR FLOAT LISP:RATIONAL]
(OR (TYPEP ARRAY-2 '(LISP:ARRAY LISP:SINGLE-FLOAT))
(TYPEP ARRAY-2 '(OR FLOAT LISP:RATIONAL]
(* ; "Coerce MAPFN to standard form")
(SETQ MAPFN (LISP:TYPECASE MAPFN
(LISP:SYMBOL (CASE MAPFN
(PLUS '+)
(MINUS '-)
(TIMES 'LISP:*)
(QUOTIENT '/)
(T MAPFN)))
(COMPILED-CLOSURE (COND
((OR (LISP::%%EQCODEP MAPFN '+)
(LISP::%%EQCODEP MAPFN 'PLUS))
'+)
((OR (LISP::%%EQCODEP MAPFN '-)
(LISP::%%EQCODEP MAPFN 'MINUS))
'-)
((OR (LISP::%%EQCODEP MAPFN 'LISP:*)
(LISP::%%EQCODEP MAPFN 'TIMES))
'LISP:*)
((OR (LISP::%%EQCODEP MAPFN '/)
(LISP::%%EQCODEP MAPFN 'QUOTIENT))
'/)
(T MAPFN)))
(T MAPFN)))
(COND
((AND (EQ MAPFN '+)
ARRAYS-FLOAT-P)
(%%MAP-FLOAT-ARRAY-PLUS RESULT ARRAY-1 ARRAY-2))
((AND (EQ MAPFN '-)
ARRAYS-FLOAT-P)
(%%MAP-FLOAT-ARRAY-MINUS RESULT ARRAY-1 ARRAY-2))
((AND (EQ MAPFN 'LISP:*)
ARRAYS-FLOAT-P)
(%%MAP-FLOAT-ARRAY-TIMES RESULT ARRAY-1 ARRAY-2))
((AND (EQ MAPFN '/)
ARRAYS-FLOAT-P)
(%%MAP-FLOAT-ARRAY-QUOTIENT RESULT ARRAY-1 ARRAY-2))
(T (LET ((FLATTENED-RESULT (FLATTEN-ARG RESULT))
(FLATTENED-ARRAY-1 (FLATTEN-ARG ARRAY-1))
(FLATTENED-ARRAY-2 (FLATTEN-ARG ARRAY-2)))
(LISP:IF (LISP:ARRAYP ARRAY-1)
(LISP:IF (LISP:ARRAYP ARRAY-2)
(LISP:DOTIMES (INDEX (LISP:ARRAY-TOTAL-SIZE RESULT)
RESULT)
(LISP:SETF (LISP:AREF FLATTENED-RESULT INDEX)
(LISP:FUNCALL MAPFN (LISP:AREF FLATTENED-ARRAY-1 INDEX)
(LISP:AREF FLATTENED-ARRAY-2 INDEX))))
(LISP:DOTIMES (INDEX (LISP:ARRAY-TOTAL-SIZE RESULT)
RESULT)
(LISP:SETF (LISP:AREF FLATTENED-RESULT INDEX)
(LISP:FUNCALL MAPFN (LISP:AREF FLATTENED-ARRAY-1 INDEX)
FLATTENED-ARRAY-2))))
(LISP:DOTIMES (INDEX (LISP:ARRAY-TOTAL-SIZE RESULT)
RESULT)
(LISP:SETF (LISP:AREF FLATTENED-RESULT INDEX)
(LISP:FUNCALL MAPFN FLATTENED-ARRAY-1 (LISP:AREF FLATTENED-ARRAY-2
INDEX)))))])
(LISP:DEFUN REDUCE-ARRAY (REDUCTION-FN ARRAY &OPTIONAL (INITIAL-VALUE NIL INITIAL-VALUE-P))
(SETQ REDUCTION-FN (LISP:TYPECASE REDUCTION-FN
(LISP:SYMBOL (CASE REDUCTION-FN
(PLUS '+)
(TIMES 'LISP:*)
(T REDUCTION-FN)))
(COMPILED-CLOSURE (COND
((OR (LISP::%%EQCODEP REDUCTION-FN '+)
(LISP::%%EQCODEP REDUCTION-FN 'PLUS))
'+)
((OR (LISP::%%EQCODEP REDUCTION-FN 'LISP:*)
(LISP::%%EQCODEP REDUCTION-FN 'TIMES))
'LISP:*)
((LISP::%%EQCODEP REDUCTION-FN 'MIN)
'MIN)
((LISP::%%EQCODEP REDUCTION-FN 'MAX)
'MAX)
((LISP::%%EQCODEP REDUCTION-FN 'MIN-ABS)
'MIN-ABS)
((LISP::%%EQCODEP REDUCTION-FN 'MAX-ABS)
'MAX-ABS)
(T REDUCTION-FN)))
(T REDUCTION-FN)))
(LISP:IF (NOT (LISP:ARRAYP ARRAY))
(LISP:IF INITIAL-VALUE-P
(LISP:FUNCALL REDUCTION-FN INITIAL-VALUE ARRAY)
ARRAY)
[LET [(SIZE (LISP:ARRAY-TOTAL-SIZE ARRAY))
(ARRAY-FLOAT-P (EQ (LISP:ARRAY-ELEMENT-TYPE ARRAY)
'LISP:SINGLE-FLOAT]
(CASE SIZE
(0 (LISP:IF INITIAL-VALUE-P
INITIAL-VALUE
(LISP:FUNCALL REDUCTION-FN)))
(1 (LISP:IF INITIAL-VALUE-P
(LISP:FUNCALL REDUCTION-FN INITIAL-VALUE (LISP:AREF (FLATTEN-ARG ARRAY)
0))
(LISP:AREF (FLATTEN-ARG ARRAY)
0)))
(T [COND
((AND (EQ REDUCTION-FN '+)
ARRAY-FLOAT-P)
(%%REDUCE-FLOAT-ARRAY-PLUS ARRAY INITIAL-VALUE))
((AND (EQ REDUCTION-FN 'LISP:*)
ARRAY-FLOAT-P)
(%%REDUCE-FLOAT-ARRAY-TIMES ARRAY INITIAL-VALUE))
((AND (EQ REDUCTION-FN 'MIN)
ARRAY-FLOAT-P)
(%%REDUCE-FLOAT-ARRAY-MIN ARRAY INITIAL-VALUE))
((AND (EQ REDUCTION-FN 'MAX)
ARRAY-FLOAT-P)
(%%REDUCE-FLOAT-ARRAY-MAX ARRAY INITIAL-VALUE))
((AND (EQ REDUCTION-FN 'MIN-ABS)
ARRAY-FLOAT-P)
(%%REDUCE-FLOAT-ARRAY-MIN-ABS ARRAY INITIAL-VALUE))
((AND (EQ REDUCTION-FN 'MAX-ABS)
ARRAY-FLOAT-P)
(%%REDUCE-FLOAT-ARRAY-MAX-ABS ARRAY INITIAL-VALUE))
(T (LISP:DO* ((FLATTENED-ARRAY (FLATTEN-ARG ARRAY))
(ACCUMULATOR (LISP:IF INITIAL-VALUE-P
INITIAL-VALUE
(LISP:AREF FLATTENED-ARRAY 0)))
(INDEX (LISP:IF INITIAL-VALUE-P
0
1)
(LISP:1+ INDEX)))
((EQ INDEX SIZE)
ACCUMULATOR)
(SETQ ACCUMULATOR (LISP:FUNCALL REDUCTION-FN ACCUMULATOR
(LISP:AREF FLATTENED-ARRAY INDEX))))]))]))
(LISP:DEFUN EVALUATE-POLYNOMIAL (X COEFFICIENTS)
(LISP:IF (NOT (LISP:ARRAYP COEFFICIENTS))
(LISP:ERROR "Not an array: ~S" COEFFICIENTS)
(LISP:IF (EQ (LISP:ARRAY-ELEMENT-TYPE COEFFICIENTS)
'LISP:SINGLE-FLOAT)
(%%POLY-EVAL (FLOAT X)
(%%GET-FLOAT-ARRAY-BASE COEFFICIENTS)
(LISP:1- (LISP:ARRAY-TOTAL-SIZE COEFFICIENTS)))
(LISP:DO ((FLATTENED-ARRAY (FLATTEN-ARG COEFFICIENTS))
(INDEX 1 (LISP:1+ INDEX))
(SIZE (LISP:ARRAY-TOTAL-SIZE COEFFICIENTS))
(PRODUCT (LISP:AREF COEFFICIENTS 0)))
((EQ INDEX SIZE)
PRODUCT)
(SETQ PRODUCT (+ (LISP:* X PRODUCT)
(LISP:AREF COEFFICIENTS INDEX)))))))
(LISP:DEFUN FIND-ARRAY-ELEMENT-INDEX (ELEMENT ARRAY)
(LISP:IF (NOT (LISP:ARRAYP ARRAY))
(LISP:ERROR "Not an array: ~S" ARRAY)
(LISP:IF (EQ (LISP:ARRAY-ELEMENT-TYPE ARRAY)
'LISP:SINGLE-FLOAT)
(LISP:DO ((BASE (%%GET-FLOAT-ARRAY-BASE ARRAY)
(\ADDBASE BASE 2))
(INDEX 0 (LISP:1+ INDEX))
(F-ELEMENT (FLOAT ELEMENT))
(SIZE (LISP:ARRAY-TOTAL-SIZE ARRAY)))
((EQ INDEX SIZE)
NIL)
(DECLARE (TYPE FLOAT F-ELEMENT))
(LISP:IF (UFEQP F-ELEMENT (\GETBASEFLOATP BASE 0))
(RETURN INDEX)))
(LISP:DO ((FLATTENED-ARRAY (FLATTEN-ARG ARRAY))
(INDEX 0 (LISP:1+ INDEX))
(SIZE (LISP:ARRAY-TOTAL-SIZE ARRAY)))
((EQ INDEX SIZE)
NIL)
(LISP:IF (EQL ELEMENT (LISP:AREF FLATTENED-ARRAY INDEX))
(RETURN INDEX))))))
(LISP:DEFUN FLATTEN-ARG (ARG)
(LISP:IF (OR (NOT (LISP:ARRAYP ARG))
(EQ 1 (LISP:ARRAY-RANK ARG)))
ARG
(LISP:MAKE-ARRAY (LISP:ARRAY-TOTAL-SIZE ARG)
:ELEMENT-TYPE
(LISP:ARRAY-ELEMENT-TYPE ARG)
:DISPLACED-TO ARG)))
(LISP:DEFUN MAX-ABS (X Y)
(LISP:IF (> (ABS X)
(ABS Y))
X
Y))
(LISP:DEFUN MIN-ABS (X Y)
(LISP:IF (< (ABS X)
(ABS Y))
X
Y))
(LISP:DEFUN %%MAP-FLOAT-ARRAY-ABS (RESULT ARRAY)
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(ARRAY-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY)
(\ADDBASE ARRAY-BASE 2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE)
RESULT)
(\PUTBASEFLOATP RESULT-BASE 0 (UFABS (\GETBASEFLOATP ARRAY-BASE 0)))))
(LISP:DEFUN %%MAP-FLOAT-ARRAY-FLOAT (RESULT ARRAY)
(LET ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT)))
(LISP:IF (EQUAL (LISP:ARRAY-ELEMENT-TYPE ARRAY)
'(LISP:UNSIGNED-BYTE 16))
(%%BLKSMALLP2FLOAT (%%GET-FLOAT-ARRAY-BASE ARRAY)
(%%GET-FLOAT-ARRAY-BASE RESULT)
SIZE)
(LISP:DO ((RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE))
(\PUTBASEFLOATP RESULT-BASE 0 (FLOAT (LISP:AREF ARRAY INDEX)))))
RESULT))
(LISP:DEFUN %%MAP-FLOAT-ARRAY-MINUS (RESULT ARRAY-1 ARRAY-2)
(LISP:IF (LISP:ARRAYP ARRAY-1)
(LISP:IF (LISP:ARRAYP ARRAY-2)
(%%BLKFDIFF (%%GET-FLOAT-ARRAY-BASE ARRAY-1)
(%%GET-FLOAT-ARRAY-BASE ARRAY-2)
(%%GET-FLOAT-ARRAY-BASE RESULT)
(LISP:ARRAY-TOTAL-SIZE RESULT))
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(ARRAY-1-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY-1)
(\ADDBASE ARRAY-1-BASE 2))
(SCALAR (FLOAT ARRAY-2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE))
(DECLARE (TYPE FLOATP SCALAR))
(\PUTBASEFLOATP RESULT-BASE 0 (FDIFFERENCE (\GETBASEFLOATP ARRAY-1-BASE 0)
SCALAR))))
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(SCALAR (FLOAT ARRAY-1))
(ARRAY-2-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY-2)
(\ADDBASE ARRAY-2-BASE 2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE))
(DECLARE (TYPE FLOATP SCALAR))
(\PUTBASEFLOATP RESULT-BASE 0 (FDIFFERENCE SCALAR (\GETBASEFLOATP ARRAY-2-BASE 0)))))
RESULT)
(LISP:DEFUN %%MAP-FLOAT-ARRAY-NEGATE (RESULT ARRAY)
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(ARRAY-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY)
(\ADDBASE ARRAY-BASE 2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE)
RESULT)
(\PUTBASEFLOATP RESULT-BASE 0 (UFMINUS (\GETBASEFLOATP ARRAY-BASE 0)))))
(LISP:DEFUN %%MAP-FLOAT-ARRAY-PLUS (RESULT ARRAY-1 ARRAY-2)
(LISP:IF (NOT (LISP:ARRAYP ARRAY-1))
(LISP:ROTATEF ARRAY-1 ARRAY-2)) (* ; "addition is commutative")
(LISP:IF (LISP:ARRAYP ARRAY-2)
(%%BLKFPLUS (%%GET-FLOAT-ARRAY-BASE ARRAY-1)
(%%GET-FLOAT-ARRAY-BASE ARRAY-2)
(%%GET-FLOAT-ARRAY-BASE RESULT)
(LISP:ARRAY-TOTAL-SIZE RESULT))
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(ARRAY-1-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY-1)
(\ADDBASE ARRAY-1-BASE 2))
(SCALAR (FLOAT ARRAY-2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE))
(DECLARE (TYPE FLOATP SCALAR))
(\PUTBASEFLOATP RESULT-BASE 0 (FPLUS (\GETBASEFLOATP ARRAY-1-BASE 0)
SCALAR))))
RESULT)
(LISP:DEFUN %%MAP-FLOAT-ARRAY-QUOTIENT (RESULT ARRAY-1 ARRAY-2)
(LISP:IF (LISP:ARRAYP ARRAY-1)
(LISP:IF (LISP:ARRAYP ARRAY-2)
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(ARRAY-1-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY-1)
(\ADDBASE ARRAY-1-BASE 2))
(ARRAY-2-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY-2)
(\ADDBASE ARRAY-1-BASE 2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE))
(\PUTBASEFLOATP RESULT-BASE 0 (FQUOTIENT (\GETBASEFLOATP ARRAY-1-BASE 0)
(\GETBASEFLOATP ARRAY-2-BASE 0))))
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(ARRAY-1-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY-1)
(\ADDBASE ARRAY-1-BASE 2))
(SCALAR (FLOAT ARRAY-2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE))
(DECLARE (TYPE FLOATP SCALAR))
(\PUTBASEFLOATP RESULT-BASE 0 (FQUOTIENT (\GETBASEFLOATP ARRAY-1-BASE 0)
SCALAR))))
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(SCALAR (FLOAT ARRAY-1))
(ARRAY-2-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY-2)
(\ADDBASE ARRAY-2-BASE 2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE))
(DECLARE (TYPE FLOATP SCALAR))
(\PUTBASEFLOATP RESULT-BASE 0 (FQUOTIENT SCALAR (\GETBASEFLOATP ARRAY-2-BASE 0)))))
RESULT)
(LISP:DEFUN %%MAP-FLOAT-ARRAY-TIMES (RESULT ARRAY-1 ARRAY-2)
(LISP:IF (NOT (LISP:ARRAYP ARRAY-1))
(LISP:ROTATEF ARRAY-1 ARRAY-2)) (* ; "Multiplication is commutative")
(LISP:IF (LISP:ARRAYP ARRAY-2)
(%%BLKFTIMES (%%GET-FLOAT-ARRAY-BASE ARRAY-1)
(%%GET-FLOAT-ARRAY-BASE ARRAY-2)
(%%GET-FLOAT-ARRAY-BASE RESULT)
(LISP:ARRAY-TOTAL-SIZE RESULT))
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(RESULT-BASE (%%GET-FLOAT-ARRAY-BASE RESULT)
(\ADDBASE RESULT-BASE 2))
(ARRAY-1-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY-1)
(\ADDBASE ARRAY-1-BASE 2))
(SCALAR (FLOAT ARRAY-2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE))
(DECLARE (TYPE FLOATP SCALAR))
(\PUTBASEFLOATP RESULT-BASE 0 (FTIMES (\GETBASEFLOATP ARRAY-1-BASE 0)
SCALAR))))
RESULT)
(LISP:DEFUN %%MAP-FLOAT-ARRAY-TRUNCATE (RESULT ARRAY)
(LISP:DO ((SIZE (LISP:ARRAY-TOTAL-SIZE RESULT))
(ARRAY-BASE (%%GET-FLOAT-ARRAY-BASE ARRAY)
(\ADDBASE ARRAY-BASE 2))
(INDEX 0 (LISP:1+ INDEX)))
((EQ INDEX SIZE)
RESULT)
(LISP:SETF (LISP:AREF RESULT INDEX)
(UFIX (\GETBASEFLOATP ARRAY-BASE 0)))))
(LISP:DEFUN %%REDUCE-FLOAT-ARRAY-MAX (ARRAY INITIAL-VALUE)
(LET [(RESULT (LISP:AREF ARRAY (%%BLKFMAX (%%GET-FLOAT-ARRAY-BASE ARRAY)
0
(LISP:ARRAY-TOTAL-SIZE ARRAY]
(LISP:IF INITIAL-VALUE
(MAX INITIAL-VALUE RESULT)
RESULT)))
(LISP:DEFUN %%REDUCE-FLOAT-ARRAY-MAX-ABS (ARRAY INITIAL-VALUE)
(LET [(RESULT (LISP:AREF ARRAY (%%BLKFABSMAX (%%GET-FLOAT-ARRAY-BASE ARRAY)
0
(LISP:ARRAY-TOTAL-SIZE ARRAY]
(LISP:IF INITIAL-VALUE
(MAX-ABS INITIAL-VALUE RESULT)
RESULT)))
(LISP:DEFUN %%REDUCE-FLOAT-ARRAY-MIN (ARRAY INITIAL-VALUE)
(LET [(RESULT (LISP:AREF ARRAY (%%BLKFMIN (%%GET-FLOAT-ARRAY-BASE ARRAY)
0
(LISP:ARRAY-TOTAL-SIZE ARRAY]
(LISP:IF INITIAL-VALUE
(MIN INITIAL-VALUE RESULT)
RESULT)))
(LISP:DEFUN %%REDUCE-FLOAT-ARRAY-MIN-ABS (ARRAY INITIAL-VALUE)
(LET [(RESULT (LISP:AREF ARRAY (%%BLKFABSMIN (%%GET-FLOAT-ARRAY-BASE ARRAY)
0
(LISP:ARRAY-TOTAL-SIZE ARRAY]
(LISP:IF INITIAL-VALUE
(MIN-ABS INITIAL-VALUE RESULT)
RESULT)))
(LISP:DEFUN %%REDUCE-FLOAT-ARRAY-PLUS (ARRAY INITIAL-VALUE)
(LET [(RESULT (%%POLY-EVAL 1.0 (%%GET-FLOAT-ARRAY-BASE ARRAY)
(LISP:1- (LISP:ARRAY-TOTAL-SIZE ARRAY]
(LISP:IF INITIAL-VALUE
(+ INITIAL-VALUE RESULT)
RESULT)))
(LISP:DEFUN %%REDUCE-FLOAT-ARRAY-TIMES (ARRAY INITIAL-VALUE)
(LET ((TOTAL 1.0))
(DECLARE (TYPE FLOAT TOTAL))
(LISP:DO ((I 0 (LISP:1+ I))
(BASE (%%GET-FLOAT-ARRAY-BASE ARRAY)
(\ADDBASE BASE 2))
(SIZE (LISP:ARRAY-TOTAL-SIZE ARRAY)))
((EQ I SIZE)
TOTAL)
(SETQ TOTAL (LISP:* TOTAL (\GETBASEFLOATP BASE 0))))
(LISP:IF INITIAL-VALUE
(LISP:* INITIAL-VALUE TOTAL)
TOTAL)))
(* ;; "For convenience")
(PUTPROPS CMLFLOATARRAY FILETYPE LISP:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA MAP-ARRAY)
)
(PUTPROPS CMLFLOATARRAY COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1990 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (1897 6534 (MAP-ARRAY 1907 . 6532)))))
STOP

BIN
CLTL2/CMLFLOATARRAY.LCOM Normal file

Binary file not shown.

1997
CLTL2/CMLFORMAT Normal file

File diff suppressed because it is too large Load Diff

BIN
CLTL2/CMLFORMAT.LCOM Normal file

Binary file not shown.

361
CLTL2/CMLHASH Normal file
View File

@@ -0,0 +1,361 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "LISP")
(IL:FILECREATED " 2-Apr-92 13:37:38" IL:|{DSK}<usr>local>lde>lispcore>sources>CMLHASH.;6| 16577
IL:|changes| IL:|to:| (IL:FUNCTIONS CL:WITH-HASH-TABLE-ITERATOR)
(IL:VARS IL:CMLHASHCOMS)
IL:|previous| IL:|date:| " 1-Apr-92 13:16:01" IL:|{DSK}<usr>local>lde>lispcore>sources>CMLHASH.;4|
)
; Copyright (c) 1985, 1986, 1987, 1989, 1990, 1992 by Venue & Xerox Corporation. All rights reserved.
(IL:PRETTYCOMPRINT IL:CMLHASHCOMS)
(IL:RPAQQ IL:CMLHASHCOMS (
(IL:* IL:|;;| "External interface")
(IL:FUNCTIONS MAKE-HASH-TABLE GETHASH MAPHASH HASH-TABLE-COUNT
HASH-TABLE-P SXHASH)
(XCL:OPTIMIZERS GETHASH HASH-TABLE-COUNT HASH-TABLE-P)
(IL:SETFS GETHASH)
(IL:FUNCTIONS CL:HASH-TABLE-REHASH-SIZE CL:HASH-TABLE-REHASH-THRESHOLD
CL:HASH-TABLE-SIZE CL:HASH-TABLE-TEST
CL:WITH-HASH-TABLE-ITERATOR)
(XCL:OPTIMIZERS CL:HASH-TABLE-REHASH-SIZE CL:HASH-TABLE-SIZE
CL:HASH-TABLE-TEST)
(IL:* IL:|;;| "Internal interface")
(IL:FUNCTIONS EQLHASHBITSFN SXHASH-PATHNAME)
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE (IL:VARIABLES SXHASH-MAX)
(IL:FUNCTIONS SXHASH-LIST SXHASH-STRING SXHASH-BIT-VECTOR
SXHASH-ROT))
(IL:* IL:|;;| "UFN for the SXHASH opcode (a MISCN)")
(IL:FNS SXHASH-UFN EQLHASHBITSFN-UFN %SXHASH)
(IL:FUNCTIONS CL::%SXHASH-EQUALP SXHASH-EQUALP-STRING)
(XCL:OPTIMIZERS SXHASH EQLHASHBITSFN)
(XCL:OPTIMIZERS IL:STRINGHASHBITS IL:STRING-EQUAL-HASHBITS)
(IL:PROP (IL:FILETYPE IL:MAKEFILE-ENVIRONMENT)
IL:CMLHASH)))
(IL:* IL:|;;| "External interface")
(DEFUN MAKE-HASH-TABLE (&KEY (TEST 'EQL)
(SIZE 65)
REHASH-SIZE REHASH-THRESHOLD)
(IL:* IL:\; "Edited 23-Mar-92 16:27 by jrb:")
(IL:* IL:|;;| "Creates and returns a hash table. See manual for details.")
(IF (NOT (SYMBOLP TEST))
(COND
((%EQCODEP TEST 'EQ)
(SETQ TEST 'EQ))
((%EQCODEP TEST 'EQL)
(SETQ TEST 'EQL))
((%EQCODEP TEST 'EQUAL)
(SETQ TEST 'EQUAL))
((%EQCODEP TEST 'EQUALP)
(SETQ TEST 'EQUALP))))
(ECASE TEST
(EQ (IL:HASHARRAY SIZE REHASH-SIZE))
(EQL (IL:HASHARRAY SIZE REHASH-SIZE 'EQLHASHBITSFN 'EQL))
(EQUAL (IL:HASHARRAY SIZE REHASH-SIZE 'SXHASH 'EQUAL))
(EQUALP
(IL:* IL:|;;| "NOTE: CL::%SXHASH-EQUALP has no microcode/C support and is hence SLOW")
(IL:HASHARRAY SIZE REHASH-SIZE 'CL::%SXHASH-EQUALP 'EQUALP))))
(DEFUN GETHASH (KEY HASHTABLE &OPTIONAL DEFAULT)
(IL:GETHASH KEY HASHTABLE DEFAULT T))
(DEFUN MAPHASH (FN HASH-TABLE)
"Call function with each key/value pair in the hash-table"
(IL:MAPHASH HASH-TABLE #'(LAMBDA (VALUE KEY)
(FUNCALL FN KEY VALUE)))
NIL)
(DEFUN HASH-TABLE-COUNT (HASH-TABLE)
(IL:HARRAYPROP HASH-TABLE 'IL:NUMKEYS))
(DEFUN HASH-TABLE-P (OBJECT)
(IL:TYPENAMEP OBJECT 'IL:HARRAYP))
(DEFUN SXHASH (OBJECT)
(IL:MISCN SXHASH OBJECT))
(XCL:DEFOPTIMIZER GETHASH (KEY HASHTABLE &OPTIONAL DEFAULT XCL:&CONTEXT CONTEXT)
(IF (EQ 1 (COMPILER:CONTEXT-VALUES-USED CONTEXT))
(IF DEFAULT
`(IL:GETHASH ,KEY ,HASHTABLE ,DEFAULT)
`(IL:GETHASH ,KEY ,HASHTABLE))
'COMPILER:PASS))
(XCL:DEFOPTIMIZER HASH-TABLE-COUNT (HASH-TABLE)
`(IL:HARRAYPROP ,HASH-TABLE 'IL:NUMKEYS))
(XCL:DEFOPTIMIZER HASH-TABLE-P (OBJECT)
`(IL:TYPENAMEP ,OBJECT 'IL:HARRAYP))
(DEFSETF GETHASH PUTHASH)
(DEFUN CL:HASH-TABLE-REHASH-SIZE (HASH-TABLE)
(IL:HARRAYPROP HASH-TABLE 'IL:OVERFLOW))
(DEFUN CL:HASH-TABLE-REHASH-THRESHOLD (HASH-TABLE)
1)
(DEFUN CL:HASH-TABLE-SIZE (HASH-TABLE)
(IL:HARRAYSIZE HASH-TABLE))
(DEFUN CL:HASH-TABLE-TEST (HASH-TABLE) (IL:* IL:\; "Edited 22-Mar-92 20:47 by jrb:")
(LET ((CL::TEST (IL:HARRAYPROP HASH-TABLE 'IL:EQUIVFN)))
(CASE CL::TEST
((NIL) 'EQ)
(T CL::TEST))))
(DEFMACRO CL:WITH-HASH-TABLE-ITERATOR ((CL::MNAME HASH-TABLE)
&REST CL::FORMS)
(LET ((IL:HA (GENSYM))
(IL:LASTSLOT (GENSYM))
(IL:NULLVALUE (GENSYM))
(IL:SLOT (GENSYM))
(IL:V (GENSYM)))
(IL:* IL:|;;| "The code below is actually this stuff, macroexpanded to remove references to the IL:HARRAYP record and all the grossly internal stuff in it, which aren't normally in the sysout")
(IL:* IL:|;;| "`(LET* ((,IL:HA (IL:\\\\DTEST ,HASH-TABLE 'IL:HARRAYP)) (,IL:LASTSLOT (IL:|fetch| (IL:HASHSLOT IL:NEXTSLOT) IL:|of| (IL:\\\\HASHSLOT (IL:|fetch| IL:HARRAYPBASE IL:|of| ,IL:HA) (IL:|fetch| (IL:HARRAYP IL:LASTINDEX) IL:|of| ,IL:HA)))) (,IL:NULLVALUE IL:\\\\HASH.NULL.VALUE) ,IL:SLOT ,IL:V) (FLET ((,MNAME ( (IL:|until| (EQ (IL:SETQ ,IL:SLOT (IF ,IL:SLOT (IL:|fetch| (IL:HASHSLOT IL:NEXTSLOT) IL:|of| ,IL:SLOT) (IL:|fetch| IL:HARRAYPBASE IL:|of| ,IL:HA))) ,IL:LASTSLOT) IL:|when| (IL:SETQ ,IL:V (IL:|fetch| (IL:HASHSLOT IL:VALUE) IL:|of| ,IL:SLOT)) IL:|do| (RETURN (VALUES T (IL:|fetch| (IL:HASHSLOT IL:KEY) IL:|of| ,IL:SLOT) (AND (IL:NEQ ,IL:V ,IL:NULLVALUE) ,IL:V))) IL:|finally| (RETURN NIL)))) ,@FORMS))")
`(LET* ((,IL:HA (IL:\\DTEST ,HASH-TABLE 'IL:HARRAYP))
(,IL:LASTSLOT (IL:\\ADDBASE (IL:\\ADDBASE (IL:FETCHFIELD '(IL:HARRAYP 2 IL:POINTER)
,IL:HA)
(IL:LLSH (IL:FETCHFIELD '(IL:HARRAYP 1
(IL:BITS . 15))
,IL:HA)
2))
4))
(,IL:NULLVALUE IL:\\HASH.NULL.VALUE)
,IL:SLOT
,IL:V)
(FLET ((,CL::MNAME NIL (IL:|until| (EQ (IL:SETQ ,IL:SLOT
(IF ,IL:SLOT
(IL:\\ADDBASE ,IL:SLOT 4)
(IL:FETCHFIELD '(IL:HARRAYP 2
IL:POINTER)
,IL:HA)))
,IL:LASTSLOT)
IL:|when| (IL:SETQ ,IL:V (IL:FETCHFIELD
'(NIL 2 IL:POINTER)
,IL:SLOT))
IL:|do| (RETURN (VALUES T (IL:FETCHFIELD
'(NIL 0 IL:POINTER)
,IL:SLOT)
(AND (IL:NEQ ,IL:V ,IL:NULLVALUE)
,IL:V)))
IL:|finally| (RETURN NIL))))
,@CL::FORMS))))
(XCL:DEFOPTIMIZER CL:HASH-TABLE-REHASH-SIZE (HASH-TABLE)
`(IL:HARRAYPROP ,HASH-TABLE 'IL:OVERFLOW))
(XCL:DEFOPTIMIZER CL:HASH-TABLE-SIZE (HASH-TABLE)
`(IL:HARRAYSIZE ,HASH-TABLE))
(XCL:DEFOPTIMIZER CL:HASH-TABLE-TEST (HASH-TABLE)
`(LET ((CL::TEST (IL:HARRAYPROP ,HASH-TABLE 'IL:EQUIVFN)))
(CASE CL::TEST
((NIL) 'EQ)
(T CL::TEST))))
(IL:* IL:|;;| "Internal interface")
(DEFUN EQLHASHBITSFN (OBJ)
(IL:MISCN EQLHASHBITSFN OBJ))
(DEFUN SXHASH-PATHNAME (PATHNAME)
(LET ((HASH (SXHASH-ROT (LOGXOR (%SXHASH (IL:%PATHNAME-HOST PATHNAME))
(%SXHASH (IL:%PATHNAME-DEVICE PATHNAME))))))
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-TYPE PATHNAME)))))
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-VERSION PATHNAME)))))
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-DIRECTORY PATHNAME)))))
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (IL:%PATHNAME-NAME PATHNAME)))))))
(IL:DECLARE\: IL:DONTCOPY IL:DOEVAL@COMPILE
(DEFCONSTANT SXHASH-MAX 13)
(DEFMACRO SXHASH-LIST (LIST)
`(DO ((LIST ,LIST (CDR LIST))
(INDEX 0 (1+ INDEX))
(HASH 0))
((OR (NOT (CONSP LIST))
(EQ INDEX SXHASH-MAX))
HASH)
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (%SXHASH (CAR LIST)))))))
(DEFMACRO SXHASH-STRING (STRING) (IL:* IL:\;
 "Returns hash value for a general string.")
`(DO ((I 0 (1+ I))
(LENGTH (MIN (LENGTH ,STRING)
SXHASH-MAX))
(HASH 0))
((EQ I LENGTH)
HASH)
(IL:* IL:|;;| "the spice code had a fairly general \"rotate X within integerlength of most-positive-fixnum bits, but (a) it was slow and (b) it was buggy anyway, since it assumed that most-positive-fixnum was 1 less than a power of two.")
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (CHAR-INT (AREF ,STRING I)))))))
(DEFMACRO SXHASH-BIT-VECTOR (BIT-VECTOR)
`(DO ((I 0 (1+ I))
(LENGTH (MIN (LENGTH ,BIT-VECTOR)
16))
(HASH 0))
((EQ I LENGTH)
HASH)
(SETQ HASH (+ (ASH HASH 1)
(AREF ,BIT-VECTOR I)))))
(DEFMACRO SXHASH-ROT (X)
`(LET ((X ,X))
(DPB X (BYTE 9 7)
(LDB (BYTE 7 9)
X))))
)
(IL:* IL:|;;| "UFN for the SXHASH opcode (a MISCN)")
(IL:DEFINEQ
(SXHASH-UFN
(IL:LAMBDA (IL:INDEX IL:ARGCOUNT IL:ARG-PTR) (IL:* IL:\; "Edited 23-Feb-89 19:45 by jds")
(IL:* IL:|;;|
 "This is the UFN for the CL:SXHASH MISCN sub-opcode. That MISCN is being implemented on Suns.")
(%SXHASH (IL:\\GETBASEPTR IL:ARG-PTR 0))))
(EQLHASHBITSFN-UFN
(IL:LAMBDA (IL:INDEX IL:ARGCOUNT IL:ARG-PTR) (IL:* IL:\; "Edited 23-Feb-89 18:10 by jds")
(LET ((OBJ (IL:\\GETBASEPTR IL:ARG-PTR 0)))
(TYPECASE OBJ
(CHARACTER (CHAR-INT OBJ))
(INTEGER (LOGAND OBJ 65535))
(FLOAT (LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| OBJ)
(IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| OBJ)))
(RATIO (LOGXOR (EQLHASHBITSFN (NUMERATOR OBJ))
(EQLHASHBITSFN (DENOMINATOR OBJ))))
(COMPLEX (LOGXOR (EQLHASHBITSFN (REALPART OBJ))
(EQLHASHBITSFN (IMAGPART OBJ))))
(T (IL:\\EQHASHINGBITS OBJ))))))
(%SXHASH
(IL:LAMBDA (OBJECT) (IL:* IL:\; "Edited 23-Feb-89 19:42 by jds")
(COND
((SYMBOLP OBJECT)
(IL:\\EQHASHINGBITS OBJECT))
((LISTP OBJECT)
(SXHASH-LIST OBJECT))
((NUMBERP OBJECT)
(TYPECASE OBJECT
(INTEGER (LOGAND OBJECT MOST-POSITIVE-FIXNUM))
(FLOAT (LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| OBJECT)
(IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| OBJECT)))
(RATIO (LOGXOR (%SXHASH (NUMERATOR OBJECT))
(%SXHASH (DENOMINATOR OBJECT))))
(COMPLEX (LOGXOR (%SXHASH (REALPART OBJECT))
(%SXHASH (IMAGPART OBJECT))))))
((STRINGP OBJECT)
(SXHASH-STRING OBJECT))
((BIT-VECTOR-P OBJECT)
(SXHASH-BIT-VECTOR OBJECT))
((PATHNAMEP OBJECT)
(SXHASH-PATHNAME OBJECT))
(T (IL:\\EQHASHINGBITS OBJECT)))))
)
(DEFUN CL::%SXHASH-EQUALP (CL::OBJECT) (IL:* IL:\; "Edited 23-Mar-92 16:17 by jrb:")
(COND
((SYMBOLP CL::OBJECT)
(IL:\\EQHASHINGBITS CL::OBJECT))
((LISTP CL::OBJECT)
(SXHASH-LIST CL::OBJECT))
((NUMBERP CL::OBJECT)
(IL:* IL:|;;| "Hacks for numbers for hash key purposes:")
(IL:* IL:|;;| "FLOATs that can be coerced to integer are")
(IL:* IL:|;;| "RATIOs are coerecd to floats (it would be better to coerce non-integral FLOATs to RATIOs, but a real pain in the ass; this is probably good enough...)")
(TYPECASE CL::OBJECT
(INTEGER (LOGAND CL::OBJECT MOST-POSITIVE-FIXNUM))
(FLOAT (IF (= CL::OBJECT (FLOOR CL::OBJECT))
(MULTIPLE-VALUE-BIND (CL::MANT EXP CL::SIGN)
(INTEGER-DECODE-FLOAT CL::OBJECT)
(SETQ CL::OBJECT (ASH CL::MANT EXP))
(WHEN (MINUSP CL::SIGN)
(SETQ CL::OBJECT (IL:IMINUS CL::OBJECT)))
(LOGAND CL::OBJECT MOST-POSITIVE-FIXNUM))
(LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| CL::OBJECT)
(IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| CL::OBJECT))))
(RATIO (LET ((CL::F (COERCE CL::OBJECT 'FLOAT)))
(LOGXOR (IL:|fetch| (IL:FLOATP IL:HIWORD) IL:|of| CL::F)
(IL:|fetch| (IL:FLOATP IL:LOWORD) IL:|of| CL::F))))
(COMPLEX (LOGXOR (%SXHASH (REALPART CL::OBJECT))
(%SXHASH (IMAGPART CL::OBJECT))))))
((STRINGP CL::OBJECT)
(SXHASH-EQUALP-STRING CL::OBJECT))
((BIT-VECTOR-P CL::OBJECT)
(SXHASH-BIT-VECTOR CL::OBJECT))
((PATHNAMEP CL::OBJECT)
(SXHASH-PATHNAME CL::OBJECT))
(T (IL:\\EQHASHINGBITS CL::OBJECT))))
(DEFMACRO SXHASH-EQUALP-STRING (STRING)
(IL:* IL:|;;| "Returns EQUALP hash value for a string")
`(DO ((I 0 (1+ I))
(LENGTH (MIN (LENGTH ,STRING)
SXHASH-MAX))
(HASH 0))
((EQ I LENGTH)
HASH)
(IL:* IL:|;;| "the spice code had a fairly general \"rotate X within integerlength of most-positive-fixnum bits, but (a) it was slow and (b) it was buggy anyway, since it assumed that most-positive-fixnum was 1 less than a power of two.")
(SETQ HASH (SXHASH-ROT (LOGXOR HASH (IL:%CHAR-UPCASE-CODE (CHAR-CODE (AREF ,STRING I))))))))
(XCL:DEFOPTIMIZER SXHASH (OBJECT)
`(IL:MISCN SXHASH ,OBJECT))
(XCL:DEFOPTIMIZER EQLHASHBITSFN (OBJECT)
`(IL:MISCN EQLHASHBITSFN ,OBJECT))
(XCL:DEFOPTIMIZER IL:STRINGHASHBITS (STRING)
`(IL:MISCN IL:STRINGHASHBITS ,STRING))
(XCL:DEFOPTIMIZER IL:STRING-EQUAL-HASHBITS (STRING)
`(IL:MISCN IL:STRING-EQUAL-HASHBITS ,STRING))
(IL:PUTPROPS IL:CMLHASH IL:FILETYPE COMPILE-FILE)
(IL:PUTPROPS IL:CMLHASH IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "LISP"))
(IL:PUTPROPS IL:CMLHASH IL:COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1989 1990 1992))
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL (11187 13240 (SXHASH-UFN 11200 . 11499) (EQLHASHBITSFN-UFN 11501 . 12240) (%SXHASH
12242 . 13238)))))
IL:STOP

BIN
CLTL2/CMLHASH.LCOM Normal file

Binary file not shown.

128
CLTL2/CMLLOAD Normal file
View File

@@ -0,0 +1,128 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10)
(FILECREATED "18-Oct-93 14:18:07" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLLOAD.;2" 6602
|previous| |date:| "15-Dec-92 21:27:17" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLLOAD.;1")
; Copyright (c) 1986, 1987, 1988, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
(PRETTYCOMPRINT CMLLOADCOMS)
(RPAQQ CMLLOADCOMS ((VARIABLES LISP:*LOAD-PRINT* *LOAD-VERBOSE* LISP:*LOAD-PATHNAME*
LISP:*LOAD-TRUENAME* XCL::*DEFAULT-SOURCE-IO-PACKAGE*)
(FUNCTIONS LISP::DEFAULT-IO-PACKAGE LISP:LOAD LISP::\\OPENSTREAM-WITH-DEFAULT
)
(FNS \\CML-LOAD)
(PROP FILETYPE CMLLOAD)))
(LISP:DEFVAR LISP:*LOAD-PRINT* NIL
"Default value for :PRINT in LOAD")
(LISP:DEFVAR *LOAD-VERBOSE* T
"Default for VERBOSE keyword to LOAD.")
(LISP:DEFVAR LISP:*LOAD-PATHNAME* NIL
"LOAD binds this to the pathname of the file being loaded")
(LISP:DEFVAR LISP:*LOAD-TRUENAME* NIL
"LOAD binds this to the truename of the file being loaded")
(LISP:DEFVAR XCL::*DEFAULT-SOURCE-IO-PACKAGE* (LISP:FIND-PACKAGE "CL-USER"))
(LISP:DEFUN LISP::DEFAULT-IO-PACKAGE (LISP::P) (* \; "Edited 15-Dec-92 16:06 by jrb:")
(* |;;| "P is the argument given to the :PACKAGE keyword for any of the functions that get their package defaulted (CL:LOAD, CL:COMPILE-FILE). The intent is that if P is supplied it is an absolute override; if not we fall back on CLtL2 if XCL:*CLTL2-PEDANTIC* is on; if that doesn't work we try XCL::*DEFAULT-SOURCE-IO-PACKAGE* and we punt if THAT loses.")
(COND
((NULL LISP::P)
(COND
(*CLTL2-PEDANTIC* *PACKAGE*)
((LISP:FIND-PACKAGE XCL::*DEFAULT-SOURCE-IO-PACKAGE*))
(T (LISP:CERROR "Use current *PACKAGE*"
"The value of XCL::*DEFAULT-SOURCE-IO-PACKAGE*, ~s, does not name a package"
XCL::*DEFAULT-SOURCE-IO-PACKAGE*)
*PACKAGE*)))
((LISP:FIND-PACKAGE LISP::P))
(T (LISP:CERROR "Use current *PACKAGE*" "~s does not name a package" LISP::P)
*PACKAGE*)))
(LISP:DEFUN LISP:LOAD (FILENAME &KEY ((:VERBOSE *LOAD-VERBOSE*)
*LOAD-VERBOSE*)
((:PRINT LISP:*LOAD-PRINT*)
LISP:*LOAD-PRINT*)
(IF-DOES-NOT-EXIST :ERROR)
(LOADFLG NIL)
(PACKAGE NIL)) (* \; "Edited 15-Dec-92 16:06 by jrb:")
"Loads the file named by Filename into the Lisp environment."
(LET* ((LISP:*LOAD-PATHNAME* (LISP:IF (STREAMP FILENAME)
(IGNORE-ERRORS (PATHNAME FILENAME))
(* |;;| "If the current connected directory is \"{DSK}<tmp>\", (CL:LOAD \"{CORE}FOO\") should load \"{CORE}FOO\" rather than \"{CORE}<tmp>FOO\". Thus we call MERGE-PATHNAMES iff HOST field is not specified in FILENAME. ")
(LISP:IF (LISP:IF (LISP:PATHNAMEP FILENAME)
(LISP:PATHNAME-HOST FILENAME)
(FILENAMEFIELD FILENAME 'HOST))
(PATHNAME FILENAME)
(LISP:MERGE-PATHNAMES (PATHNAME FILENAME)
*DEFAULT-PATHNAME-DEFAULTS*))))
(LISP:*LOAD-TRUENAME* (AND LISP:*LOAD-PATHNAME* (LISP:TRUENAME LISP:*LOAD-PATHNAME*)))
(STREAM (OR (STREAMP FILENAME)
(|if| (NULL IF-DOES-NOT-EXIST)
|then| (CONDITION-CASE (OPENSTREAM LISP:*LOAD-PATHNAME* 'INPUT
'OLD LOADPARAMETERS)
(XCL:FILE-NOT-FOUND NIL
(* |;;|
 "Spec says return NIL if file not found and IF-DOES-NOT-EXIST is NIL")
(LISP:RETURN-FROM LISP:LOAD NIL)))
|else| (OPENSTREAM LISP:*LOAD-PATHNAME* 'INPUT 'OLD LOADPARAMETERS)))))
(LISP:UNWIND-PROTECT
(\\LOAD-STREAM STREAM (LISP:INTERN (STRING LOADFLG)
(LISP:FIND-PACKAGE "INTERLISP"))
LISP:*LOAD-PRINT*
(AND *LOAD-VERBOSE* *TERMINAL-IO*)
PACKAGE)
(LISP:CLOSE STREAM))))
(LISP:DEFUN LISP::\\OPENSTREAM-WITH-DEFAULT (LISP::FILENAME)
(DECLARE (LISP:SPECIAL LOADPARAMATERS))
(* |;;| "If the current connected directory is \"{DSK}<tmp>\", (CL:LOAD \"{CORE}FOO\") should load \"{CORE}FOO\" rather than \"{CORE}<tmp>FOO\". Thus we call MERGE-PATHNAMES iff HOST field is not specified in FILENAME. ")
(LISP:IF (NULL (LISP:IF (LISP:PATHNAMEP LISP::FILENAME)
(LISP:PATHNAME-HOST LISP::FILENAME)
(FILENAMEFIELD LISP::FILENAME 'HOST)))
(OPENSTREAM (LISP:MERGE-PATHNAMES (PATHNAME LISP::FILENAME)
*DEFAULT-PATHNAME-DEFAULTS*)
'INPUT
'OLD LOADPARAMETERS)
(OPENSTREAM LISP::FILENAME 'INPUT 'OLD LOADPARAMETERS)))
(DEFINEQ
(\\CML-LOAD
(LAMBDA (STREAM PRINTFLG LOAD-VERBOSE-STREAM PACKAGE) (* \; "Edited 1-Aug-91 10:57 by jrb:")
(* |;;| "Loads a \"Common Lisp file\" a la CL:LOAD. Currently only do this if file starts with semi-colon. PACKAGE overrides the default (USER).")
(LET ((*PACKAGE* PACKAGE)
(*READTABLE* CMLRDTBL)
(FULL (FULLNAME STREAM))
(EOF-MARK "EOF")
EXPR)
(|until| (EQ EOF-MARK (SETQ EXPR (LISP:READ STREAM NIL EOF-MARK)))
|do| (COND
(PRINTFLG (PRINT (LISP:EVAL EXPR)
T))
(T (LISP:EVAL EXPR))))
(|if| LOAD-VERBOSE-STREAM
|then| (LISP:FORMAT LOAD-VERBOSE-STREAM "; Finished loading ~A, ~D bytes read~&"
FULL (GETFILEPTR STREAM)))
FULL)))
)
(PUTPROPS CMLLOAD FILETYPE LISP:COMPILE-FILE)
(PUTPROPS CMLLOAD COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1990 1991 1992 1993))
(DECLARE\: DONTCOPY
(FILEMAP (NIL (5526 6430 (\\CML-LOAD 5536 . 6428)))))
STOP

BIN
CLTL2/CMLLOAD.LCOM Normal file

Binary file not shown.

253
CLTL2/CMLMACROS Normal file
View File

@@ -0,0 +1,253 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 14:19:04" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLMACROS.;2" 12700
previous date%: "12-Jan-92 12:41:41" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLMACROS.;1")
(* ; "
Copyright (c) 1986, 1987, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLMACROSCOMS)
(RPAQQ CMLMACROSCOMS
[(FNS CLISPEXPANSION GLOBAL-MACRO-FUNCTION LOCAL-MACRO-FUNCTION LOCAL-SYMBOL-FUNCTION
\INTERLISP-NLAMBDA-MACRO LISP:MACRO-FUNCTION LISP:MACROEXPAND LISP:MACROEXPAND-1
SETF-MACRO-FUNCTION)
(APPENDVARS (COMPILERMACROPROPS DMACRO BYTEMACRO MACRO))
(ADDVARS (GLOBALVARS COMPILERMACROPROPS))
(PROP MACRO *)
(FUNCTIONS LISP:MACROLET)
(SETFS LISP:MACRO-FUNCTION)
(PROP FILETYPE CMLMACROS)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA)
(NLAML)
(LAMA LISP:MACROEXPAND-1
LISP:MACROEXPAND
LISP:MACRO-FUNCTION
])
(DEFINEQ
(CLISPEXPANSION
[LAMBDA (X ENV) (* ; "Edited 4-Dec-86 01:19 by lmm")
(* ;; "the macro function for all CLISP words. Expand X as a clisp macro.")
(LISP:VALUES (do (LET ((NOSPELLFLG T)
(LISPXHIST NIL)
(VARS NIL)
(COP (COPY X)))
(DECLARE (LISP:SPECIAL NOSPELLFLG VARS LISPXHIST))
(* ;
 "make a copy so dwim doesn't muck with it!")
[COND
((GETPROP (CAR X)
'CLISPWORD)
(DWIMIFY0? COP COP COP NIL NIL NIL 'VARSBOUND)
(COND
((NOT (LISP:EQUAL COP X))
(* ; "made a change")
(RETURN COP))
((SETQ COP (GETHASH COP CLISPARRAY))
(RETURN COP]
(LISP:CERROR "Try expanding again." "Can't CLISP expand expression ~S."
X)))
T])
(GLOBAL-MACRO-FUNCTION
[LAMBDA (X ENV) (* ; "Edited 22-Apr-87 19:07 by Pavel")
(LET (MD)
(COND
[(AND (TYPEP ENV 'COMPILER:ENV)
(LISP:MULTIPLE-VALUE-BIND (KIND EXPN-FN)
(COMPILER:ENV-FBOUNDP ENV X)
(AND (EQ KIND :MACRO)
EXPN-FN]
((GET X 'MACRO-FN))
((LISP:SPECIAL-FORM-P X)
NIL)
[[AND [NOT (FMEMB (ARGTYPE X)
'(0 2]
(FIND PROP IN COMPILERMACROPROPS
SUCHTHAT (AND (SETQ MD (GETPROP X PROP))
(NOT (OR (LITATOM MD)
(FMEMB (CAR MD)
'(APPLY APPLY*]
`(LAMBDA (FORM ENV)
(MACROEXPANSION FORM ',MD]
((AND (NOT (GETD X))
(GETPROP X 'CLISPWORD))
(FUNCTION CLISPEXPANSION))
((FMEMB (ARGTYPE X)
'(1 3))
(FUNCTION \INTERLISP-NLAMBDA-MACRO])
(LOCAL-MACRO-FUNCTION
[LAMBDA (X ENV) (* ; "Edited 13-Apr-87 11:16 by Pavel")
(AND ENV (LISP:TYPECASE ENV
(ENVIRONMENT (* ; "Interpreter's environments")
(LET ((FN-DEFN (LISP:GETF (ENVIRONMENT-FUNCTIONS ENV)
X)))
(AND FN-DEFN (EQ (CAR FN-DEFN)
:MACRO)
(CDR FN-DEFN))))
(COMPILER:ENV (* ; "Compiler's environments.")
(LISP:MULTIPLE-VALUE-BIND (KIND EXPN-FN)
(COMPILER:ENV-FBOUNDP ENV X :LEXICAL-ONLY T)
(AND (EQ KIND :MACRO)
EXPN-FN))))])
(LOCAL-SYMBOL-FUNCTION
[LAMBDA (X ENV) (* ; "Edited 31-Jul-87 18:06 by amd")
(AND ENV (LISP:TYPECASE ENV
(ENVIRONMENT (* ; "Interpreter's environments")
(LET ((FN-DEFN (LISP:GETF (ENVIRONMENT-FUNCTIONS ENV)
X)))
(AND FN-DEFN (EQ (CAR FN-DEFN)
:FUNCTION)
(CDR FN-DEFN))))
(COMPILER:ENV (* ; "Compiler's environments.")
(LISP:MULTIPLE-VALUE-BIND (KIND FN)
(COMPILER:ENV-FBOUNDP ENV X :LEXICAL-ONLY T)
(AND (EQ KIND :FUNCTION)
FN))))])
(\INTERLISP-NLAMBDA-MACRO
[LAMBDA (X ENV) (* lmm " 7-May-86 17:24")
`(LISP:FUNCALL (FUNCTION ,(CAR X))
,@(SELECTQ (ARGTYPE (CAR X))
(1 (MAPCAR (CDR X)
(FUNCTION KWOTE)))
(3 (LIST (KWOTE (CDR X))))
(SHOULDNT])
(LISP:MACRO-FUNCTION
[LISP:LAMBDA (LISP::X LISP::ENV) (* ; "Edited 12-Jan-92 11:45 by bane")
(AND (LISP:SYMBOLP LISP::X)
(NOT (LOCAL-SYMBOL-FUNCTION LISP::X LISP::ENV))
(OR (LOCAL-MACRO-FUNCTION LISP::X LISP::ENV)
(GLOBAL-MACRO-FUNCTION LISP::X LISP::ENV])
(LISP:MACROEXPAND
[LISP:LAMBDA (LISP::FORM &OPTIONAL LISP::ENV) (* ; "Edited 13-Feb-87 23:47 by Pavel")
(* ;;; "If FORM is a macro call, then the form is expanded until the result is not a macro. Returns as multiple values, the form after any expansion has been done and T if expansion was done, or NIL otherwise. Env is the lexical environment to expand in, which defaults to the null environment.")
(PROG (LISP::FLAG)
(LISP:MULTIPLE-VALUE-SETQ (LISP::FORM LISP::FLAG)
(LISP:MACROEXPAND-1 LISP::FORM LISP::ENV))
(LISP:UNLESS LISP::FLAG
(RETURN (LISP:VALUES LISP::FORM NIL)))
LISP:LOOP
(LISP:MULTIPLE-VALUE-SETQ (LISP::FORM LISP::FLAG)
(LISP:MACROEXPAND-1 LISP::FORM LISP::ENV))
(LISP:IF LISP::FLAG
(GO LISP:LOOP)
(RETURN (LISP:VALUES LISP::FORM T)))])
(LISP:MACROEXPAND-1
[LISP:LAMBDA (LISP::FORM &OPTIONAL LISP::ENV) (* ; "Edited 13-Feb-87 23:49 by Pavel")
(* ;;; "If form is a macro, expands it once. Returns two values, the expanded form and a T-or-NIL flag indicating whether the form was, in fact, a macro. Env is the lexical environment to expand in, which defaults to the null environment.")
(COND
[(AND (LISP:CONSP LISP::FORM)
(LISP:SYMBOLP (CAR LISP::FORM)))
(LET ((LISP::DEF (LISP:MACRO-FUNCTION (CAR LISP::FORM)
LISP::ENV)))
(COND
(LISP::DEF (LISP:IF [NOT (EQ LISP::FORM (LISP:SETQ LISP::FORM
(LISP:FUNCALL *MACROEXPAND-HOOK*
LISP::DEF LISP::FORM
LISP::ENV]
(LISP:VALUES LISP::FORM T)
(LISP:VALUES LISP::FORM NIL)))
(T (LISP:VALUES LISP::FORM NIL]
(T (LISP:VALUES LISP::FORM NIL])
(SETF-MACRO-FUNCTION
[LAMBDA (X BODY) (* ; "Edited 13-Feb-87 13:26 by Pavel")
(* ;; "the SETF function for MACRO-FUNCTION ")
(* ;; "NOTE: If you change this, be sure to change the undoable version on CMLUNDO!")
(PROG1 (LISP:SETF (GET X 'MACRO-FN)
BODY)
(AND (GETD X)
(SELECTQ (ARGTYPE X)
((1 3) (* ;
 "Leave Interlisp nlambda definition alone")
)
(PUTD X NIL))))])
)
(APPENDTOVAR COMPILERMACROPROPS DMACRO BYTEMACRO MACRO)
(ADDTOVAR GLOBALVARS COMPILERMACROPROPS)
(PUTPROPS * MACRO ((X . Y)
'X))
(DEFMACRO LISP:MACROLET (LISP::MACRODEFS &BODY LISP::BODY &ENVIRONMENT LISP::ENV)
(DECLARE (SPECVARS *BYTECOMPILER-IS-EXPANDING*))
(* ;; "This macro for the old interpreter and compiler only. The new interpreter has a special-form definition. When the new compiler is expanding, we simply return a disguised version of the form.")
[IF (AND *BYTECOMPILER-IS-EXPANDING* *BYTECOMPILER-OPTIMIZE-MACROLET*)
THEN (LET ((LISP::NEW-ENV (COMPILER::MAKE-CHILD-ENV LISP::ENV)))
(DECLARE (LISP:SPECIAL *BC-MACRO-ENVIRONMENT*))
[FOR LISP::FN IN LISP::MACRODEFS
DO (COMPILER::ENV-BIND-FUNCTION LISP::NEW-ENV (CAR LISP::FN)
:MACRO
(COMPILER::CRACK-DEFMACRO (CONS 'DEFMACRO LISP::FN]
(LISP:SETQ *BC-MACRO-ENVIRONMENT* LISP::NEW-ENV)
(CONS 'LISP:LOCALLY LISP::BODY))
ELSEIF (TYPEP LISP::ENV 'COMPILER:ENV)
THEN `(SI::%%MACROLET ,LISP::MACRODEFS ,@LISP::BODY)
ELSE
(LET (LISP::NEW-ENV LISP::FUNCTIONS)
(* ;;
 "We parse and handle the declarations here, so they'll take effect in the new child environment")
(LISP:MULTIPLE-VALUE-BIND
(LISP::BODY LISP::SPECIALS)
(\REMOVE-DECLS LISP::BODY (LISP:SETQ LISP::NEW-ENV (\MAKE-CHILD-ENVIRONMENT LISP::ENV)))
(LISP:SETQ LISP::FUNCTIONS (ENVIRONMENT-FUNCTIONS LISP::NEW-ENV))
(FOR LISP::FN IN LISP::MACRODEFS
DO (LISP:SETQ LISP::FUNCTIONS
(LIST* (CAR LISP::FN)
[CONS :MACRO `(LISP:LAMBDA (SI::$$MACRO-FORM
SI::$$MACRO-ENVIRONMENT)
(LISP:BLOCK ,(CAR LISP::FN)
,(PARSE-DEFMACRO (CADR LISP::FN)
'SI::$$MACRO-FORM
(CDDR LISP::FN)
(CAR LISP::FN)
NIL :ENVIRONMENT
'SI::$$MACRO-ENVIRONMENT))]
LISP::FUNCTIONS)))
(LISP:SETF (ENVIRONMENT-FUNCTIONS LISP::NEW-ENV)
LISP::FUNCTIONS)
(WALK-FORM (CONS 'LISP:LOCALLY LISP::BODY)
:ENVIRONMENT LISP::NEW-ENV])
(LISP:DEFSETF LISP:MACRO-FUNCTION SETF-MACRO-FUNCTION)
(PUTPROPS CMLMACROS FILETYPE LISP:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA LISP:MACROEXPAND-1 LISP:MACROEXPAND LISP:MACRO-FUNCTION)
)
(PUTPROPS CMLMACROS COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991 1992 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (1472 9378 (CLISPEXPANSION 1482 . 2890) (GLOBAL-MACRO-FUNCTION 2892 . 4085) (
LOCAL-MACRO-FUNCTION 4087 . 4949) (LOCAL-SYMBOL-FUNCTION 4951 . 5808) (\INTERLISP-NLAMBDA-MACRO 5810
. 6169) (LISP:MACRO-FUNCTION 6171 . 6530) (LISP:MACROEXPAND 6532 . 7504) (LISP:MACROEXPAND-1 7506 .
8736) (SETF-MACRO-FUNCTION 8738 . 9376)))))
STOP

BIN
CLTL2/CMLMACROS.LCOM Normal file

Binary file not shown.

163
CLTL2/CMLMISCIO Normal file
View File

@@ -0,0 +1,163 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10)
(FILECREATED "18-Oct-93 14:20:56" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLMISCIO.;2" 6473
|previous| |date:| "25-Oct-91 22:41:18" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLMISCIO.;1"
)
; Copyright (c) 1986, 1987, 1988, 1990, 1991, 1993 by Venue & Xerox Corporation. All rights reserved.
(PRETTYCOMPRINT CMLMISCIOCOMS)
(RPAQQ CMLMISCIOCOMS
(
(* |;;| "Random leftover IO functions")
(* |;;| "[JDS 2/3/88: Removed FRESH-LINE from here, since it's also in CMLPRINT. AR #9601]")
(FUNCTIONS LISP:Y-OR-N-P LISP:YES-OR-NO-P)
(* |;;| "JRB - stuff that handles CL:*PRINT-READABLY*")
(FUNCTIONS HANDLE-PRINT-READABLY LISP::CHECK-READABLY)
(FUNCTIONS LISP:PRINT-UNREADABLE-OBJECT LISP:WITH-STANDARD-IO-SYNTAX)
(* |;;| "Arrange to use the proper compiler")
(PROP FILETYPE CMLMISCIO)))
(* |;;| "Random leftover IO functions")
(* |;;| "[JDS 2/3/88: Removed FRESH-LINE from here, since it's also in CMLPRINT. AR #9601]")
(LISP:DEFUN LISP:Y-OR-N-P (&OPTIONAL FORMAT-STRING &REST ARGUMENTS)
(COND
(FORMAT-STRING (LISP:FRESH-LINE)
(LISP:APPLY (FUNCTION LISP:FORMAT)
*QUERY-IO* FORMAT-STRING ARGUMENTS)))
(LISP:FLET ((LISP::READ-CHAR-NOW NIL (RESETFORM (CONTROL T)
(LISP:READ-CHAR *QUERY-IO*))))
(LISP:DO ((LISP::RESPONSE (LISP::READ-CHAR-NOW)
(LISP::READ-CHAR-NOW)))
((OR (LISP:CHAR-EQUAL LISP::RESPONSE #\Y)
(LISP:CHAR-EQUAL LISP::RESPONSE #\N))
(LISP:FRESH-LINE)
(LISP:CHAR-EQUAL LISP::RESPONSE #\Y))
(LISP:FORMAT *QUERY-IO* "~&Please type either Y or N: "))))
(LISP:DEFUN LISP:YES-OR-NO-P (&OPTIONAL LISP::FORMAT-STRING &REST LISP::ARGUMENTS)
(LISP:WHEN LISP::FORMAT-STRING
(LISP:FRESH-LINE *QUERY-IO*)
(LISP:APPLY #'LISP:FORMAT *QUERY-IO* LISP::FORMAT-STRING LISP::ARGUMENTS))
(LISP:DO ((LISP::RESPONSE (LISP:READ-LINE *QUERY-IO*)
(LISP:READ-LINE *QUERY-IO*)))
((OR (STRING-EQUAL LISP::RESPONSE "YES")
(STRING-EQUAL LISP::RESPONSE "NO"))
(STRING-EQUAL LISP::RESPONSE "YES"))
(LISP:FORMAT *QUERY-IO* "Please type either YES or NO: ")))
(* |;;| "JRB - stuff that handles CL:*PRINT-READABLY*")
(LISP:DEFUN HANDLE-PRINT-READABLY ()
(* |;;| "Strategy: when *PRINT-READABLY* is on, all CL top-level printing functions go through a function that rebinds all the printer control variables (like WRITE or WRITE-TO-STRING). Calling HANDLE-PRINT-READABLY sets the control variables so output is printed readably; it also sets *PRINT-READABLY* to a magic value so functions like FORMAT and WRITE-STRING will know it's OK to write constant strings without munging them.")
(SETQ *PRINT-ESCAPE* T)
(SETQ *PRINT-LEVEL* NIL)
(SETQ *PRINT-LENGTH* NIL)
(SETQ *PRINT-GENSYM* T)
(SETQ *PRINT-ARRAY* T)
(SETQ *PRINT-CIRCLE* T)
(SETQ XCL:*PRINT-STRUCTURE* T)
(SETQ LISP:*PRINT-READABLY* 'XCL::PRINTING-READABLY))
(LISP:DEFUN LISP::CHECK-READABLY (XCL::THING &OPTIONAL LISP::WHERE)
(LISP:WHEN LISP:*PRINT-READABLY*
(LET (LISP:*PRINT-READABLY*)
(CONDITIONS:RESTART-CASE (LISP:ERROR 'LISP::PRINT-NOT-READABLE :THING XCL::THING :WHERE
LISP::WHERE)
(XCL::PRINT-IT-ANYWAY NIL :REPORT (LISP:LAMBDA (STREAM)
(LISP:PRINC "Print it anyway " STREAM))
:FILTER
(LISP:LAMBDA NIL (TYPEP XCL:*CURRENT-CONDITION*
'LISP::PRINT-NOT-READABLE)))))))
(DEFMACRO LISP:PRINT-UNREADABLE-OBJECT ((LISP::OBJECT STREAM &KEY TYPE LISP:IDENTITY)
&BODY LISP::BODY)
(LET ((LISP::O (LISP:GENSYM))
(LISP::S (LISP:GENSYM))
(LISP::SPACE? (LISP:GENSYM)))
`(LET ((,LISP::O ,LISP::OBJECT)
(,LISP::S ,STREAM)
,LISP::SPACE?)
(LISP::CHECK-READABLY ,LISP::O)
(WRITE-STRING* "#<" ,LISP::S)
,@(LISP:WHEN TYPE
`((LISP:WHEN ,TYPE
(LISP:SETQ ,LISP::SPACE? T)
(WRITE (LISP:TYPE-OF ,LISP::O)
,LISP::S))))
,@(LISP:WHEN LISP::BODY
`((LISP:WHEN ,LISP::SPACE?
(LISP:WRITE-CHAR #\Space ,LISP::S))
(PROGN ,@LISP::BODY (LISP:SETQ ,LISP::SPACE? T))))
,@(LISP:WHEN LISP:IDENTITY
`((LISP:WHEN ,LISP:IDENTITY
(LISP:WHEN ,LISP::SPACE?
(LISP:WRITE-CHAR #\Space ,LISP::S))
(WRITE-STRING* "@ " ,LISP::S)
(\\PRINTADDR ,LISP::O ,LISP::S))))
(LISP:WRITE-CHAR #\> ,LISP::S)
NIL)))
(DEFMACRO LISP:WITH-STANDARD-IO-SYNTAX (&BODY LISP::BODY)
`(LET ((*PACKAGE* (LISP:FIND-PACKAGE "COMMON-LISP-USER"))
(*PRINT-ARRAY* T)
(*PRINT-BASE* 10)
(*PRINT-CASE* :UPCASE)
(*PRINT-CIRCLE* NIL)
(*PRINT-ESCAPE* T)
(*PRINT-GENSYM* T)
(*PRINT-LENGTH* NIL)
(*PRINT-LEVEL* NIL)
(*PRINT-PRETTY* NIL)
(*PRINT-RADIX* NIL)
(LISP:*PRINT-READABLY* T)
(*READ-BASE* 10)
(*READ-DEFAULT-FLOAT-FORMAT* 'LISP:SINGLE-FLOAT)
(LISP:*READ-EVAL* T)
(*READ-SUPPRESS* NIL)
(*READTABLE* (FIND-READTABLE "LISP"))
(* |;;| "XP-specific variables")
(XP:*PRINT-LINES* NIL)
(XP:*PRINT-MISER-WIDTH* NIL)
(XP:*PRINT-PPRINT-DISPATCH* NIL)
(XP:*PRINT-RIGHT-MARGIN* NIL)
(* |;;| "XCL-specific variables")
(XCL:*PRINT-STRUCTURE* T))
,@LISP::BODY))
(* |;;| "Arrange to use the proper compiler")
(PUTPROPS CMLMISCIO FILETYPE LISP:COMPILE-FILE)
(PUTPROPS CMLMISCIO COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1990 1991 1993))
(DECLARE\: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLMISCIO.LCOM Normal file

Binary file not shown.

26
CLTL2/CMLMODULES Normal file
View File

@@ -0,0 +1,26 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "LISP")
(IL:FILECREATED "22-May-91 09:10:07" IL:|{DSK}<new>sources>lispcore>sources>CMLMODULES.;2| 2865
IL:|previous| IL:|date:| "12-Jun-90 16:56:18"
IL:|{DSK}<new>sources>lispcore>sources>CMLMODULES.;1|)
; Copyright (c) 1986, 1987, 1988, 1990, 1991 by Venue & Xerox Corporation. All rights reserved.
(IL:PRETTYCOMPRINT IL:CMLMODULESCOMS)
(IL:RPAQQ IL:CMLMODULESCOMS ((IL:VARIABLES *MODULES*) (IL:FUNCTIONS PROVIDE REQUIRE) (IL:PROP IL:FILETYPE IL:CMLMODULES) (IL:PROP IL:MAKEFILE-ENVIRONMENT IL:CMLMODULES)))
(DEFVAR *MODULES* NIL "A list of all modules currently provided to the system.")
(DEFUN PROVIDE (MODULE-NAME) "Declare that module-name is provided to the system." (DECLARE (SPECIAL *MODULES*)) (IF (SYMBOLP MODULE-NAME) (SETQ MODULE-NAME (SYMBOL-NAME MODULE-NAME))) (PUSHNEW MODULE-NAME *MODULES* :TEST (FUNCTION STRING=)) MODULE-NAME)
(DEFUN REQUIRE (MODULE-NAME &OPTIONAL (PATHNAME NIL)) "Declare that module-name is needed. If already loaded do nothing. If not, load using the pathname, which is a single pathname or list of pathnames. If pathname is not provided use the system default paths (*default-pathname-defaults* and directories)." (DECLARE (SPECIAL *MODULES* *DEFAULT-PATHNAME-DEFAULTS* IL:DIRECTORIES IL:*COMPILED-EXTENSIONS*)) (UNLESS (MEMBER MODULE-NAME *MODULES* :TEST (FUNCTION STRING=)) (LET (PATHNAMES) (LABELS ((TRY (PATHNAME) (OR (IL:* IL:\; "first look for a compiled file") (TRY-MANY PATHNAME IL:*COMPILED-EXTENSIONS*) (IL:* IL:\; "then for a source file") (TRY-MANY PATHNAME (LIST NIL)) (CERROR "Don't load file ~S~*." "Can't find file ~S for required module ~S." PATHNAME MODULE-NAME))) (TRY-MANY (PATHNAME TYPES) (IL:* IL:|;;| "look first on connected directory, then IL:DIRECTORIES") (DOLIST (DIRECTORY (CONS *DEFAULT-PATHNAME-DEFAULTS* IL:DIRECTORIES)) (DOLIST (TYPE TYPES) (WHEN (TRY-ONE (MERGE-PATHNAMES PATHNAME (MAKE-PATHNAME :TYPE TYPE :DEFAULTS DIRECTORY))) (RETURN-FROM TRY-MANY T))))) (TRY-ONE (PATHNAME) (IL:* IL:|;;| "don't try any pathname more than once") (UNLESS (MEMBER PATHNAME PATHNAMES :TEST (QUOTE EQUAL)) (PUSH PATHNAME PATHNAMES) (WHEN (PROBE-FILE PATHNAME) (UNLESS (FIND (IL:PACKFILENAME (QUOTE IL:DIRECTORY) (FORMAT NIL "{~a}~a" (PATHNAME-HOST PATHNAME) (PATHNAME-DIRECTORY PATHNAME)) (QUOTE IL:BODY) (PATHNAME-NAME PATHNAME) (QUOTE IL:VERSION) (PATHNAME-VERSION PATHNAME)) IL:LOADEDFILELST) (LOAD PATHNAME)) T)))) (DOLIST (PATHNAME (ETYPECASE PATHNAME (NULL (LIST MODULE-NAME)) ((OR SYMBOL STRING PATHNAME) (LIST PATHNAME)) (LIST PATHNAME)) T) (TRY PATHNAME))))))
(IL:PUTPROPS IL:CMLMODULES IL:FILETYPE :COMPILE-FILE)
(IL:PUTPROPS IL:CMLMODULES IL:MAKEFILE-ENVIRONMENT (:READTABLE "XCL" :PACKAGE "LISP"))
(IL:PUTPROPS IL:CMLMODULES IL:COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1990 1991))
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL)))
IL:STOP

BIN
CLTL2/CMLMODULES.DFASL Normal file

Binary file not shown.

69
CLTL2/CMLMVS Normal file
View File

@@ -0,0 +1,69 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "24-Mar-92 14:05:50" {DSK}<usr>local>lde>lispcore>sources>CMLMVS.;2 4265
changes to%: (VARS CMLMVSCOMS) (FUNCTIONS CL:NTH-VALUE)
previous date%: "16-May-90 13:35:04" {DSK}<usr>local>lde>lispcore>sources>CMLMVS.;1)
(* ; "
Copyright (c) 1985, 1986, 1990, 1992 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLMVSCOMS)
(RPAQQ CMLMVSCOMS ((* ; "Interpreter and compiler support for multiple values. See LLMVS for runtime support") (FNS CL:MULTIPLE-VALUE-CALL RETVALUES) (PROP DMACRO CL:MULTIPLE-VALUE-CALL) (FUNCTIONS CL:MULTIPLE-VALUE-BIND CL:MULTIPLE-VALUE-LIST CL:MULTIPLE-VALUE-PROG1 CL:MULTIPLE-VALUE-SETQ CL:NTH-VALUE) (VARS (NEW-ADVISETEMPLATE (QUOTE (ADV-PROG (!VALUE !OTHER-VALUES) (CL:MULTIPLE-VALUE-SETQ (!VALUE . !OTHER-VALUES) (ADV-PROG NIL (ADV-RETURN DEF))) (ADV-RETURN (CL:VALUES-LIST (CONS !VALUE !OTHER-VALUES))))))) (PROP FILETYPE CMLMVS) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA CL:MULTIPLE-VALUE-CALL) (NLAML) (LAMA)))))
(* ; "Interpreter and compiler support for multiple values. See LLMVS for runtime support")
(DEFINEQ
(CL:MULTIPLE-VALUE-CALL
[NLAMBDA FORMS
(DECLARE (LOCALVARS . T)) (* ; "Edited 16-Dec-86 15:35 by bvm:")
(* ;; "for interpreted calls only. Note that CL:APPLY will compile ok here, because this is in return context, so UNBIND doesn't get in the way.")
(CL:APPLY (\EVAL (CAR FORMS))
(for X in (CDR FORMS) join (CL:MULTIPLE-VALUE-LIST (\EVAL X])
(RETVALUES
[LAMBDA (POS VALUES FLG) (* bvm%: "10-Nov-86 18:13")
(LET ((P (\STACKARGPTR POS)))
(COND
((fetch (FX INVALIDP) of (SETQ P (fetch (FX CLINK) of P)))
(LISPERROR "ILLEGAL RETURN" VALUES)))
(\SMASHRETURN NIL P)
(AND FLG (RELSTK POS))
(CL:VALUES-LIST VALUES])
)
(PUTPROPS CL:MULTIPLE-VALUE-CALL DMACRO (DEFMACRO (FN &BODY BODY) (* ;; "How to compile special form MULTIPLE-VALUE-CALL --- for benefit of macro writers, handle some degenerate cases and let the rest turn into an APPLY. This is not an OPTIMIZER because pavcompiler intercepts it for its own use.") (COND ((AND (LISTP FN) (MEMB (CAR FN) (QUOTE (FUNCTION LISP:FUNCTION))) (MEMB (CADR FN) (QUOTE (LIST CL:VALUES)))) (if (NULL (CDR BODY)) then (* ; "only one source of values. Either sole arg is the result itself, or a list of its values is") (CONS (if (EQ (CADR FN) (QUOTE LIST)) then (QUOTE \MVLIST) else (QUOTE PROGN)) BODY) else (* ; "Produce a list consisting of all args spread. This is either the result itself, or to be spread as values") (BQUOTE ((\, (if (EQ (CADR FN) (QUOTE LIST)) then (QUOTE PROGN) else (QUOTE CL:VALUES-LIST))) (NCONC (\,@ (for F in BODY collect (BQUOTE (\MVLIST (\, F)))))))))) (T (BQUOTE (APPLY (\, FN) (NCONC (\,@ (for F in BODY collect (BQUOTE (\MVLIST (\, F))))))))))))
(DEFMACRO CL:MULTIPLE-VALUE-BIND (VARS VALUES-FORM &REST FORMS) (BQUOTE (DESTRUCTURING-BIND (\, VARS) (CL:MULTIPLE-VALUE-LIST (\, VALUES-FORM)) (\,@ FORMS))))
(DEFMACRO CL:MULTIPLE-VALUE-LIST (FORM) (BQUOTE (CL:MULTIPLE-VALUE-CALL (FUNCTION LIST) (\, FORM))))
(DEFMACRO CL:MULTIPLE-VALUE-PROG1 (FORM . OTHER-FORMS) (BQUOTE (CL:VALUES-LIST (PROG1 (CL:MULTIPLE-VALUE-LIST (\, FORM)) (\,@ OTHER-FORMS)))))
(DEFMACRO CL:MULTIPLE-VALUE-SETQ (VARIABLES FORM) (LET ((LIST (GENSYM))) (BQUOTE (LET (((\, LIST) (CL:MULTIPLE-VALUE-LIST (\, FORM)))) (DESTRUCTURING-SETQ (\, VARIABLES) (\, LIST)) (CAR (\, LIST))))))
(DEFMACRO CL:NTH-VALUE (CL::N CL::FORM) (BQUOTE (CL:NTH (\, CL::N) (CL:MULTIPLE-VALUE-LIST (\, CL::FORM)))))
(RPAQQ NEW-ADVISETEMPLATE (ADV-PROG (!VALUE !OTHER-VALUES) (CL:MULTIPLE-VALUE-SETQ (!VALUE . !OTHER-VALUES) (ADV-PROG NIL (ADV-RETURN DEF))) (ADV-RETURN (CL:VALUES-LIST (CONS !VALUE !OTHER-VALUES)))))
(PUTPROPS CMLMVS FILETYPE CL:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA CL:MULTIPLE-VALUE-CALL)
(ADDTOVAR NLAML)
(ADDTOVAR LAMA)
)
(PUTPROPS CMLMVS COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1990 1992))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (1215 2052 (CL:MULTIPLE-VALUE-CALL 1225 . 1662) (RETVALUES 1664 . 2050)))))
STOP

BIN
CLTL2/CMLMVS.LCOM Normal file

Binary file not shown.

143
CLTL2/CMLPACKAGE Normal file
View File

@@ -0,0 +1,143 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "XCL")
(il:filecreated "14-Jun-90 17:33:55" il:|{PELE:MV:ENVOS}<LISPCORE>SOURCES>CMLPACKAGE.;3| 22253
il:|previous| il:|date:| "16-May-90 14:12:37" il:|{PELE:MV:ENVOS}<LISPCORE>SOURCES>CMLPACKAGE.;2|
)
; Copyright (c) 1986, 1987, 1988, 1990 by Venue & Xerox Corporation. All rights reserved.
(il:prettycomprint il:cmlpackagecoms)
(il:rpaqq il:cmlpackagecoms ((il:* il:|;;;| "This is the second part of the package system, the first is in LLPACKAGE, which is loaded during the init") (il:setfs symbol-package) (il:functions il:dwim-symbol-package escape-colons-proceed make-external-proceed make-internal-proceed ugly-symbol-proceed) (il:declare\: il:donteval@load il:docopy (il:addvars (il:dwimuserforms (il:dwim-symbol-package)))) (il:* il:|;;| "User friendly symbol error resolving functions") (il:structures read-conflict missing-external-symbol missing-package) (il:variables *preferred-reading-symbols*) (il:functions il:resolve-reader-conflict il:resolve-missing-external-symbol il:resolve-missing-package) (il:structures package-error symbol-conflict use-conflict export-conflict export-missing import-conflict unintern-conflict) (il:functions il:resolve-use-package-conflict il:resolve-export-conflict il:resolve-export-missing il:resolve-import-conflict il:resolve-unintern-conflict) (il:structures symbol-colon-error) (il:functions il:\\invalid.symbol (il:* il:\; "Also defined (w/o the error condition or proceed case) in LLREAD.")) (il:* il:|;;| "Symbol inspector") (il:functions il:symbol-inspect-fetchfn il:symbol-inspect-storefn) (il:p (let ((il:form (quote ((il:function symbolp) (il:name il:value il:plist package) il:symbol-inspect-fetchfn il:symbol-inspect-storefn nil nil nil "Symbol inspector")))) (cond ((not (il:member il:form il:inspectmacros)) (il:|push| il:inspectmacros il:form))))) (il:* il:|;;| "Package inspector") (il:functions il:package-inspect-fetchfn il:package-inspect-storefn) (il:p (let ((il:form (quote ((il:function packagep) (il:name il:nicknames il:use-list il:internal-symbols il:external-symbols il:shadowing-symbols) il:package-inspect-fetchfn il:package-inspect-storefn nil nil nil "Package inspector")))) (cond ((not (il:member il:form il:inspectmacros)) (il:|push| il:inspectmacros il:form))))) (il:* il:|;;| "Package-hashtable inspector") (il:functions il:package-hashtable-inspect-fetchfn il:package-hashtable-inspect-storefn) (il:p (let ((il:form (quote ((il:function lisp::package-hashtable-p) (il:size il:free il:deleted il:contents) il:package-hashtable-inspect-fetchfn il:package-hashtable-inspect-storefn)))) (cond ((not (il:member il:form il:inspectmacros)) (il:|push| il:inspectmacros il:form))))) (il:* il:|;;| "Package's Prefix accessor and setfs (Edited by TT 14-June-90 for AR#11112)") (il:functions package-prefix setf-package-prefix) (il:setfs package-prefix) (il:prop (il:filetype il:makefile-environment) il:cmlpackage) (il:declare\: il:donteval@load il:doeval@compile il:dontcopy il:compilervars (il:addvars (il:nlama) (il:nlaml) (il:lama))))
)
(il:* il:|;;;|
"This is the second part of the package system, the first is in LLPACKAGE, which is loaded during the init"
)
(defsetf symbol-package il:setf-symbol-package)
(defun il:dwim-symbol-package nil (declare (special il:faultx il:faultapplyflg)) (il:* il:|;;| "This is placed on DWIMUSERFORMS to attempt corrections where the typed symbol is in the wrong package.") (let ((il:sym (or (car (il:listp il:faultx)) il:faultx)) il:others) (cond ((and (il:litatom il:sym) (cdr (il:setq il:others (find-all-symbols (symbol-name il:sym)))) (il:setq il:others (il:|for| il:x il:|in| il:others il:|collect| il:x il:|when| (and (il:neq il:x il:sym) (not (keywordp il:x)) (il:|if| (and (il:litatom il:faultx) (not il:faultapplyflg)) il:|then| (il:* il:\; "Error is uba") (boundp il:x) il:|else| (fboundp il:x)))))) (il:|for| il:choice il:|in| il:others il:|when| (il:fixspell1 il:sym il:choice nil t (and (cdr il:others) (quote il:mustapprove))) il:|do| (il:* il:|;;| "Normally there is only one choice, and we offer it. If there is more than one choice, probably should do something like a menu. This is quick and dirty--ask user for each in turn and require approval so that it doesn't choose the first automatically.") (return (il:|if| (il:listp il:faultx) il:|then| (il:* il:\; "SYM = (CAR FAULTX)") (il:/rplaca il:faultx il:choice) il:|else| il:choice)))))))
(define-proceed-function escape-colons-proceed :condition symbol-colon-error :report "Treat the extra colon(s) as if they were escaped")
(define-proceed-function make-external-proceed :condition missing-external-symbol :report "Return a new external symbol by that name" (condition *current-condition*))
(define-proceed-function make-internal-proceed :condition missing-external-symbol :report "Return a new internal symbol by that name")
(define-proceed-function ugly-symbol-proceed :condition missing-package)
(il:declare\: il:donteval@load il:docopy
(il:addtovar il:dwimuserforms (il:dwim-symbol-package))
)
(il:* il:|;;| "User friendly symbol error resolving functions")
(define-condition read-conflict (read-error) (name packages) (:report (lambda (condition stream) (quote (format stream "Symbols named ~a exist in packages:~{~a ~}" (read-conflict-name condition) (mapcar (function package-name) (read-conflict-packages condition)))) (format stream "Symbols named ~A exists in packages:" (read-conflict-name condition)) (dolist (pkg (read-conflict-packages condition)) (princ " " stream) (princ (package-name pkg) stream)))))
(define-condition missing-external-symbol (read-error) (name package) (:report (lambda (condition stream) (format stream "External symbol ~a not found in package ~a" (missing-external-symbol-name condition) (package-name (missing-external-symbol-package condition))))))
(define-condition missing-package (read-error) (package-name symbol-name external) (:report (lambda (condition stream) (format stream "Can't find package ~a to look up symbol ~a" (missing-package-package-name condition) (missing-package-symbol-name condition)))))
(defvar *preferred-reading-symbols* (quote (il:append il:apply il:apropos il:array il:arrayp il:assoc il:atan il:atom il:block il:break il:char il:character il:close il:common il:compile il:compile-file il:cos il:count il:defstruct il:delete il:describe il:directory il:do il:documentation il:elt il:equal il:error il:eval il:every il:exp il:expt il:fill-pointer il:find il:first il:floatp il:floor il:format il:function il:gcd il:gensym il:gethash il:if il:intersection il:keyword il:labels il:lambda il:ldiff il:length il:listp il:load il:locally il:log il:loop il:map il:mapc il:mapcar il:mapcon il:maphash il:maplist il:member il:merge il:mismatch il:mod il:namestring il:notany il:notevery il:nth il:number il:numberp il:numerator il:pop il:position il:prin1 il:print il:push il:pushnew il:rational il:read il:readtable il:remove il:replace il:rest il:reverse il:search il:second il:setq il:signed-byte il:simple-string il:sin il:some il:sort il:sqrt il:stringp il:structure il:sublis il:subseq il:subst il:symbol il:tan il:terpri trace il:union il:unless il:values il:variable il:vector il:when il:zerop il:* il:***)) "List of symbols whose lookup is preferred by the litatom to symbol converter. Initially it contains a list of symbols which are conflicting but are always qualified in old sources.")
(defun il:resolve-reader-conflict (il:ilsym il:clsym il:clsymwhere) "Reader finds unqualified symbol that exists in both InterLisp and Lisp. Checks *PREFERRED-READING-SYMBOLS* list against names." (declare (special *preferred-reading-symbols*)) (il:* il:|;;| "CAUTION: Do not attempt to move the namestring check from \\NEW.READ.SYMBOL into this function as RESOLVE-READER-CONFLICT has a dummy definition in the INIT. Also, namestring resolutions must be made during the time that packages are turned off in the beginning of the INIT.") (cond ((not (eq il:clsymwhere :external)) (il:* il:\; "Will not resolve internal (therefore private) symbols from LISP") il:ilsym) (t (let ((il:ilpreferred (member il:ilsym *preferred-reading-symbols* :test (quote eq))) (il:clpreferred (member il:clsym *preferred-reading-symbols* :test (quote eq)))) (cond ((and il:ilpreferred (not il:clpreferred)) il:ilsym) ((and il:clpreferred (not il:ilpreferred)) il:clsym) (t (il:* il:\; "Raise the signal") (restart-case (error (quote read-conflict) :name (symbol-name il:ilsym) :packages (list (find-package "LISP") (find-package "INTERLISP"))) (prefer-clsym-proceed nil :condition read-conflict :report (lambda (stream) (format stream "Return the LISP symbol ~A; make it preferred" il:clsym)) il:clsym) (prefer-ilsym-proceed nil :condition read-conflict :report (lambda (stream) (format stream "Return the INTERLISP symbol ~A; make it preferred" il:ilsym)) (setq *preferred-reading-symbols* (remove il:clsym *preferred-reading-symbols* :test (function eq))) (push il:ilsym *preferred-reading-symbols*) il:ilsym) (return-ilsym-proceed nil :condition read-conflict :report (lambda (stream) (format stream "Just return the INTERLISP symbol ~A" il:ilsym)) il:ilsym))))))))
(defun il:resolve-missing-external-symbol (il:name package) "Handle missing external symbols in a package during read." (let ((il:my-condition (make-condition (quote missing-external-symbol) :name il:name :package package))) (flet ((il:filter nil (eq *current-condition* il:my-condition))) (restart-case (error il:my-condition) (make-external-proceed nil :filter il:filter :report (lambda (stream) (format stream "Return a new external symbol in package ~A named ~A" (package-name package) il:name)) (let ((il:symbol (intern il:name package))) (export il:symbol package) il:symbol)) (make-internal-proceed nil :filter il:filter :report (lambda (stream) (format stream "Return a new internal symbol in package ~A named ~A" (package-name package) il:name)) (intern il:name package))))))
(defun il:resolve-missing-package (package-name symbol-name externalp) (let ((il:my-condition (make-condition (quote missing-package) :package-name package-name :symbol-name symbol-name :external externalp))) (flet ((il:filter nil (eq *current-condition* il:my-condition))) (restart-case (error il:my-condition) (new-package-proceed nil :filter il:filter :report (lambda (stream) (format stream "Return new symbol named ~A made in new package ~A" symbol-name package-name)) (let* ((package (make-package (missing-package-package-name il:my-condition))) (symbol (intern (missing-package-symbol-name il:my-condition) package))) (when (missing-package-external il:my-condition) (export symbol package)) symbol)) (ugly-symbol-proceed nil :filter il:filter :report (lambda (stream) (format stream "Return new ugly symbol |~a~a~a| made in current package ~a" package-name (if externalp ":" "::") symbol-name (package-name *package*))) :interactive (lambda nil (list *package*)) (intern (il:concat (missing-package-package-name il:my-condition) (if (missing-package-external il:my-condition) ":" "::") (missing-package-symbol-name il:my-condition)) *package*))))))
(define-condition package-error (error) (package))
(define-condition symbol-conflict (package-error) (symbols))
(define-condition use-conflict (symbol-conflict) (used-package) (:report (lambda (condition *standard-output*) (format t "Package ~a using ~a results in name conflicts for symbols:~%~{~s ~}" (package-name (use-conflict-package condition)) (package-name (use-conflict-used-package condition)) (use-conflict-symbols condition)))))
(define-condition export-conflict (symbol-conflict) (exported-symbols packages) (:report (lambda (condition *standard-output*) (format t "Exporting these symbols from the ~a package:~%~{~s ~}~%results in name conflicts with package(s):~%~{~a ~}~%" (package-name (export-conflict-package condition)) (export-conflict-symbols condition) (mapcar (function package-name) (export-conflict-packages condition))))))
(define-condition export-missing (package-error) (symbols) (:report (lambda (condition *standard-output*) (format t "These symbols aren't in package ~a; can't export them from it:~%~{~s ~}" (package-name (export-missing-package condition)) (export-missing-symbols condition)))))
(define-condition import-conflict (symbol-conflict) nil (:report (lambda (condition *standard-output*) (format t "Importing these symbols into package ~a causes a name conflict:~%~{~s ~}" (package-name (import-conflict-package condition)) (import-conflict-symbols condition)))))
(define-condition unintern-conflict (symbol-conflict) (symbol) (:report (lambda (condition *standard-output*) (format t "Uninterning symbol ~s causes a name conflict among these symbols:~%~{~s ~}" (unintern-conflict-symbol condition) (unintern-conflict-symbols condition)))))
(defun il:resolve-use-package-conflict (used-package symbols package) "Handle a conflict from use-package." (setq symbols (sort symbols (quote string<))) (let ((my-condition (make-condition (quote use-conflict) :package package :symbols symbols :used-package used-package))) (flet ((filter nil (eq *current-condition* my-condition))) (restart-case (error my-condition) (shadow-use-conflicts-proceed nil :filter filter :report (lambda (stream) (format stream "Shadow conflicting symbols from ~A in ~A" (package-name used-package) (package-name package))) (dolist (symbol symbols) (shadow symbol package))) (unintern-user-proceed nil :filter filter :report (lambda (stream) (format stream "Unintern all conflicting symbols from ~A (DANGEROUS)" (package-name package))) (dolist (symbol symbols) (il:moby-unintern symbol package))) (unintern-usee-proceed nil :filter filter :report (lambda (stream) (format stream "Unintern all conflicting symbols from ~A (VERY DANGEROUS)" (package-name used-package))) (dolist (symbol symbols) (il:moby-unintern (find-symbol (symbol-name symbol) used-package) used-package))) (abort nil :filter filter :report (lambda (stream) (format stream "Abort making package ~a use ~a" (package-name package) (package-name used-package))) (il:retfrom (quote use-package) nil))))))
(defun il:resolve-export-conflict (package symbols packages exported-symbols) "Handle a conflict raised by export." (il:setq symbols (sort symbols (quote string<))) (setq packages (sort packages (function (lambda (a b) (string< (package-name a) (package-name b)))))) (let ((my-condition (make-condition (quote export-conflict) :package package :symbols symbols :exported-symbols exported-symbols :packages packages))) (flet ((filter nil (eq *current-condition* my-condition))) (restart-case (error my-condition) (unintern-proceed nil :filter filter :report (lambda (stream) (format stream "Unintern all conflicting symbols in package~P~{ ~a~} (DANGEROUS)" (if (null (rest packages)) 0 1) (mapcar (function package-name) packages))) (dolist (package packages exported-symbols) (dolist (symbol symbols) (il:moby-unintern (find-symbol (symbol-name symbol) package) package)))) (abort nil :filter filter :report (lambda (stream) (format stream "Abort exporting the symbols from package ~a" (package-name package))) (il:retfrom (quote export) nil))))))
(defun il:resolve-export-missing (package symbols) "Handle missing symbols needed to export." (setq symbols (sort symbols (quote string<))) (let ((my-condition (quote export-missing) :package package :symbols symbols (make-condition))) (flet ((filter nil (eq *current-condition* my-condition))) (restart-case (error my-condition) (import-proceed nil :filter filter :report (lambda (stream) (format stream "Import missing symbols into ~A, then export them" package)) (import symbols package)) (abort nil :filter filter :report (lambda (stream) (format stream "Abort export from package ~A" package)) (il:retfrom (quote export) nil))))))
(defun il:resolve-import-conflict (package symbols) "Handle conflict signalled by import. Returning from here does shadowing import." (setq symbols (sort symbols (quote string<))) (let ((my-condition (make-condition (quote import-conflict) :package package :symbols symbols))) (flet ((filter nil (eq *current-condition* my-condition))) (restart-case (error my-condition) (shadowing-import-proceed nil :filter filter :report (lambda (stream) (format stream "Import symbols into ~S with ~S instead" (package-name package) (quote shadowing-import))) nil) (abort nil :filter filter :report (lambda (stream) (format stream "Abort import into package ~S" (package-name package))) (il:retfrom (quote import) nil))))))
(defun il:resolve-unintern-conflict (symbol symbols package) "Handle a conflict noted by unintern." (setq symbols (sort symbols (quote string<))) (let ((my-condition (make-condition (quote unintern-conflict) :symbol symbol :symbols symbols :package package))) (flet ((filter nil (eq *current-condition* my-condition))) (restart-case (error my-condition) (shadowing-import-proceed (symbol-to-import) :filter filter :report (lambda (stream) (format stream "Choose symbol and ~S it to hide conflicts in package ~S" (quote shadowing-import) (package-name package))) :interactive (lambda nil (loop (let ((symbol (il:menu (il:create il:menu il:title il:_ "Choose symbol to shadowing-import" il:items il:_ symbols il:centerflg il:_ t)))) (when (member symbol symbols :test (function eq)) (return (list symbol)))))) (shadowing-import symbol-to-import package) (il:retfrom (quote il:resolve-unintern-conflict) t)) (abort nil :filter filter :report (lambda (stream) (format stream "Abort unintern of symbol ~s from package ~s" symbol (package-name package))) (il:retfrom (quote unintern) nil))))))
(define-condition symbol-colon-error (read-error) (name) (:report (lambda (condition *standard-output*) (format t "Invalid symbol syntax in \"~A\"" (symbol-colon-error-name condition)))))
(defun il:\\invalid.symbol (base len ncolons package extrasegments) (il:* il:|;;;| "Called when scanning a symbol that has more than 2 colons, or more than 1 non-consecutive colon. If return from here, will read the symbol as though the extra colons were escaped.") (declare (special il:\\fatpnamestringp) (il:* il:\; "This ain't my fault, honest.")) (let ((my-condition (make-condition (quote symbol-colon-error) :name (il:concat (if (and package (not (eq package il:*keyword-package*))) (if (stringp package) package (package-name package)) "") (case ncolons (1 ":") (2 "::") (t "")) (il:\\getbasestring base 0 len il:\\fatpnamestringp))))) (restart-case (error my-condition) (escape-colons-proceed nil :filter (lambda nil (eq *current-condition* my-condition)) :report "Treat the extra colon(s) as if they were escaped" nil))))
(il:* il:|;;| "Symbol inspector")
(defun il:symbol-inspect-fetchfn (il:object il:property) (case il:property (il:name (symbol-name il:object)) (il:value (if (boundp il:object) (symbol-value il:object) (quote il:nobind))) (il:plist (symbol-plist il:object)) (package (symbol-package il:object))))
(defun il:symbol-inspect-storefn (il:object il:property il:value) (case il:property (il:name (il:promptprint "Can't set symbol name")) (il:value (setf (symbol-value il:object) il:value)) (il:plist (setf (symbol-plist il:object) il:value)) (package (setf (symbol-package il:object) il:value))))
(let ((il:form (quote ((il:function symbolp) (il:name il:value il:plist package) il:symbol-inspect-fetchfn il:symbol-inspect-storefn nil nil nil "Symbol inspector")))) (cond ((not (il:member il:form il:inspectmacros)) (il:|push| il:inspectmacros il:form))))
(il:* il:|;;| "Package inspector")
(defun il:package-inspect-fetchfn (il:object il:property) (case il:property (il:name (lisp::%package-name il:object)) (il:nicknames (lisp::%package-nicknames il:object)) (il:use-list (lisp::%package-use-list il:object)) (il:internal-symbols (lisp::%package-internal-symbols il:object)) (il:external-symbols (lisp::%package-external-symbols il:object)) (il:shadowing-symbols (lisp::%package-shadowing-symbols il:object))))
(defun il:package-inspect-storefn (il:object il:property il:value) (il:promptprint "Can't set the fields of a package"))
(let ((il:form (quote ((il:function packagep) (il:name il:nicknames il:use-list il:internal-symbols il:external-symbols il:shadowing-symbols) il:package-inspect-fetchfn il:package-inspect-storefn nil nil nil "Package inspector")))) (cond ((not (il:member il:form il:inspectmacros)) (il:|push| il:inspectmacros il:form))))
(il:* il:|;;| "Package-hashtable inspector")
(defun il:package-hashtable-inspect-fetchfn (il:object il:property) (case il:property (il:size (lisp::package-hashtable-size il:object)) (il:free (lisp::package-hashtable-free il:object)) (il:deleted (lisp::package-hashtable-deleted il:object)) (il:contents (lisp::package-hashtable-table il:object))))
(defun il:package-hashtable-inspect-storefn (il:object il:property il:value) (il:promptprint "Can't set the fields of a package-hashtable"))
(let ((il:form (quote ((il:function lisp::package-hashtable-p) (il:size il:free il:deleted il:contents) il:package-hashtable-inspect-fetchfn il:package-hashtable-inspect-storefn)))) (cond ((not (il:member il:form il:inspectmacros)) (il:|push| il:inspectmacros il:form))))
(il:* il:|;;| "Package's Prefix accessor and setfs (Edited by TT 14-June-90 for AR#11112)")
(defun package-prefix (package) (il:* il:\; "Edited by TT (14-June-90 : for AR#111122)") (lisp::%package-namesymbol (il:\\packagify package)))
(defun setf-package-prefix (package prefix) (il:* il:\; "Edited by TT (14-June-90 : for AR#111122)") (if (symbolp prefix) (setf (lisp::%package-namesymbol (il:\\packagify package)) prefix) (if (stringp prefix) (setf (lisp::%package-namesymbol (il:\\packagify package)) (intern prefix)) (error "~S must be symbol or string." prefix))))
(defsetf package-prefix setf-package-prefix)
(il:putprops il:cmlpackage il:filetype :compile-file)
(il:putprops il:cmlpackage il:makefile-environment (:readtable "XCL" :package "XCL"))
(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:cmlpackage il:copyright ("Venue & Xerox Corporation" 1986 1987 1988 1990))
(il:declare\: il:dontcopy
(il:filemap (nil)))
il:stop

BIN
CLTL2/CMLPACKAGE.DFASL Normal file

Binary file not shown.

245
CLTL2/CMLPATHNAME Normal file

File diff suppressed because one or more lines are too long

BIN
CLTL2/CMLPATHNAME.LCOM Normal file

Binary file not shown.

363
CLTL2/CMLPRINT Normal file
View File

@@ -0,0 +1,363 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 14:35:18" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLPRINT.;2" 16374
previous date%: " 8-Jul-92 17:21:55" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLPRINT.;1")
(* ; "
Copyright (c) 1985, 1986, 1987, 1988, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLPRINTCOMS)
(RPAQQ CMLPRINTCOMS
[(FNS WRITE LISP:WRITE-CHAR LISP:PRIN1 LISP:PRINT LISP:TERPRI LISP:FRESH-LINE
LISP:FINISH-OUTPUT LISP:FORCE-OUTPUT LISP:CLEAR-OUTPUT LISP:PPRINT LISP:PRINC)
(FUNCTIONS \WRITE1)
(FNS LISP:WRITE-TO-STRING LISP:PRIN1-TO-STRING LISP:PRINC-TO-STRING)
(FNS WRITE-STRING*)
(FUNCTIONS LISP:WRITE-STRING LISP:WRITE-LINE)
(INITVARS (XCL:*PRINT-STRUCTURE*))
(VARIABLES LISP:*PRINT-READABLY*)
(PROP FILETYPE CMLPRINT)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDVARS (NLAMA)
(NLAML)
(LAMA LISP:WRITE-TO-STRING LISP:PRINC LISP:PPRINT LISP:PRINT LISP:PRIN1
LISP:WRITE-CHAR WRITE])
(DEFINEQ
(WRITE
(LISP:LAMBDA (OBJECT &KEY (STREAM *STANDARD-OUTPUT*)
((:ESCAPE *PRINT-ESCAPE*)
*PRINT-ESCAPE*)
((:RADIX *PRINT-RADIX*)
*PRINT-RADIX*)
((:BASE *PRINT-BASE*)
*PRINT-BASE*)
((:LEVEL *PRINT-LEVEL*)
*PRINT-LEVEL*)
((:LENGTH *PRINT-LENGTH*)
*PRINT-LENGTH*)
((:CASE *PRINT-CASE*)
*PRINT-CASE*)
((:GENSYM *PRINT-GENSYM*)
*PRINT-GENSYM*)
((:ARRAY *PRINT-ARRAY*)
*PRINT-ARRAY*)
((:PRETTY *PRINT-PRETTY*)
*PRINT-PRETTY*)
((:CIRCLE *PRINT-CIRCLE*)
*PRINT-CIRCLE*)
((:PPRINT-DISPATCH XP:*PRINT-PPRINT-DISPATCH*)
XP:*PRINT-PPRINT-DISPATCH*)
((:RIGHT-MARGIN XP:*PRINT-RIGHT-MARGIN*)
XP:*PRINT-RIGHT-MARGIN*)
((:LINES XP:*PRINT-LINES*)
XP:*PRINT-LINES*)
((:MISER-WIDTH XP:*PRINT-MISER-WIDTH*)
XP:*PRINT-MISER-WIDTH*)
((:READABLY LISP:*PRINT-READABLY*)
LISP:*PRINT-READABLY*)) (* ; "Edited 11-Oct-91 23:23 by jrb:")
(DECLARE (LISP:SPECIAL *PRINT-ESCAPE* *PRINT-RADIX* *PRINT-BASE* *PRINT-LEVEL*
*PRINT-LENGTH* *PRINT-CASE* *PRINT-GENSYM* *PRINT-ARRAY* *PRINT-PRETTY*
*PRINT-CIRCLE* XP:*PRINT-PPRINT-DISPATCH* XP:*PRINT-RIGHT-MARGIN*
XP:*PRINT-LINES* XP:*PRINT-MISER-WIDTH* LISP:*PRINT-READABLY*
*PRINT-CIRCLE-HASHTABLE* *PRINT-CIRCLE-NUMBER* THERE-ARE-CIRCLES))
(* ;
 "Make sure STREAM ends up as an appropriate stream")
(SETQ STREAM (\GETSTREAM STREAM 'OUTPUT))
(LISP:WHEN LISP:*PRINT-READABLY* (HANDLE-PRINT-READABLY))
[COND
[*PRINT-PRETTY* (COND
((XP::XP-STRUCTURE-P STREAM)
(XP::WRITE+ OBJECT STREAM))
(T (XP::MAYBE-INITIATE-XP-PRINTING #'(LISP:LAMBDA (LISP::S LISP::O)
(XP::WRITE+ LISP::O
LISP::S))
STREAM OBJECT]
((OR (NOT *PRINT-CIRCLE*)
*PRINT-CIRCLE-HASHTABLE*)
(\WRITE1 OBJECT STREAM))
(T (LET ((*PRINT-CIRCLE-NUMBER* 1)
(*PRINT-CIRCLE-HASHTABLE* (LISP:MAKE-HASH-TABLE))
THERE-ARE-CIRCLES)
(DECLARE (LISP:SPECIAL *PRINT-CIRCLE-NUMBER* *PRINT-CIRCLE-HASHTABLE*
THERE-ARE-CIRCLES))
(PRINT-CIRCLE-SCAN OBJECT)
(COND
((NOT THERE-ARE-CIRCLES)
(LISP:SETQ *PRINT-CIRCLE-HASHTABLE* NIL)))
(\WRITE1 OBJECT STREAM]
OBJECT))
(LISP:WRITE-CHAR
(LISP:LAMBDA (CHARACTER &OPTIONAL STREAM) (* ; "Edited 11-Oct-91 23:44 by jrb:")
(SETQ STREAM (\GETSTREAM STREAM 'OUTPUT))
[COND
((AND *PRINT-PRETTY* (XP::XP-STRUCTURE-P STREAM))
(XP::WRITE-CHAR+ CHARACTER STREAM))
[LISP:*PRINT-READABLY* (LET ((*PRINT-ESCAPE* T))
(\OUTCHAR STREAM (LISP:CHAR-INT CHARACTER]
(T (\OUTCHAR STREAM (LISP:CHAR-INT CHARACTER]
CHARACTER))
(LISP:PRIN1
(LISP:LAMBDA (OBJECT &OPTIONAL OUTPUT-STREAM) (* ; "Edited 20-Feb-87 16:58 by bvm:")
(WRITE OBJECT :STREAM OUTPUT-STREAM :ESCAPE T)))
(LISP:PRINT
(LISP:LAMBDA (OBJECT &OPTIONAL (STREAM *STANDARD-OUTPUT*)) (* ; "Edited 20-Oct-91 21:16 by jrb:")
(SETQ STREAM (\GETSTREAM STREAM 'OUTPUT))
(* ;; "The *PRINT-READABLY* case is forced through PRIN1 which goes through WRITE which rebinds everything as necessary")
(COND
[(AND *PRINT-PRETTY* (NOT LISP:*PRINT-READABLY*))
(COND
((XP::XP-STRUCTURE-P STREAM)
(XP::PPRINT-NEWLINE+ :UNCONDITIONAL STREAM)
(LET ((*PRINT-ESCAPE* T))
(XP::BASIC-WRITE OBJECT STREAM)
(XP::WRITE-CHAR++ #\Space STREAM)))
(T (XP::MAYBE-INITIATE-XP-PRINTING #'(LISP:LAMBDA (LISP::S LISP::O)
(XP::WRITE+ LISP::O LISP::S))
STREAM OBJECT]
(T (TERPRI STREAM)
(LISP:PRIN1 OBJECT STREAM)
(SPACES 1 STREAM)))
OBJECT))
(LISP:TERPRI
[LAMBDA (STREAM) (* ; "Edited 20-Sep-91 13:56 by jrb:")
(* ;; "The clause *PRINT-PRETTY* is not necessary here: if a TERPRI is the first printing operation in a pretty-print sequence, it will be ignored anyway.")
(COND
((AND *PRINT-PRETTY* (XP::XP-STRUCTURE-P STREAM))
(XP::PPRINT-NEWLINE+ :UNCONDITIONAL STREAM))
(T (TERPRI (OR STREAM *STANDARD-OUTPUT*])
(LISP:FRESH-LINE
[LAMBDA (STREAM) (* ; "Edited 20-Sep-91 13:57 by jrb:")
(SETQ STREAM (\GETSTREAM STREAM 'OUTPUT))
(COND
((AND *PRINT-PRETTY* (XP::XP-STRUCTURE-P STREAM))
(XP::ATTEMPT-TO-OUTPUT STREAM T T) (* ; "ok because we want newline")
(LISP:WHEN (NOT (LISP:ZEROP (XP::LP<-BP STREAM)))
(XP::PPRINT-NEWLINE+ :FRESH STREAM)
T))
(T (FRESHLINE STREAM])
(LISP:FINISH-OUTPUT
[LAMBDA (STREAM) (* ; "Edited 20-Sep-91 14:01 by jrb:")
(SETQ STREAM (\GETSTREAM STREAM 'OUTPUT))
(LISP:IF (XP::XP-STRUCTURE-P STREAM)
(XP::ATTEMPT-TO-OUTPUT STREAM T T))
(FORCEOUTPUT STREAM T)
NIL])
(LISP:FORCE-OUTPUT
[LAMBDA (STREAM) (* ; "Edited 20-Sep-91 14:01 by jrb:")
(SETQ STREAM (\GETSTREAM STREAM 'OUTPUT))
(LISP:IF (XP::XP-STRUCTURE-P STREAM)
(XP::ATTEMPT-TO-OUTPUT STREAM T T))
(FORCEOUTPUT STREAM)
NIL])
(LISP:CLEAR-OUTPUT
[LAMBDA (STREAM) (* ; "Edited 20-Sep-91 13:14 by jrb:")
(LISP:IF [XP::XP-STRUCTURE-P (SETQ STREAM (\GETSTREAM STREAM 'OUTPUT]
(LET ((XP::*LOCATING-CIRCULARITIES* 0)) (* ; "hack to prevent visible output")
(XP::ATTEMPT-TO-OUTPUT STREAM T T)))
NIL])
(LISP:PPRINT
(LISP:LAMBDA (OBJECT &OPTIONAL (OUTPUT-STREAM *STANDARD-OUTPUT*))
(* lmm " 4-May-86 03:19")
(TERPRI OUTPUT-STREAM)
(WRITE OBJECT :STREAM OUTPUT-STREAM :ESCAPE T :PRETTY T)
(LISP:VALUES)))
(LISP:PRINC
(LISP:LAMBDA (OBJECT &OPTIONAL OUTPUT-STREAM) (* ; "Edited 20-Feb-87 16:59 by bvm:")
(WRITE OBJECT :STREAM OUTPUT-STREAM :ESCAPE NIL)))
)
(LISP:DEFUN \WRITE1 (OBJECT STREAM)
(* ;; "This used to be where we decided if we were pretty-printing or not; the conditionality was a little strange:")
(* ;; "(CL:IF (AND *PRINT-PRETTY* (OR (NOT *PRINT-CIRCLE*) (NOT *PRINT-CIRCLE-HASHTABLE*)) *PRINT-ESCAPE*) (pretty-print-using-IL:PRINTDEF) (just-print))")
(* ;; "I don't remember why *PRINT-ESCAPE* was tested; I suspect PRINTDEF forces it on. Anyway, we're not using PRINTDEF any more here, I hope.")
(* ;; "otherwise just print it all on one line")
(LET (\THISFILELINELENGTH)
(DECLARE (LISP:SPECIAL \THISFILELINELENGTH))
(* ;; "CommonLisp streams do not observe line length")
(\PRINDATUM OBJECT (\GETSTREAM STREAM 'OUTPUT)
0)))
(DEFINEQ
(LISP:WRITE-TO-STRING
(LISP:LAMBDA (OBJECT &KEY ((:ESCAPE *PRINT-ESCAPE*)
*PRINT-ESCAPE*)
((:RADIX *PRINT-RADIX*)
*PRINT-RADIX*)
((:BASE *PRINT-BASE*)
*PRINT-BASE*)
((:CIRCLE *PRINT-CIRCLE*)
*PRINT-CIRCLE*)
((:PRETTY *PRINT-PRETTY*)
*PRINT-PRETTY*)
((:LEVEL *PRINT-LEVEL*)
*PRINT-LEVEL*)
((:LENGTH *PRINT-LENGTH*)
*PRINT-LENGTH*)
((:CASE *PRINT-CASE*)
*PRINT-CASE*)
((:ARRAY *PRINT-ARRAY*)
*PRINT-ARRAY*)
((:GENSYM *PRINT-GENSYM*)
*PRINT-GENSYM*)
((:PPRINT-DISPATCH XP:*PRINT-PPRINT-DISPATCH*)
XP:*PRINT-PPRINT-DISPATCH*)
((:RIGHT-MARGIN XP:*PRINT-RIGHT-MARGIN*)
XP:*PRINT-RIGHT-MARGIN*)
((:LINES XP:*PRINT-LINES*)
XP:*PRINT-LINES*)
((:MISER-WIDTH XP:*PRINT-MISER-WIDTH*)
XP:*PRINT-MISER-WIDTH*)
((:READABLY LISP:*PRINT-READABLY*)
LISP:*PRINT-READABLY*)) (* ; "Edited 11-Oct-91 23:58 by jrb:")
"Returns the printed representation of OBJECT as a string."
(LISP:WHEN LISP:*PRINT-READABLY* (HANDLE-PRINT-READABLY))
(LISP:IF *PRINT-PRETTY*
(LISP:WITH-OUTPUT-TO-STRING (LISP::S)
(WRITE OBJECT :STREAM LISP::S))
(\PRINDATUM.TO.STRING OBJECT))))
(LISP:PRIN1-TO-STRING
[LAMBDA (OBJECT) (* ; "Edited 20-Oct-91 21:25 by jrb:")
(* ;;; "Produces a string consisting of the output of (PRIN1 OBJECT)")
(LET ((*PRINT-ESCAPE* T))
(* ;;
"We force the *PRINT-READABLY* case through WRITE-TO-STRING to let it rebind the control variables ")
(COND
(LISP:*PRINT-READABLY* (LISP:WRITE-TO-STRING OBJECT))
(*PRINT-PRETTY* (LISP:WITH-OUTPUT-TO-STRING (LISP::S)
(WRITE OBJECT :STREAM LISP::S)))
(T (\PRINDATUM.TO.STRING OBJECT])
(LISP:PRINC-TO-STRING
[LAMBDA (OBJECT) (* ; "Edited 20-Oct-91 21:24 by jrb:")
(* ;;;
"A lot like MKSTRING, but not quite. Produces a string consisting of the output of (PRINC OBJECT)")
(LET ((*PRINT-ESCAPE* NIL))
(* ;;
"We force the *PRINT-READABLY* case through WRITE-TO-STRING to let it rebind the control variables ")
(COND
(LISP:*PRINT-READABLY* (LISP:WRITE-TO-STRING OBJECT))
(*PRINT-PRETTY* (LISP:WITH-OUTPUT-TO-STRING (LISP::S)
(WRITE OBJECT :STREAM LISP::S)))
(T (\PRINDATUM.TO.STRING OBJECT])
)
(DEFINEQ
(WRITE-STRING*
[LAMBDA (STRING STREAM START END) (* ; "Edited 21-Oct-91 13:20 by jrb:")
(OR STREAM (SETQ STREAM *STANDARD-OUTPUT*))
(LISP:UNLESS (EQ LISP:*PRINT-READABLY* 'XCL::PRINTING-READABLY)
(LISP::CHECK-READABLY STRING 'WRITE-STRING*))
(LISP:IF (AND *PRINT-PRETTY* (XP::XP-STRUCTURE-P STREAM))
(XP::WRITE-STRING+ STRING STREAM START END)
[LET ((STRING-LENGTH (LISP:LENGTH STRING)))
(OR START (SETQ START 0))
(LISP:CHECK-TYPE STRING STRING)
(LISP:WHEN (NULL END)
(SETQ END STRING-LENGTH))
(LISP:ASSERT (AND (<= 0 START STRING-LENGTH)
(<= START END STRING-LENGTH))
'(START END)
"Start (~D) or end (~D) argument out of bounds." START END)
(* ;; "The following comes mainly from \PRINSTRING...")
(LET ((CHARS-TO-PRINT (- END START))
\THISFILELINELENGTH)
(DECLARE (SPECVARS \THISFILELINELENGTH))
(LISP:WHEN (LISP:PLUSP CHARS-TO-PRINT)
(.SPACECHECK. STREAM CHARS-TO-PRINT)
(* ;; "Essentially (for x instring string do (\outchar strm x)).")
(LISP:DO [(FATP (ffetch (STRINGP FATSTRINGP) of STRING))
(BASE (ffetch (STRINGP BASE) of STRING))
(OFFSET (IPLUS START (ffetch (STRINGP OFFST) of STRING))
(ADD1 OFFSET))
(END (IPLUS END (ffetch (STRINGP OFFST) of STRING]
((>= OFFSET END))
(\OUTCHAR STREAM (LISP:IF FATP
(\GETBASEFAT BASE OFFSET)
(\GETBASETHIN BASE OFFSET)))))])
STRING])
)
(LISP:DEFUN LISP:WRITE-STRING (STRING &OPTIONAL (STREAM *STANDARD-OUTPUT*)
&KEY
(START 0)
(END (LISP:LENGTH STRING)))
(* ; "Edited 6-May-92 13:23 by jrb:")
(WRITE-STRING* STRING (\GETSTREAM STREAM 'OUTPUT)
START END)
STRING)
(LISP:DEFUN LISP:WRITE-LINE (STRING &OPTIONAL (STREAM *STANDARD-OUTPUT*)
&KEY
(LISP::START 0)
LISP::END)
(SETQ STREAM (\GETSTREAM STREAM 'OUTPUT))
(LISP:UNLESS (EQ LISP:*PRINT-READABLY* 'XCL::PRINTING-READABLY)
(LISP::CHECK-READABLY STRING 'LISP:WRITE-LINE))
(COND
((AND *PRINT-PRETTY* (XP::XP-STRUCTURE-P STREAM))
(PROGN (XP::WRITE-STRING+ STRING STREAM LISP::START LISP::END)
(XP::PPRINT-NEWLINE+ :UNCONDITIONAL STREAM)))
(T (WRITE-STRING* STRING STREAM LISP::START LISP::END)
(LISP:TERPRI STREAM)))
STRING)
(RPAQ? XCL:*PRINT-STRUCTURE* )
(LISP:DEFVAR LISP:*PRINT-READABLY* NIL)
(PUTPROPS CMLPRINT FILETYPE :FAKE-COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA LISP:WRITE-TO-STRING LISP:PRINC LISP:PPRINT LISP:PRINT LISP:PRIN1 LISP:WRITE-CHAR
WRITE)
)
(PUTPROPS CMLPRINT COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1988 1990 1991 1992 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (1214 8835 (WRITE 1224 . 4704) (LISP:WRITE-CHAR 4706 . 5230) (LISP:PRIN1 5232 . 5413)
(LISP:PRINT 5415 . 6424) (LISP:TERPRI 6426 . 6882) (LISP:FRESH-LINE 6884 . 7373) (LISP:FINISH-OUTPUT
7375 . 7675) (LISP:FORCE-OUTPUT 7677 . 7974) (LISP:CLEAR-OUTPUT 7976 . 8342) (LISP:PPRINT 8344 . 8646)
(LISP:PRINC 8648 . 8833)) (9611 12737 (LISP:WRITE-TO-STRING 9621 . 11419) (LISP:PRIN1-TO-STRING 11421
. 12054) (LISP:PRINC-TO-STRING 12056 . 12735)) (12738 14726 (WRITE-STRING* 12748 . 14724)))))
STOP

BIN
CLTL2/CMLPRINT.LCOM Normal file

Binary file not shown.

104
CLTL2/CMLPROGV Normal file
View File

@@ -0,0 +1,104 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 14:37:11" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLPROGV.;2" 5917
previous date%: " 3-Sep-91 17:48:59" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLPROGV.;1")
(* ; "
Copyright (c) 1986, 1987, 1990, 1991, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLPROGVCOMS)
(RPAQQ CMLPROGVCOMS ((FNS \DO.PROGV \DO.PROGV.SETUP.FRAME.AND.EXECUTE)
(SPECIAL-FORMS LISP:PROGV)
(PROP DMACRO LISP:PROGV)
(PROP FILETYPE CMLPROGV)))
(DEFINEQ
(\DO.PROGV
[LAMBDA (VARS VALUES FNTOCALL) (* ; "Edited 21-Jan-91 17:10 by jds")
(* ;; "call FNTOCALL after binding VARS to VALUES")
(DECLARE (LOCALVARS . T))
(LET ((NVARS 0)
NTSIZE NNILS TMP)
(for VAR in VARS do
(* ;; "Count number of vars to bind, check their validity")
(CHECK-BINDABLE VAR)
(add NVARS 1))
(.CALLAFTERPUSHINGNILS. (SETQ NNILS (IPLUS NVARS (SETQ NTSIZE
(CEIL [ADD1 (UNFOLD NVARS (CONSTANT (
WORDSPERNAMEENTRY
]
WORDSPERQUAD))
(FOLDHI (fetch (FNHEADER OVERHEADWORDS)
of T)
WORDSPERCELL)
(SUB1 CELLSPERQUAD)))
(\DO.PROGV.SETUP.FRAME.AND.EXECUTE NNILS NVARS NTSIZE VARS VALUES))
(LISP:FUNCALL FNTOCALL])
(\DO.PROGV.SETUP.FRAME.AND.EXECUTE
[LAMBDA (NNILS NVARS NTSIZE VARS VALUES) (* ; "Edited 30-Jan-91 19:02 by jds")
(DECLARE (LOCALVARS . T))
(PROG ((CALLER (\MYALINK))
NILSTART NT HEADER)
(* ;;; "Create a nametable inside CALLER where \DO.PROGV pushed all those NILs")
(SETQ HEADER (fetch (FX FNHEADER) of CALLER))
(* ;
 "The function header of code for \DO.PROGV")
(SETQ NT (ADDSTACKBASE (CEIL (IPLUS (SETQ NILSTART (IDIFFERENCE (fetch (FX NEXTBLOCK)
of CALLER)
(UNFOLD NNILS WORDSPERCELL)))
(UNFOLD NVARS WORDSPERCELL))
WORDSPERQUAD)))
(* ;; "Address of our synthesized nametable: beginning of NIL's, not counting additional PVARs we are about to bind, rounded up to quadword")
(for VAR in VARS as VAR# from (FOLDLO (IDIFFERENCE NILSTART
(fetch (FX FIRSTPVAR)
of CALLER))
WORDSPERCELL) as NT1
from (fetch (FNHEADER OVERHEADWORDS) of T) by (CONSTANT (
WORDSPERNAMEENTRY
)) as
NT2
from (IPLUS (fetch (FNHEADER OVERHEADWORDS) of T)
NTSIZE) by (CONSTANT (WORDSPERNTOFFSETENTRY)) as VALUEOFF
from NILSTART by WORDSPERCELL do [PUTBASEPTR \STACKSPACE VALUEOFF
(COND
(VALUES (pop VALUES))
(T 'NOBIND]
(SETSTKNAME-RAW NT NT1 (\ATOMVALINDEX VAR))
(SETSTKNTOFFSET-RAW NT NT2 PVARCODE VAR#))
(* ;;; "now fix up header of NT")
(replace (FNHEADER FRAMENAME) of NT with '\PROGV)
(replace (FNHEADER NTSIZE) of NT with NTSIZE)
(replace (FX NAMETABLE) of CALLER with NT])
)
(DEFINE-SPECIAL-FORM LISP:PROGV (LISP::VARIABLES LISP:VALUES &REST LISP::$$PROGV-FORMS
&ENVIRONMENT LISP::$$PROGV-ENVIRONMENT)
(* ;; "$$PROGV-FORMS and $$PROGV-ENVIRONMENT are named this wierd way because the interpreter is still compiled with the ByteCompiler and those variables will eventually be made special by that compiler. They can get normal names whenever the new compiler starts being used on this file.")
[\DO.PROGV (LISP:EVAL LISP::VARIABLES LISP::$$PROGV-ENVIRONMENT)
(LISP:EVAL LISP:VALUES LISP::$$PROGV-ENVIRONMENT)
#'(LISP:LAMBDA NIL (\EVAL-PROGN LISP::$$PROGV-FORMS LISP::$$PROGV-ENVIRONMENT])
(PUTPROPS LISP:PROGV DMACRO [(VARIABLES VALUES . FORMS)
(\DO.PROGV VARIABLES VALUES #'(LAMBDA NIL . FORMS])
(PUTPROPS CMLPROGV FILETYPE LISP:COMPILE-FILE)
(PUTPROPS CMLPROGV COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (639 4897 (\DO.PROGV 649 . 2064) (\DO.PROGV.SETUP.FRAME.AND.EXECUTE 2066 . 4895)))))
STOP

BIN
CLTL2/CMLPROGV.LCOM Normal file

Binary file not shown.

334
CLTL2/CMLREAD Normal file
View File

@@ -0,0 +1,334 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED " 8-Jun-90 14:17:52" |{PELE:MV:ENVOS}<LISPCORE>SOURCES>CMLREAD.;3| 15466
changes to%: (FNS CL:READ-FROM-STRING)
previous date%: "16-May-90 14:23:07" |{PELE:MV:ENVOS}<LISPCORE>SOURCES>CMLREAD.;2|)
(* ; "
Copyright (c) 1985, 1986, 1987, 1988, 1990 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLREADCOMS)
(RPAQQ CMLREADCOMS [(COMS
(* ;; "Misc Common Lisp reader functions")
(FNS CL:COPY-READTABLE)
(FNS CL:READ-LINE CL:READ-CHAR CL:UNREAD-CHAR CL:PEEK-CHAR CL:LISTEN
CL:READ-CHAR-NO-HANG CL:CLEAR-INPUT CL:READ-FROM-STRING
CL:READ-BYTE CL:WRITE-BYTE)
(* ;
 "must turn off packed version of CLISP infix")
(VARS [CLISPCHARS (LDIFFERENCE CLISPCHARS '(- *]
(CLISPCHARRAY (MAKEBITTABLE CLISPCHARS))
(DWIMINMACROSFLG))
(VARIABLES *READ-DEFAULT-FLOAT-FORMAT*)
(GLOBALVARS CMLRDTBL READ-LINE-RDTBL))
[COMS
(* ;; "Crude means to aid reading and printing things in same reader environment. There are some fns and an INITRECORDS for this on ATBL to get it early in the loadup")
(RECORDS READER-ENVIRONMENT)
(FUNCTIONS WITH-READER-ENVIRONMENT)
(ADDVARS (SYSSPECVARS *PACKAGE* *READTABLE* *READ-BASE* *PRINT-BASE*))
(PROP INFO WITH-READER-ENVIRONMENT)
(GLOBALVARS *COMMON-LISP-READ-ENVIRONMENT*)
(INITVARS (*COMMON-LISP-READ-ENVIRONMENT* (create READER-ENVIRONMENT
REPACKAGE _
(CL:FIND-PACKAGE
"USER")
REREADTABLE _ CMLRDTBL
REBASE _ 10]
(PROP FILETYPE CMLREAD)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDVARS (NLAMA)
(NLAML)
(LAMA CL:READ-BYTE CL:READ-FROM-STRING CL:CLEAR-INPUT
CL:READ-CHAR-NO-HANG CL:PEEK-CHAR CL:UNREAD-CHAR
CL:READ-CHAR CL:READ-LINE CL:COPY-READTABLE])
(* ;; "Misc Common Lisp reader functions")
(DEFINEQ
(CL:COPY-READTABLE
[CL:LAMBDA (&OPTIONAL (FROM-READTABLE *READTABLE*)
TO-READTABLE) (* bvm%: "13-Oct-86 15:21")
(* ;
 "If FROM-READTABLE is NIL, then a copy of a standard Common Lisp readtable is made.")
(if (AND (NULL FROM-READTABLE)
(NULL TO-READTABLE))
then (* ; "just make a brand new one")
(CMLRDTBL)
else (SETQ FROM-READTABLE (\DTEST (OR FROM-READTABLE (CMLRDTBL))
'READTABLEP))
(if TO-READTABLE
then (RESETREADTABLE (\DTEST TO-READTABLE 'READTABLEP)
FROM-READTABLE)
TO-READTABLE
else (COPYREADTABLE FROM-READTABLE])
)
(DEFINEQ
(CL:READ-LINE
[CL:LAMBDA (&OPTIONAL STREAM (EOF-ERRORP T)
EOF-VALUE RECURSIVE-P) (* ; "Edited 31-Mar-87 18:36 by bvm:")
(* ;;
 "Returns a line of text read from the STREAM as a string, discarding the newline character.")
(CL:SETQ STREAM (\GETSTREAM STREAM 'INPUT))
(if (AND (NULL EOF-ERRORP)
(NULL RECURSIVE-P)
(\EOFP STREAM))
then EOF-VALUE
else (LET ((RESULT (RSTRING STREAM READ-LINE-RDTBL)))
(if (\EOFP STREAM)
then (CL:VALUES RESULT T)
else (* ; "consume the eol")
(READCCODE STREAM)
(CL:VALUES RESULT NIL])
(CL:READ-CHAR
[CL:LAMBDA (&OPTIONAL (STREAM *STANDARD-INPUT*)
(EOF-ERRORP T)
EOF-VALUE RECURSIVE-P) (* ; "Edited 14-Dec-86 20:41 by bvm:")
(* ;; "Inputs a character from STREAM and returns it.")
(LET [(STREAM (\GETSTREAM STREAM 'INPUT]
(COND
((AND (NOT EOF-ERRORP)
(NOT RECURSIVE-P)
(\EOFP STREAM))
EOF-VALUE)
(T (CL:CODE-CHAR (READCCODE STREAM])
(CL:UNREAD-CHAR
(CL:LAMBDA (CHARACTER &OPTIONAL (INPUT-STREAM *STANDARD-INPUT*))
(* bvm%: "13-Oct-86 15:44")
(* ;; "Puts the CHARACTER back on the front of the input STREAM. According to the manual, `One may apply UNREAD-CHAR only to the character most recently read from INPUT-STREAM.'")
(\BACKCHAR (\GETSTREAM INPUT-STREAM 'INPUT))
NIL))
(CL:PEEK-CHAR
[CL:LAMBDA (&OPTIONAL (PEEK-TYPE NIL)
(STREAM *STANDARD-INPUT*)
(EOF-ERRORP T)
EOF-VALUE RECURSIVE-P) (* ; "Edited 14-Apr-87 14:39 by bvm:")
(* ;; "Peeks at the next character in the input Stream. See manual for details.")
(DECLARE (IGNORE RECURSIVE-P))
(LET ((STREAM (\GETSTREAM STREAM 'INPUT))
(\RefillBufferFn '\PEEKREFILL)
CL:CHAR)
(DECLARE (CL:SPECIAL \RefillBufferFn))
(SELECTQ PEEK-TYPE
(NIL (* ; "standard case--return next char. \peekccode to terminal requires the binding of \RefillBufferFn above")
(if (SETQ CL:CHAR (\PEEKCCODE STREAM (NULL EOF-ERRORP)))
then (CL:CODE-CHAR CL:CHAR)
else EOF-VALUE))
(T (* ; "skip whitespace before peeking")
(if (SETQ CL:CHAR (SKIPSEPRCODES STREAM))
then (CL:CODE-CHAR CL:CHAR)
elseif EOF-ERRORP
then (\EOF.ACTION STREAM)
else EOF-VALUE))
(if (CL:CHARACTERP PEEK-TYPE)
then (LET ((DESIREDCHAR (CL:CHAR-CODE PEEK-TYPE))
(NOERROR (NULL EOF-ERRORP)))
(until (EQ (SETQ CL:CHAR (\PEEKCCODE STREAM NOERROR))
DESIREDCHAR) do (if (NULL CL:CHAR)
then (RETURN EOF-VALUE))
(READCCODE STREAM)
finally (RETURN PEEK-TYPE)))
else (\ILLEGAL.ARG PEEK-TYPE])
(CL:LISTEN
(CL:LAMBDA (&OPTIONAL STREAM) (* ; "Edited 14-Apr-87 16:49 by bvm:")
(* ;; "Returns T if a character is available on the given STREAM ")
(READP (\GETSTREAM STREAM 'INPUT)
T)))
(CL:READ-CHAR-NO-HANG
(CL:LAMBDA (&OPTIONAL STREAM (EOF-ERRORP T)
EOF-VALUE RECURSIVE-P) (* ; "Edited 14-Apr-87 16:40 by bvm:")
(* ;; "Returns the next character from the STREAM if one is available, or NIL. However, if STREAM is at eof, do eof handling.")
(COND
((READP STREAM T) (* ; "there is input, get it")
(CL:READ-CHAR STREAM EOF-ERRORP EOF-VALUE RECURSIVE-P))
((NOT (EOFP STREAM)) (* ;
 "there could be more input, so don't wait, return NIL")
NIL)
(EOF-ERRORP (\EOF.ACTION STREAM))
(T EOF-VALUE))))
(CL:CLEAR-INPUT
[CL:LAMBDA (&OPTIONAL (STREAM *STANDARD-INPUT*)) (* bvm%: "13-Oct-86 15:46")
(* ;; "Clears any buffered input associated with the Stream.")
(CLEARBUF (\GETSTREAM STREAM 'INPUT])
(CL:READ-FROM-STRING
[CL:LAMBDA (STRING &OPTIONAL EOF-ERROR-P EOF-VALUE &KEY START END PRESERVE-WHITESPACE)
(* ; "Edited 8-Jun-90 14:15 by ymasuda")
(LET [(STREAM (OPENSTRINGSTREAM (COND
[END (SUBSTRING STRING 1 (IMIN END (NCHARS STRING]
(T (MKSTRING STRING]
(COND
(START (SETFILEPTR STREAM START)))
(CL:VALUES (CL:IF PRESERVE-WHITESPACE
(CL:READ-PRESERVING-WHITESPACE STREAM EOF-ERROR-P EOF-VALUE)
(CL:READ STREAM EOF-ERROR-P EOF-VALUE))
(\GETFILEPTR STREAM])
(CL:READ-BYTE
[CL:LAMBDA (BINARY-INPUT-STREAM &OPTIONAL (EOF-ERRORP T)
EOF-VALUE) (* bvm%: "13-Oct-86 15:49")
(* ;; "Returns the next byte of the BINARY-INPUT-STREAM")
(LET [(STREAM (\GETSTREAM BINARY-INPUT-STREAM 'INPUT]
(CL:IF (AND (NOT EOF-ERRORP)
(\EOFP STREAM))
EOF-VALUE
(\BIN STREAM])
(CL:WRITE-BYTE
(CL:LAMBDA (INTEGER BINARY-OUTPUT-STREAM) (* bvm%: "13-Oct-86 15:49")
(* ;; "Outputs the INTEGER to the binary BINARY-OUTPUT-STREAM")
(BOUT BINARY-OUTPUT-STREAM INTEGER)
INTEGER))
)
(* ; "must turn off packed version of CLISP infix")
(RPAQ CLISPCHARS (LDIFFERENCE CLISPCHARS '(- *)))
(RPAQ CLISPCHARRAY (MAKEBITTABLE CLISPCHARS))
(RPAQQ DWIMINMACROSFLG NIL)
(CL:DEFVAR *READ-DEFAULT-FLOAT-FORMAT* 'CL:SINGLE-FLOAT)
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(GLOBALVARS CMLRDTBL READ-LINE-RDTBL)
)
(* ;;
"Crude means to aid reading and printing things in same reader environment. There are some fns and an INITRECORDS for this on ATBL to get it early in the loadup"
)
(DECLARE%: EVAL@COMPILE
(DATATYPE READER-ENVIRONMENT (REPACKAGE REREADTABLE REBASE RESPEC))
)
(/DECLAREDATATYPE 'READER-ENVIRONMENT '(POINTER POINTER POINTER POINTER)
'((READER-ENVIRONMENT 0 POINTER)
(READER-ENVIRONMENT 2 POINTER)
(READER-ENVIRONMENT 4 POINTER)
(READER-ENVIRONMENT 6 POINTER))
'8)
(DEFMACRO WITH-READER-ENVIRONMENT (ENV . BODY)
`((CL:LAMBDA (E)
(LET ((*PACKAGE* (ffetch (READER-ENVIRONMENT REPACKAGE) of E))
(*READTABLE* (ffetch (READER-ENVIRONMENT REREADTABLE) of E))
(*READ-BASE* (ffetch (READER-ENVIRONMENT REBASE) of E))
(*PRINT-BASE* (ffetch (READER-ENVIRONMENT REBASE) of E)))
,@BODY))
(\DTEST ,ENV 'READER-ENVIRONMENT)))
(ADDTOVAR SYSSPECVARS *PACKAGE* *READTABLE* *READ-BASE* *PRINT-BASE*)
(PUTPROPS WITH-READER-ENVIRONMENT INFO EVAL)
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(GLOBALVARS *COMMON-LISP-READ-ENVIRONMENT*)
)
(RPAQ? *COMMON-LISP-READ-ENVIRONMENT* (create READER-ENVIRONMENT REPACKAGE _ (CL:FIND-PACKAGE
"USER")
REREADTABLE _ CMLRDTBL REBASE _ 10))
(PUTPROPS CMLREAD FILETYPE CL:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA CL:READ-BYTE CL:READ-FROM-STRING CL:CLEAR-INPUT CL:READ-CHAR-NO-HANG CL:PEEK-CHAR
CL:UNREAD-CHAR CL:READ-CHAR CL:READ-LINE CL:COPY-READTABLE)
)
(PRETTYCOMPRINT CMLREADCOMS)
(RPAQQ CMLREADCOMS
[(COMS
(* ;; "Misc Common Lisp reader functions")
(FNS CL:COPY-READTABLE)
(FNS CL:READ-LINE CL:READ-CHAR CL:UNREAD-CHAR CL:PEEK-CHAR CL:LISTEN
CL:READ-CHAR-NO-HANG CL:CLEAR-INPUT CL:READ-FROM-STRING CL:READ-BYTE CL:WRITE-BYTE
)
(* ;
 "must turn off packed version of CLISP infix")
(VARS [CLISPCHARS (LDIFFERENCE CLISPCHARS '(- *]
(CLISPCHARRAY (MAKEBITTABLE CLISPCHARS))
(DWIMINMACROSFLG))
(VARIABLES *READ-DEFAULT-FLOAT-FORMAT*)
(GLOBALVARS CMLRDTBL READ-LINE-RDTBL))
[COMS
(* ;; "Crude means to aid reading and printing things in same reader environment. There are some fns and an INITRECORDS for this on ATBL to get it early in the loadup")
(RECORDS READER-ENVIRONMENT)
(FUNCTIONS WITH-READER-ENVIRONMENT)
(ADDVARS (SYSSPECVARS *PACKAGE* *READTABLE* *READ-BASE* *PRINT-BASE*))
(PROP INFO WITH-READER-ENVIRONMENT)
(GLOBALVARS *COMMON-LISP-READ-ENVIRONMENT*)
(INITVARS (*COMMON-LISP-READ-ENVIRONMENT* (create READER-ENVIRONMENT REPACKAGE _
(CL:FIND-PACKAGE "USER")
REREADTABLE _ CMLRDTBL REBASE _ 10]
(PROP FILETYPE CMLREAD)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDVARS (NLAMA)
(NLAML)
(LAMA CL:WRITE-BYTE CL:READ-BYTE CL:READ-FROM-STRING CL:CLEAR-INPUT
CL:READ-CHAR-NO-HANG CL:LISTEN CL:PEEK-CHAR CL:UNREAD-CHAR CL:READ-CHAR
CL:READ-LINE CL:COPY-READTABLE])
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA CL:WRITE-BYTE CL:READ-BYTE CL:READ-FROM-STRING CL:CLEAR-INPUT CL:READ-CHAR-NO-HANG
CL:LISTEN CL:PEEK-CHAR CL:UNREAD-CHAR CL:READ-CHAR CL:READ-LINE
CL:COPY-READTABLE)
)
(PUTPROPS CMLREAD COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1988 1990))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (3113 4089 (CL:COPY-READTABLE 3123 . 4087)) (4090 10834 (CL:READ-LINE 4100 . 4967) (
CL:READ-CHAR 4969 . 5534) (CL:UNREAD-CHAR 5536 . 5995) (CL:PEEK-CHAR 5997 . 8003) (CL:LISTEN 8005 .
8285) (CL:READ-CHAR-NO-HANG 8287 . 9076) (CL:CLEAR-INPUT 9078 . 9330) (CL:READ-FROM-STRING 9332 .
10087) (CL:READ-BYTE 10089 . 10561) (CL:WRITE-BYTE 10563 . 10832)))))
STOP

BIN
CLTL2/CMLREAD.LCOM Normal file

Binary file not shown.

156
CLTL2/CMLREADTABLE Normal file
View File

@@ -0,0 +1,156 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "25-Oct-91 16:19:12" {DSK}<usr>local>lde>lispcore>sources>CMLREADTABLE.;3 21290
changes to%: (VARS CMLREADTABLECOMS) (VARIABLES CL:*READ-EVAL*) (FUNCTIONS HASH-DOT)
previous date%: "15-Aug-91 23:36:53" {DSK}<usr>local>lde>lispcore>sources>CMLREADTABLE.;2)
(* ; "
Copyright (c) 1986, 1987, 1990, 1991 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLREADTABLECOMS)
(RPAQQ CMLREADTABLECOMS ((COMS (* ; "Common Lisp readtable interface functions ") (FUNCTIONS HASH-LEFT-PAD-INITIAL-CONTENTS CL:SET-SYNTAX-FROM-CHAR CL:GET-DISPATCH-MACRO-CHARACTER CL:GET-MACRO-CHARACTER CL:MAKE-DISPATCH-MACRO-CHARACTER CL:SET-DISPATCH-MACRO-CHARACTER CL:SET-MACRO-CHARACTER CL:READTABLE-CASE CL::SET-READTABLE-CASE) (SETFS CL:READTABLE-CASE) (FUNCTIONS DO-DISPATCH-MACRO FIND-MACRO-FUNCTION CL-MACRO-WRAPPED-P CL-UNWRAP-MACRO CL-WRAP-MACRO IL-MACRO-WRAPPED-P IL-UNWRAP-MACRO IL-WRAP-MACRO)) (COMS (* ; "hash macro sub functions") (FUNCTIONS HASH-LEFTPAREN HASH-A HASH-B HASH-BACKSLASH HASH-C HASH-COLON HASH-COMMA HASH-DOT HASH-DOUBLEQUOTE HASH-ILLEGAL-HASH-CHAR HASH-LEFTANGLE HASH-MINUS HASH-NO-PARAMETER-ERROR HASH-O HASH-P HASH-PLUS HASH-QUOTE HASH-R HASH-S HASH-STAR HASH-VBAR HASH-X HASH-EQUAL HASH-NUMBER-SIGN HASH-STRUCTURE-SMASH HASH-STRUCTURE-LOOKUP) (* ; "Temporary") (VARIABLES *READ-SUPPRESS* CL:*READ-EVAL*)) (COMS (* ; "Common Lisp default readtables") (FNS CMLRDTBL INIT-CML-READTABLES SET-DEFAULT-HASHMACRO-SETTINGS CMLREADSEMI) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (INIT-CML-READTABLES)))) (PROP FILETYPE CMLREADTABLE)))
(* ; "Common Lisp readtable interface functions ")
(CL:DEFUN HASH-LEFT-PAD-INITIAL-CONTENTS (SIZE IVAL-LIST) (LET ((PADLENGTH (- SIZE (LENGTH IVAL-LIST)))) (COND ((> PADLENGTH 0) (APPEND IVAL-LIST (CL:MAKE-LIST PADLENGTH :INITIAL-ELEMENT (CAR (LAST IVAL-LIST))))) (T (CL:ERROR "Values list too long for #~D()" SIZE)))))
(CL:DEFUN CL:SET-SYNTAX-FROM-CHAR (TO-CHAR FROM-CHAR &OPTIONAL (TO-READTABLE *READTABLE*) (FROM-READTABLE CMLRDTBL)) (SETSYNTAX (CL:CHAR-CODE TO-CHAR) (GETSYNTAX (CL:CHAR-CODE FROM-CHAR) FROM-READTABLE) TO-READTABLE) T)
(CL:DEFUN CL:GET-DISPATCH-MACRO-CHARACTER (DISP-CHAR SUB-CHAR &OPTIONAL (READTABLE *READTABLE*)) (CL:WHEN (AND RTP (NULL READTABLE)) (SETQ READTABLE (FIND-READTABLE "LISP"))) (CDR (ASSOC SUB-CHAR (CDR (ASSOC DISP-CHAR (fetch (READTABLEP DISPATCHMACRODEFS) of READTABLE))))))
(CL:DEFUN CL:GET-MACRO-CHARACTER (CHAR &OPTIONAL (READTABLE *READTABLE* RTP)) (CL:WHEN (AND RTP (NULL READTABLE)) (SETQ READTABLE (FIND-READTABLE "LISP"))) (* ;;; "insures entry is Common Lisp form - (MACRO {FIRST,ALWAYS} (LAMBDA (STREAM READTABLE) (FUNCALL <function> '<char> STREAM))))") (LET ((TABENTRY (GETSYNTAX (CL:CHAR-CODE CHAR) READTABLE)) NON-TERMINATING-P) (AND (CL:CONSP TABENTRY) (EQ (CAR TABENTRY) (QUOTE MACRO)) (CL:CONSP (CDR TABENTRY)) (FMEMB (CADR TABENTRY) (QUOTE (ALWAYS FIRST))) (SETQ NON-TERMINATING-P (CADR TABENTRY)) (CL:CONSP (SETQ TABENTRY (CDDR TABENTRY))) (NULL (CDR TABENTRY)) (CL:VALUES (FIND-MACRO-FUNCTION (CAR TABENTRY)) (NEQ NON-TERMINATING-P (QUOTE ALWAYS))))))
(CL:DEFUN CL:MAKE-DISPATCH-MACRO-CHARACTER (CHAR &OPTIONAL NON-TERMINATING (READTABLE *READTABLE*)) (SETSYNTAX (CL:CHAR-CODE CHAR) (BQUOTE (MACRO (\, (CL:IF NON-TERMINATING (QUOTE FIRST) (QUOTE ALWAYS))) (LAMBDA (STREAM READTABLE Z) (DO-DISPATCH-MACRO (\, CHAR) STREAM READTABLE)))) READTABLE) T)
(CL:DEFUN CL:SET-DISPATCH-MACRO-CHARACTER (DISP-CHAR SUB-CHAR FUNCTION &OPTIONAL (READTABLE *READTABLE*)) (CL:IF (CL:DIGIT-CHAR-P SUB-CHAR) (CL:ERROR "Digit ~S illegal as a sub-character for a dispatching macro" SUB-CHAR)) (SETQ SUB-CHAR (CL:CHAR-UPCASE SUB-CHAR)) (LET ((DISP-TABLE (OR (ASSOC DISP-CHAR (fetch (READTABLEP DISPATCHMACRODEFS) of READTABLE)) (LET ((NEWTABLE (LIST DISP-CHAR))) (push (fetch (READTABLEP DISPATCHMACRODEFS) of READTABLE) NEWTABLE) NEWTABLE))) DISP-CONS) (if (SETQ DISP-CONS (ASSOC SUB-CHAR (CDR DISP-TABLE))) then (CL:SETF (CDR DISP-CONS) FUNCTION) else (push (CDR DISP-TABLE) (CONS SUB-CHAR FUNCTION))) T))
(CL:DEFUN CL:SET-MACRO-CHARACTER (CHAR FUNCTION &OPTIONAL NON-TERMINATING (READTABLE *READTABLE*)) (SETSYNTAX (CL:CHAR-CODE CHAR) (BQUOTE (MACRO (\, (CL:IF NON-TERMINATING (QUOTE FIRST) (QUOTE ALWAYS))) (\, (COND ((IL-MACRO-WRAPPED-P FUNCTION) (IL-UNWRAP-MACRO FUNCTION)) (T (CL-WRAP-MACRO FUNCTION CHAR)))))) READTABLE) T)
(CL:DEFUN CL:READTABLE-CASE (CL:READTABLE) (CL:IF (fetch (READTABLEP CASEINSENSITIVE) of CL:READTABLE) (CL:IF (fetch (READTABLEP LOWER/FLIPCASE) of CL:READTABLE) :DOWNCASE :UPCASE) (CL:IF (fetch (READTABLEP LOWER/FLIPCASE) of CL:READTABLE) :INVERT :PRESERVE)))
(CL:DEFUN CL::SET-READTABLE-CASE (CL:READTABLE CL::NEW-CASE) (CL:ECASE CL::NEW-CASE (:PRESERVE (CL:SETF (fetch (READTABLEP CASEINSENSITIVE) of CL:READTABLE) NIL (fetch (READTABLEP LOWER/FLIPCASE) of CL:READTABLE) NIL)) (:UPCASE (CL:SETF (fetch (READTABLEP CASEINSENSITIVE) of CL:READTABLE) T (fetch (READTABLEP LOWER/FLIPCASE) of CL:READTABLE) NIL)) (:DOWNCASE (CL:SETF (fetch (READTABLEP CASEINSENSITIVE) of CL:READTABLE) T (fetch (READTABLEP LOWER/FLIPCASE) of CL:READTABLE) T)) (:INVERT (CL:SETF (fetch (READTABLEP CASEINSENSITIVE) of CL:READTABLE) NIL (fetch (READTABLEP LOWER/FLIPCASE) of CL:READTABLE) T))) CL::NEW-CASE)
(CL:DEFSETF CL:READTABLE-CASE CL::SET-READTABLE-CASE)
(CL:DEFUN DO-DISPATCH-MACRO (CHAR STREAM RDTBL) (LET ((*READTABLE* RDTBL) (DISP-TABLE (CDR (ASSOC CHAR (fetch (READTABLEP DISPATCHMACRODEFS) of RDTBL)))) INDEX NEXTCHAR) (COND ((NOT DISP-TABLE) (CL:ERROR "~S is not a dispatch macro character" CHAR)) (T (* ; "DISPATCHMACRODEFS is a list of A-lists") (while (DIGITCHARP (SETQ NEXTCHAR (READCCODE STREAM RDTBL))) do (* ; "read the optional numeric arg") (SETQ INDEX (+ (TIMES (OR INDEX 0) 10) (- NEXTCHAR (CHARCODE 0))))) (LET* ((DISP-CHARACTER (CL:CHAR-UPCASE (CL:CODE-CHAR NEXTCHAR))) (DISP-FUNCTION (CDR (ASSOC DISP-CHARACTER DISP-TABLE)))) (if DISP-FUNCTION then (CL:FUNCALL DISP-FUNCTION STREAM DISP-CHARACTER INDEX) else (CL:IF *READ-SUPPRESS* (PROGN (* ; "Attempt to ignore it") (READ-EXTENDED-TOKEN STREAM *READTABLE* T) NIL) (CL:ERROR "Undefined dispatch character ~S for dispatch macro character ~S" DISP-CHARACTER CHAR))))))))
(CL:DEFUN FIND-MACRO-FUNCTION (FORM) (COND ((CL-MACRO-WRAPPED-P FORM) (CL-UNWRAP-MACRO FORM)) ((CL:FUNCTIONP FORM) (IL-WRAP-MACRO FORM))))
(CL:DEFUN CL-MACRO-WRAPPED-P (FORM) (* ;;; "Predicate that checks for forms built by CL-WRAP-MACRO") (AND (CL:CONSP FORM) (EQ (CAR FORM) (QUOTE CL:LAMBDA)) (CL:CONSP (CDR FORM)) (CL:EQUAL (CADR FORM) (QUOTE (STREAM READTABLE Z))) (CL:CONSP (CDDR FORM)) (NULL (CDDDR FORM)) (CL:CONSP (CADDR FORM)) (EQ (CAADDR FORM) (QUOTE CL:FUNCALL))))
(CL:DEFUN CL-UNWRAP-MACRO (FORM) (* ;;; "Fetches CL function out wrapped by CL-WRAP-MACRO") (CADR (CADR (CADDR FORM))))
(CL:DEFUN CL-WRAP-MACRO (FN CHAR) (* ;;; "Wraps a form around a CL readmacro to make it acceptable as an IL readmacro") (BQUOTE (CL:LAMBDA (STREAM READTABLE Z) (CL:FUNCALL (QUOTE (\, FN)) STREAM (\, CHAR)))))
(CL:DEFUN IL-MACRO-WRAPPED-P (FORM) (* ;;; "Predicate that checks for forms built by IL-WRAP-MACRO") (AND (CL:CONSP FORM) (EQ (CAR FORM) (QUOTE CL:LAMBDA)) (CL:CONSP (CDR FORM)) (EQUAL (CADR FORM) (QUOTE (STREAM CHAR))) (CL:CONSP (SETQ FORM (CDDR FORM))) (NULL (CDR FORM)) (CL:CONSP (SETQ FORM (CAR FORM))) (EQ (CAR FORM) (QUOTE CL:FUNCALL)) (EQ (CADDR FORM) (QUOTE STREAM))))
(CL:DEFUN IL-UNWRAP-MACRO (FORM) (CADR (CADR (CADDR FORM))))
(CL:DEFUN IL-WRAP-MACRO (FORM) (* ;;; "Wraps a form around an IL readmacro to make it acceptable as a CL readmacro") (BQUOTE (CL:LAMBDA (STREAM CHAR) (CL:FUNCALL (QUOTE (\, FORM)) STREAM))))
(* ; "hash macro sub functions")
(CL:DEFUN HASH-LEFTPAREN (STREAM CHAR INDEX) (LET ((CONTENTS (CL:READ-DELIMITED-LIST #\) STREAM T))) (COND (*READ-SUPPRESS* NIL) (\INBQUOTE (* ;; "We are inside a back-quote - generate %",(coerce ',contents 'vector)%"") (CL:WHEN INDEX (CL:CERROR "Ignore the explicit length" "Explicit length not allowed in backquoted vectors:~%%#~D~S" INDEX CONTENTS)) (LIST (QUOTE \,) (BQUOTE (COERCE (\, (LIST (QUOTE BQUOTE) CONTENTS)) (QUOTE CL:VECTOR))))) (INDEX (IF (<= (LENGTH CONTENTS) INDEX) THEN (LET ((VEC (CL:MAKE-ARRAY INDEX :INITIAL-ELEMENT (CAR (LAST CONTENTS))))) (LET ((XCL-USER::T0 (LENGTH CONTENTS)) (I 0)) (CL:BLOCK NIL (LET NIL (CL:TAGBODY LOOPTAG0015 (COND ((>= I XCL-USER::T0) (RETURN NIL))) (CL:SETF (CL:AREF VEC I) (POP CONTENTS)) (CL:INCF I) (GO LOOPTAG0015))))) VEC) ELSE (CL:ERROR "Values list too long for #~D()" INDEX))) (T (CL:MAKE-ARRAY (LENGTH CONTENTS) :INITIAL-CONTENTS CONTENTS)))))
(CL:DEFUN HASH-A (STREAM CHAR PARAM) (LET ((CONTENTS (CL:READ STREAM T NIL T))) (COND (*READ-SUPPRESS* NIL) (T (CL:MAKE-ARRAY (ESTIMATE-DIMENSIONALITY PARAM CONTENTS) :INITIAL-CONTENTS CONTENTS)))))
(CL:DEFUN HASH-B (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (READ-EXTENDED-TOKEN STREAM *READTABLE* T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (READNUMBERINBASE STREAM 2))))
(CL:DEFUN HASH-BACKSLASH (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (CHARACTER.READ STREAM) NIL) (T (CL:IF (OR (NULL PARAM) (AND (TYPEP PARAM (QUOTE CL:FIXNUM)) (>= PARAM 0) (< PARAM LISP:CHAR-FONT-LIMIT))) (CHARACTER.READ STREAM) (CL:ERROR "Illegal font specifier ~S for #\" PARAM)))))
(CL:DEFUN HASH-C (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (CL:READ STREAM T NIL T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (DESTRUCTURING-BIND (NUM DEN) (CL:READ STREAM T NIL T) (COMPLEX NUM DEN)))))
(CL:DEFUN HASH-COLON (STREAM CHAR PARAM) (* ; "Uninterned symbol.") (COND (*READ-SUPPRESS* (READ-EXTENDED-TOKEN STREAM *READTABLE* T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (CL:MAKE-SYMBOL (READ-EXTENDED-TOKEN STREAM *READTABLE* T)))))
(CL:DEFUN HASH-COMMA (STREAM CHAR PARAM) (* ;;; "If the compiler is reading, then wrap up the form in a special data object to be noticed by FASL later. If it's not the compiler, then treat exactly like #.") (COND (*READ-SUPPRESS* (CL:READ STREAM T NIL T) NIL) ((NULL CL:*READ-EVAL*) (ERROR "#, encountered on ~S with *READ-EVAL* NIL" STREAM)) (T (CL:WHEN *CLTL2-PEDANTIC* (CL:CERROR "Read it anyway" "#, encountered on ~S with *CLTL2-PEDANTIC* non-NIL" STREAM)) (HASH-NO-PARAMETER-ERROR CHAR PARAM) (LET ((FORM (CL:READ STREAM T NIL T))) (IF COMPILER::*COMPILER-IS-READING* THEN (COMPILER::MAKE-EVAL-WHEN-LOAD :FORM FORM) ELSEIF (FETCH (READTABLEP COMMONLISP) OF *READTABLE*) THEN (CL:EVAL FORM) ELSE (EVAL FORM))))))
(CL:DEFUN HASH-DOT (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (CL:READ STREAM T NIL T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (CL:UNLESS CL:*READ-EVAL* (CL:CERROR "Read and eval anyway" "#. with *READ-EVAL* NIL on ~s" STREAM)) (COND ((fetch (READTABLEP COMMONLISP) of *READTABLE*) (CL:EVAL (CL:READ STREAM T NIL T))) (T (EVAL (CL:READ STREAM T NIL T)))))))
(CL:DEFUN HASH-DOUBLEQUOTE (STREAM CHAR PARAM) (* ;;; "An extension to Common Lisp. This reads a normal string but ignores CR's and any whitespace immediately following them.") (COND (*READ-SUPPRESS* (CL:READ STREAM T NIL T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (RSTRING STREAM *READTABLE* (QUOTE SKIP)))))
(CL:DEFUN HASH-ILLEGAL-HASH-CHAR (STREAM CHAR PARAM) (CL:ERROR "Illegal hash macro character ~S" CHAR))
(CL:DEFUN HASH-LEFTANGLE (STREAM CHAR PARAM) (HASH-NO-PARAMETER-ERROR CHAR PARAM) (CL:ERROR "Unreadable object #<~A>" (CL:READ STREAM T NIL T)))
(CL:DEFUN HASH-MINUS (STREAM CHAR PARAM) (* ;; "When *READ-SUPPRESS* is true, we want to simply skip over the two forms (the feature expression and the controlled expression). Otherwise, we read the feature expression and, when it applies to us, skip over the controlled expression. In any case, we never return a value.") (COND (*READ-SUPPRESS* (* ; "Skip two forms.") (CL:READ STREAM T NIL T) (CL:READ STREAM T NIL T)) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (CL:WHEN (CMLREAD.FEATURE.PARSER (LET ((*PACKAGE* *KEYWORD-PACKAGE*)) (CL:READ STREAM T NIL T))) (LET ((*READ-SUPPRESS* T)) (CL:READ STREAM T NIL T))))) (CL:VALUES))
(CL:DEFUN HASH-NO-PARAMETER-ERROR (CHAR PARAM) (CL:WHEN PARAM (CL:ERROR "Parameter ~D not allowed with hash macro ~S" PARAM CHAR)))
(CL:DEFUN HASH-O (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (READ-EXTENDED-TOKEN STREAM *READTABLE* T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (READNUMBERINBASE STREAM 8))))
(CL:DEFUN HASH-P (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (CL:READ STREAM T NIL T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (PATHNAME (CL:READ STREAM T NIL T)))))
(CL:DEFUN HASH-PLUS (STREAM CHAR PARAM) (* ;; "When *READ-SUPPRESS* is true, we want to simply skip over the two forms (the feature expression and the controlled expression). Otherwise, we read the feature expression and, unless it applies to us, skip over the controlled expression. In any case, we never return a value.") (COND (*READ-SUPPRESS* (* ; "Skip two forms.") (CL:READ STREAM T NIL T) (CL:READ STREAM T NIL T)) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (CL:UNLESS (CMLREAD.FEATURE.PARSER (LET ((*PACKAGE* *KEYWORD-PACKAGE*)) (CL:READ STREAM T NIL T))) (LET ((*READ-SUPPRESS* T)) (CL:READ STREAM T NIL T))))) (CL:VALUES))
(CL:DEFUN HASH-QUOTE (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (CL:READ STREAM T NIL T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (LIST (QUOTE CL:FUNCTION) (CL:READ STREAM T NIL T)))))
(CL:DEFUN HASH-R (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (READ-EXTENDED-TOKEN STREAM *READTABLE* T) NIL) (PARAM (READNUMBERINBASE STREAM PARAM)) (T (CL:ERROR "No base supplied for #R"))))
(CL:DEFUN HASH-S (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (CL:READ STREAM T NIL T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (CREATE-STRUCTURE (CL:READ STREAM T NIL T)))))
(CL:DEFUN HASH-STAR (STREAM CHAR PARAM) (DECLARE (IGNORE CHAR)) (IF (EQ (PEEKC STREAM) (QUOTE %()) THEN (* ; "It's a bitmap.") (IF *READ-SUPPRESS* THEN (CL:READ STREAM NIL NIL T) (CL:READ STREAM NIL NIL T) ELSEIF PARAM THEN (CL:ERROR "Unexpected parameter ~S given in #* bitmap syntax." PARAM) ELSE (FINISH-READING-BITMAP STREAM)) ELSE (* ; "It's a bit-vector.") (LET* ((CONTENTS (READ-EXTENDED-TOKEN STREAM)) (LEN (NCHARS CONTENTS))) (IF *READ-SUPPRESS* THEN NIL ELSEIF (AND (EQ LEN 0) PARAM (NEQ PARAM 0)) THEN (CL:ERROR "No contents specified for bit vector #~A*" PARAM) ELSEIF (AND PARAM (> LEN PARAM)) THEN (CL:ERROR "Bit vector contents longer than specified length in #~A*~A" PARAM CONTENTS) ELSE (LET ((BITARRAY (CL:MAKE-ARRAY (OR PARAM LEN) :ELEMENT-TYPE (QUOTE BIT) :INITIAL-ELEMENT (IF (AND PARAM (> PARAM LEN 0)) THEN (SELCHARQ (NTHCHARCODE CONTENTS -1) (0 0) (1 1) (CL:ERROR "Illegal bit vector element in #~A*~A" PARAM CONTENTS)) ELSE 0)))) (CL:DOTIMES (I LEN) (CL:SETF (CL:AREF BITARRAY I) (SELCHARQ (NTHCHARCODE CONTENTS (CL:1+ I)) (0 0) (1 1) (CL:ERROR "Illegal bit vector element in #~A*~A" PARAM CONTENTS)))) BITARRAY)))))
(CL:DEFUN HASH-VBAR (STREAM CHAR PARAM) (OR *READ-SUPPRESS* (HASH-NO-PARAMETER-ERROR CHAR PARAM)) (LET ((*READ-SUPPRESS* T)) (SKIP.HASH.COMMENT STREAM *READTABLE*) (CL:VALUES)))
(CL:DEFUN HASH-X (STREAM CHAR PARAM) (COND (*READ-SUPPRESS* (READ-EXTENDED-TOKEN STREAM *READTABLE* T) NIL) (T (HASH-NO-PARAMETER-ERROR CHAR PARAM) (READNUMBERINBASE STREAM 16))))
(CL:DEFUN HASH-EQUAL (STREAM CHAR PARAM) (CL:IF *READ-SUPPRESS* (CL:VALUES) (PROGN (CL:IF (NULL PARAM) (CL:ERROR "#= encountered")) (CL:IF (CL:ASSOC PARAM *CIRCLE-READ-LIST*) (CL:ERROR "#~D= seen twice in same context")) (LET ((NEWNODE (CONS PARAM NIL))) (CL:PUSH NEWNODE *CIRCLE-READ-LIST*) (CL:SETF (CDR NEWNODE) (CL:READ STREAM T NIL T))))))
(CL:DEFUN HASH-NUMBER-SIGN (STREAM CHAR PARAM) (CL:IF *READ-SUPPRESS* NIL (LET ((CIRCLE-PART (CL:ASSOC PARAM *CIRCLE-READ-LIST*))) (COND (CIRCLE-PART) (T (CL:ERROR "#~D# encountered before #~D=" PARAM PARAM))))))
(CL:DEFUN HASH-STRUCTURE-SMASH (THING) (CL:TYPECASE THING (CONS (CL:IF (HASH-STRUCTURE-LOOKUP (CAR THING)) (CL:SETF (CAR THING) (CDAR THING)) (HASH-STRUCTURE-SMASH (CAR THING))) (CL:IF (HASH-STRUCTURE-LOOKUP (CDR THING)) (CL:SETF (CDR THING) (CDDR THING)) (HASH-STRUCTURE-SMASH (CDR THING)))) ((CL:ARRAY T) (LET* ((ASIZE (CL:ARRAY-TOTAL-SIZE THING)) (VARRAY (CL:IF (> (CL:ARRAY-RANK THING) 1) (CL:MAKE-ARRAY ASIZE :DISPLACED-TO THING) THING)) SLOTCONTENTS) (CL:DOTIMES (X ASIZE) (CL:SETQ SLOTCONTENTS (CL:AREF VARRAY X)) (CL:IF (HASH-STRUCTURE-LOOKUP SLOTCONTENTS) (CL:SETF (CL:AREF VARRAY X) (CDR SLOTCONTENTS)) (HASH-STRUCTURE-SMASH SLOTCONTENTS))))) (LISP::STRUCTURE-OBJECT (LET (SLOTCONTENTS) (CL:DOLIST (DESCR (LISP::STRUCTURE-POINTER-SLOTS (CL:TYPE-OF THING))) (CL:SETQ SLOTCONTENTS (FETCHFIELD DESCR THING)) (CL:IF (HASH-STRUCTURE-LOOKUP SLOTCONTENTS) (REPLACEFIELD DESCR THING (CDR SLOTCONTENTS)) (HASH-STRUCTURE-SMASH SLOTCONTENTS)))))))
(CL:DEFUN HASH-STRUCTURE-LOOKUP (SLOTCONTENTS) (AND (CL:CONSP SLOTCONTENTS) (MEMQ SLOTCONTENTS *CIRCLE-READ-LIST*)))
(* ; "Temporary")
(CL:DEFVAR *READ-SUPPRESS* NIL)
(CL:DEFVAR CL:*READ-EVAL* T)
(* ; "Common Lisp default readtables")
(DEFINEQ
(CMLRDTBL
(LAMBDA NIL (* ; "Edited 3-Apr-91 11:22 by jrb:") (* ;; "Creates a vanilla common-lisp read table") (PROG ((TBL (COPYREADTABLE (QUOTE ORIG)))) (* ;; "First reset the table") (for I from 0 to \MAXTHINCHAR do (SETSYNTAX I (QUOTE OTHER) TBL)) (* ;; "Install the goodies") (SETSEPR (CHARCODE (SPACE CR ^L LF TAB)) 1 TBL) (SETSYNTAX (CHARCODE "'") (QUOTE (MACRO ALWAYS READQUOTE)) TBL) (* ;; "Note that in cml, most of these macros are terminating, even though it would be nicer for us if they were not") (SETSYNTAX (CHARCODE ";") (QUOTE (MACRO ALWAYS CMLREADSEMI)) TBL) (SETSYNTAX (CHARCODE ")") (QUOTE RIGHTPAREN) TBL) (SETSYNTAX (CHARCODE "(") (QUOTE LEFTPAREN) TBL) (* ;; "These two PROPS == CL:READTABLE-CASE :UPCASE") (READTABLEPROP TBL (QUOTE CASEINSENSITIVE) T) (READTABLEPROP TBL (QUOTE LOWER/FLIPCASE) NIL) (READTABLEPROP TBL (QUOTE COMMONLISP) T) (READTABLEPROP TBL (QUOTE COMMONNUMSYNTAX) T) (READTABLEPROP TBL (QUOTE USESILPACKAGE) NIL) (READTABLEPROP TBL (QUOTE ESCAPECHAR) (CHARCODE "\")) (READTABLEPROP TBL (QUOTE MULTIPLE-ESCAPECHAR) (CHARCODE "|")) (if *PACKAGE* then (READTABLEPROP TBL (QUOTE PACKAGECHAR) (CHARCODE ":"))) (SET-DEFAULT-HASHMACRO-SETTINGS TBL) (SETSYNTAX (CHARCODE %") (QUOTE STRINGDELIM) TBL) (SETSYNTAX (CHARCODE "`") (QUOTE (MACRO ALWAYS READBQUOTE)) TBL) (SETSYNTAX (CHARCODE ",") (QUOTE (MACRO ALWAYS READBQUOTECOMMA)) TBL) (RETURN TBL)))
)
(INIT-CML-READTABLES
(LAMBDA NIL (* ; "Edited 16-Jan-87 15:47 by bvm:") (DECLARE (GLOBALVARS CMLRDTBL *COMMON-LISP-READ-ENVIRONMENT* READ-LINE-RDTBL)) (READTABLEPROP (SETQ CMLRDTBL (CMLRDTBL)) (QUOTE NAME) "LISP") (SETQ *COMMON-LISP-READ-ENVIRONMENT* (MAKE-READER-ENVIRONMENT (LISP:FIND-PACKAGE "USER") CMLRDTBL 10)) (LET ((FILETBL (COPYREADTABLE CMLRDTBL))) (* ; "Make one for files that has font indicators as seprs") (for I from 1 to 26 do (SETSYNTAX I (QUOTE SEPRCHAR) FILETBL)) (READTABLEPROP FILETBL (QUOTE NAME) "XCL")) (PROGN (* ; "Read table to make READ-LINE work easily") (SETQ READ-LINE-RDTBL (COPYREADTABLE (QUOTE ORIG))) (for I from 0 to \MAXTHINCHAR do (SETSYNTAX I (QUOTE OTHER) READ-LINE-RDTBL)) (SETBRK (CHARCODE (EOL)) NIL READ-LINE-RDTBL)))
)
(SET-DEFAULT-HASHMACRO-SETTINGS
(LAMBDA (RDTBL) (* ; "Edited 3-Apr-91 11:23 by jrb:") (READTABLEPROP RDTBL (QUOTE HASHMACROCHAR) (CHARCODE "#")) (LISP:MAKE-DISPATCH-MACRO-CHARACTER #\# T RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\( (QUOTE HASH-LEFTPAREN) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\' (QUOTE HASH-QUOTE) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\. (QUOTE HASH-DOT) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\, (QUOTE HASH-COMMA) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\\ (QUOTE HASH-BACKSLASH) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\* (QUOTE HASH-STAR) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\: (QUOTE HASH-COLON) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\O (QUOTE HASH-O) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\B (QUOTE HASH-B) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\X (QUOTE HASH-X) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\R (QUOTE HASH-R) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\A (QUOTE HASH-A) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\S (QUOTE HASH-S) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\C (QUOTE HASH-C) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\P (QUOTE HASH-P) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\+ (QUOTE HASH-PLUS) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\- (QUOTE HASH-MINUS) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\| (QUOTE HASH-VBAR) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\< (QUOTE HASH-LEFTANGLE) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\" (QUOTE HASH-DOUBLEQUOTE) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\= (QUOTE HASH-EQUAL) RDTBL) (LISP:SET-DISPATCH-MACRO-CHARACTER #\# #\# (QUOTE HASH-NUMBER-SIGN) RDTBL) RDTBL)
)
(CMLREADSEMI
(LAMBDA (STREAM RDTBL) (* bvm%: "13-Oct-86 15:53") (* ;;; "Read and discard through end of line") (until (EQ (READCCODE STREAM) (CHARCODE NEWLINE)) do NIL) (LISP:VALUES))
)
)
(DECLARE%: DONTEVAL@LOAD DOCOPY
(INIT-CML-READTABLES)
)
(PUTPROPS CMLREADTABLE FILETYPE CL:COMPILE-FILE)
(PUTPROPS CMLREADTABLE COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991))
(DECLARE%: DONTCOPY
(FILEMAP (NIL (17000 21075 (CMLRDTBL 17010 . 18400) (INIT-CML-READTABLES 18402 . 19168) (
SET-DEFAULT-HASHMACRO-SETTINGS 19170 . 20882) (CMLREADSEMI 20884 . 21073)))))
STOP

BIN
CLTL2/CMLREADTABLE.LCOM Normal file

Binary file not shown.

198
CLTL2/CMLSEQBASICS Normal file
View File

@@ -0,0 +1,198 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 14:37:58" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLSEQBASICS.;2" 10546
previous date%: "29-Aug-91 16:36:55" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLSEQBASICS.;1"
)
(* ; "
Copyright (c) 1986, 1987, 1990, 1991, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLSEQBASICSCOMS)
(RPAQQ CMLSEQBASICSCOMS
((DECLARE%: EVAL@COMPILE DONTCOPY (FILES CMLSEQCOMMON))
(FUNCTIONS LISP:CONCATENATE LISP:COPY-SEQ LISP:ELT LISP:LENGTH LISP:MAKE-SEQUENCE
LISP:NREVERSE LISP:REVERSE LISP:SUBSEQ %%SETELT)
(FUNCTIONS MAKE-SEQUENCE-OF-TYPE)
(SETFS LISP:ELT LISP:SUBSEQ)
(PROPS (CMLSEQBASICS FILETYPE))
(DECLARE%: EVAL@COMPILE DONTCOPY DONTEVAL@LOAD (LOCALVARS . T))))
(DECLARE%: EVAL@COMPILE DONTCOPY
(FILESLOAD CMLSEQCOMMON)
)
(LISP:DEFUN LISP:CONCATENATE (RESULT-TYPE &REST SEQUENCES)
[LET [(RESULT (MAKE-SEQUENCE-OF-TYPE RESULT-TYPE (LET ((CNT 0))
(LISP:DOLIST (SEQ SEQUENCES CNT)
(SETQ CNT (+ CNT (LISP:LENGTH
SEQ))))]
(SEQ-DISPATCH RESULT [LET ((TAIL RESULT))
(LISP:DOLIST (SEQUENCE SEQUENCES RESULT)
[SEQ-DISPATCH SEQUENCE (LISP:DOLIST (ELEMENT SEQUENCE)
(RPLACA TAIL ELEMENT)
(SETQ TAIL (CDR TAIL)))
(LISP:DOTIMES (I (VECTOR-LENGTH SEQUENCE))
(RPLACA TAIL (LISP:AREF SEQUENCE I))
(SETQ TAIL (CDR TAIL)))])]
(LET ((INDEX 0))
(LISP:DOLIST (SEQUENCE SEQUENCES RESULT)
[SEQ-DISPATCH SEQUENCE (LISP:DOLIST (ELEMENT SEQUENCE)
(LISP:SETF (LISP:AREF RESULT INDEX)
ELEMENT)
(SETQ INDEX (LISP:1+ INDEX)))
(LISP:DOTIMES (I (VECTOR-LENGTH SEQUENCE))
(LISP:SETF (LISP:AREF RESULT INDEX)
(LISP:AREF SEQUENCE I))
(SETQ INDEX (LISP:1+ INDEX)))])])
(LISP:DEFUN LISP:COPY-SEQ (SEQUENCE)
"Returns a copy of SEQUENCE which is EQUALP to SEQUENCE but not EQ."
[LET ((LENGTH (LISP:LENGTH SEQUENCE)))
(SEQ-DISPATCH SEQUENCE (FORWARD-LIST-LOOP SEQUENCE 0 LENGTH (INDEX CURRENT COPY TAIL)
COPY
(COLLECT-ITEM CURRENT COPY TAIL))
(LET [(COPY (MAKE-VECTOR LENGTH :ELEMENT-TYPE (LISP:ARRAY-ELEMENT-TYPE SEQUENCE]
(COPY-VECTOR-SUBSEQ SEQUENCE 0 LENGTH COPY 0 LENGTH])
(LISP:DEFUN LISP:ELT (SEQUENCE INDEX)
(* amd " 5-Jun-86 17:48")
(LISP:IF (NOT (< -1 INDEX (LISP:LENGTH SEQUENCE)))
(LISP:ERROR 'INDEX-BOUNDS-ERROR :NAME SEQUENCE :INDEX INDEX))
(SEQ-DISPATCH SEQUENCE (LISP:NTH INDEX SEQUENCE)
(LISP:AREF SEQUENCE INDEX)))
(LISP:DEFUN LISP:LENGTH (SEQUENCE)
(SEQ-DISPATCH SEQUENCE [LET ((SIZE 0)
(REST SEQUENCE))
(LISP:LOOP (LISP:IF (NOT (LISP:CONSP REST))
(RETURN SIZE))
(SETQ REST (CDR REST))
(SETQ SIZE (LISP:1+ SIZE]
(VECTOR-LENGTH SEQUENCE)))
(LISP:DEFUN LISP:MAKE-SEQUENCE (TYPE LENGTH &KEY (INITIAL-ELEMENT NIL INITIAL-ELEMENT-P))
"Make a sequnce of the specified type"
(LISP:IF (EQ TYPE 'LIST)
(LISP:MAKE-LIST LENGTH :INITIAL-ELEMENT INITIAL-ELEMENT)
(LET ((VECTOR (MAKE-SEQUENCE-OF-TYPE TYPE LENGTH)))
(LISP:IF INITIAL-ELEMENT-P (FILL-VECTOR-SUBSEQ VECTOR 0 LENGTH INITIAL-ELEMENT))
VECTOR)))
(LISP:DEFUN LISP:NREVERSE (SEQUENCE)
"Returns a sequence of the same elements in reverse order (the argument is destroyed)."
[SEQ-DISPATCH SEQUENCE [LET ((REST SEQUENCE)
LIST-HEAD RESULT)
(LISP:LOOP (LISP:IF (NOT (LISP:CONSP (SETQ LIST-HEAD REST)))
(RETURN RESULT))
(SETQ REST (CDR REST))
(SETQ RESULT (RPLACD LIST-HEAD RESULT]
(LET ((LENGTH (VECTOR-LENGTH SEQUENCE)))
(LISP:DO ((LEFT-INDEX 0 (LISP:1+ LEFT-INDEX))
(RIGHT-INDEX (LISP:1- LENGTH)
(LISP:1- RIGHT-INDEX))
(HALF-LENGTH (LRSH LENGTH 1)))
((EQL LEFT-INDEX HALF-LENGTH)
SEQUENCE)
(LISP:ROTATEF (LISP:AREF SEQUENCE LEFT-INDEX)
(LISP:AREF SEQUENCE RIGHT-INDEX)))])
(LISP:DEFUN LISP:REVERSE (SEQUENCE)
"Returns a new sequence containing the same elements but in reverse order."
[SEQ-DISPATCH SEQUENCE [LET ((REST SEQUENCE)
RESULT)
(LISP:LOOP (LISP:IF (NOT (LISP:CONSP REST))
(RETURN RESULT))
(LISP:PUSH (CAR REST)
RESULT)
(SETQ REST (CDR REST]
(LET ((LENGTH (VECTOR-LENGTH SEQUENCE)))
(LISP:DO ((RESULT (MAKE-VECTOR LENGTH :ELEMENT-TYPE (LISP:ARRAY-ELEMENT-TYPE SEQUENCE)
))
(FORWARD-INDEX 0 (LISP:1+ FORWARD-INDEX))
(BACKWARD-INDEX (LISP:1- LENGTH)
(LISP:1- BACKWARD-INDEX)))
((EQL FORWARD-INDEX LENGTH)
RESULT)
(LISP:SETF (LISP:AREF RESULT FORWARD-INDEX)
(LISP:AREF SEQUENCE BACKWARD-INDEX)))])
(LISP:DEFUN LISP:SUBSEQ (SEQUENCE START &OPTIONAL END)
[LET ((LENGTH (LISP:LENGTH SEQUENCE)))
(LISP:IF (NULL END)
(SETQ END LENGTH))
(CHECK-SUBSEQ SEQUENCE START END LENGTH)
(SEQ-DISPATCH SEQUENCE (FORWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT COPY TAIL)
COPY
(COLLECT-ITEM CURRENT COPY TAIL))
(LET [(COPY (MAKE-VECTOR (- END START)
:ELEMENT-TYPE
(LISP:ARRAY-ELEMENT-TYPE SEQUENCE]
(COPY-VECTOR-SUBSEQ SEQUENCE START END COPY 0])
(LISP:DEFUN %%SETELT (SEQUENCE INDEX NEWVAL)
(LISP:IF (NOT (< -1 INDEX (LISP:LENGTH SEQUENCE)))
(LISP:ERROR 'INDEX-BOUNDS-ERROR :NAME SEQUENCE :INDEX INDEX))
(SEQ-DISPATCH SEQUENCE (LISP:SETF (LISP:NTH INDEX SEQUENCE)
NEWVAL)
(LISP:SETF (LISP:AREF SEQUENCE INDEX)
NEWVAL)))
(LISP:DEFUN MAKE-SEQUENCE-OF-TYPE (TYPE LENGTH)
[LET ((BROAD-TYPE (TYPE-SPECIFIER TYPE))
TYPE-LENGTH)
(LISP:IF (EQ BROAD-TYPE 'LIST)
(LISP:MAKE-LIST LENGTH)
[LET [(ELEMENT-TYPE (CASE BROAD-TYPE
((LISP:SIMPLE-STRING STRING)
(SETQ TYPE-LENGTH (AND (LISP:CONSP TYPE)
(LISP:SECOND TYPE)))
'LISP:STRING-CHAR)
((LISP:SIMPLE-BIT-VECTOR LISP:BIT-VECTOR)
(SETQ TYPE-LENGTH (AND (LISP:CONSP TYPE)
(LISP:SECOND TYPE)))
'BIT)
(LISP:SIMPLE-VECTOR
(SETQ TYPE-LENGTH (AND (LISP:CONSP TYPE)
(LISP:SECOND TYPE)))
T)
((LISP:ARRAY LISP:VECTOR LISP:SIMPLE-ARRAY)
(LISP:IF (LISP:CONSP TYPE)
(LET ((ELT-TYPE (CADR TYPE)))
(SETQ TYPE-LENGTH (LISP:THIRD TYPE))
(LISP:IF (LISP:CONSP TYPE-LENGTH)
(SETQ TYPE-LENGTH (CAR TYPE-LENGTH)))
(LISP:IF [AND ELT-TYPE (NOT (EQ ELT-TYPE 'LISP:*]
ELT-TYPE
T))
T)))]
(LISP:IF (AND (LISP:INTEGERP TYPE-LENGTH)
(NOT (EQUAL TYPE-LENGTH LENGTH)))
(LISP:ERROR "~D is not the length of type ~s" LENGTH TYPE))
(LISP:IF ELEMENT-TYPE
(MAKE-VECTOR LENGTH :ELEMENT-TYPE ELEMENT-TYPE)
(LET ((EXPANDER (LISP::TYPE-EXPANDER BROAD-TYPE)))
(LISP:IF EXPANDER
(MAKE-SEQUENCE-OF-TYPE (LISP::TYPE-EXPAND TYPE EXPANDER)
LENGTH)
(LISP:ERROR "~S is a bad type specifier for sequences." TYPE))))])])
(LISP:DEFSETF LISP:ELT %%SETELT)
(LISP:DEFSETF LISP:SUBSEQ (SEQUENCE START &OPTIONAL END) (NEW-SEQUENCE)
`(PROGN (LISP:REPLACE ,SEQUENCE ,NEW-SEQUENCE :START1 ,START :END1 ,END)
,NEW-SEQUENCE))
(PUTPROPS CMLSEQBASICS FILETYPE LISP:COMPILE-FILE)
(DECLARE%: EVAL@COMPILE DONTCOPY DONTEVAL@LOAD
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
)
(PUTPROPS CMLSEQBASICS COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLSEQBASICS.LCOM Normal file

Binary file not shown.

53
CLTL2/CMLSEQCOMMON Normal file
View File

@@ -0,0 +1,53 @@
(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP")
(FILECREATED " 6-Sep-91 14:19:03" {DSK}<new>venue>sources>CMLSEQCOMMON.;3 5402
changes to%: (OPTIMIZERS CL:COMPLEMENT) (VARS CMLSEQCOMMONCOMS) (FUNCTIONS CL:COMPLEMENT)
previous date%: "16-May-90 14:28:05" {DSK}<new>sources>lispcore>sources>CMLSEQCOMMON.;1)
(* ; "
Copyright (c) 1986, 1990, 1991 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLSEQCOMMONCOMS)
(RPAQQ CMLSEQCOMMONCOMS ((FUNCTIONS CHECK-SUBSEQ COLLECT-ITEM COPY-VECTOR-SUBSEQ FILL-VECTOR-SUBSEQ MAKE-SEQUENCE-LIKE SEQ-DISPATCH TYPE-SPECIFIER) (FUNCTIONS BACKWARD-LIST-LOOP BACKWARD-VECTOR-LOOP FORWARD-LIST-LOOP FORWARD-VECTOR-LOOP) (FUNCTIONS CL:COMPLEMENT) (OPTIMIZERS CL:COMPLEMENT) (PROP FILETYPE CMLSEQCOMMON) (DECLARE%: EVAL@COMPILE DONTCOPY DONTEVAL@LOAD (LOCALVARS . T))))
(DEFMACRO CHECK-SUBSEQ (SEQ START END LENGTH) (BQUOTE (CL:IF (NOT (<= 0 (\, START) (\, END) (\, LENGTH))) (CL:ERROR "Illegal subsequence for ~S.~%%Start is ~D. End is ~D" (\, SEQ) (\, START) (\, END)))))
(DEFMACRO COLLECT-ITEM (ITEM HEAD TAIL) (BQUOTE (CL:IF (\, TAIL) (RPLACD (\, TAIL) (SETQ (\, TAIL) (LIST (\, ITEM)))) (SETQ (\, HEAD) (SETQ (\, TAIL) (LIST (\, ITEM)))))))
(DEFMACRO COPY-VECTOR-SUBSEQ (FROM-VECTOR START-FROM END-FROM TO-VECTOR START-TO END-TO) "Copy one vector subsequence to another" (BQUOTE (CL:DO ((FROM-INDEX (\, START-FROM) (CL:1+ FROM-INDEX)) (TO-INDEX (\, START-TO) (CL:1+ TO-INDEX))) ((\, (CL:IF END-FROM (BQUOTE (EQL FROM-INDEX (\, END-FROM))) (BQUOTE (EQL TO-INDEX (\, END-TO))))) (\, TO-VECTOR)) (CL:SETF (CL:AREF (\, TO-VECTOR) TO-INDEX) (CL:AREF (\, FROM-VECTOR) FROM-INDEX)))))
(DEFMACRO FILL-VECTOR-SUBSEQ (VECTOR START END NEWVALUE) (BQUOTE (CL:DO ((INDEX (\, START) (CL:1+ INDEX))) ((EQL INDEX (\, END)) (\, VECTOR)) (CL:SETF (CL:AREF (\, VECTOR) INDEX) (\, NEWVALUE)))))
(DEFMACRO MAKE-SEQUENCE-LIKE (SEQUENCE LENGTH) "Returns a sequence of the same type as SEQUENCE and the given LENGTH." (BQUOTE (LET ((SEQ (\, SEQUENCE))) (CL:ETYPECASE SEQ (LIST (CL:MAKE-LIST (\, LENGTH))) (STRING (CL:MAKE-STRING (\, LENGTH))) (CL:VECTOR (MAKE-VECTOR (\, LENGTH) :ELEMENT-TYPE (CL:ARRAY-ELEMENT-TYPE SEQ)))))))
(DEFMACRO SEQ-DISPATCH (SEQUENCE LIST-FORM VECTOR-FORM) (BQUOTE (CL:ETYPECASE (\, SEQUENCE) (LIST (\, LIST-FORM)) (CL:VECTOR (\, VECTOR-FORM)))))
(DEFMACRO TYPE-SPECIFIER (TYPE) "Returns the broad class of which TYPE is a specific subclass." (BQUOTE (CL:IF (CL:ATOM (\, TYPE)) (\, TYPE) (CAR (\, TYPE)))))
(DEFMACRO BACKWARD-LIST-LOOP (SEQUENCE START END LOCAL-VARS RETURN-FORM &REST BODY) (LET ((INDEX-VAR (CAR LOCAL-VARS)) (CURRENT-ELEMENT-VAR (CADR LOCAL-VARS)) (OTHER-VARS (CDDR LOCAL-VARS))) (BQUOTE (CL:DO (((\, INDEX-VAR) (CL:1- (\, END)) (CL:1- (\, INDEX-VAR))) %%SUBSEQ (\, CURRENT-ELEMENT-VAR) (\,@ OTHER-VARS)) ((< (\, INDEX-VAR) (\, START)) (\, RETURN-FORM)) (SETQ %%SUBSEQ (CL:NTHCDR (\, INDEX-VAR) (\, SEQUENCE))) (SETQ (\, CURRENT-ELEMENT-VAR) (CAR %%SUBSEQ)) (\,@ BODY)))))
(DEFMACRO BACKWARD-VECTOR-LOOP (SEQUENCE START END LOCAL-VARS RETURN-FORM &REST BODY) (LET ((INDEX-VAR (CAR LOCAL-VARS)) (CURRENT-ELEMENT-VAR (CADR LOCAL-VARS)) (OTHER-VARS (CDDR LOCAL-VARS))) (BQUOTE (CL:DO (((\, INDEX-VAR) (CL:1- (\, END)) (CL:1- (\, INDEX-VAR))) (\, CURRENT-ELEMENT-VAR) (\,@ OTHER-VARS)) ((< (\, INDEX-VAR) (\, START)) (\, RETURN-FORM)) (SETQ (\, CURRENT-ELEMENT-VAR) (CL:AREF (\, SEQUENCE) (\, INDEX-VAR))) (\,@ BODY)))))
(DEFMACRO FORWARD-LIST-LOOP (SEQUENCE START END LOCAL-VARS RETURN-FORM &REST BODY) (LET ((INDEX-VAR (CAR LOCAL-VARS)) (CURRENT-ELEMENT-VAR (CADR LOCAL-VARS)) (OTHER-VARS (CDDR LOCAL-VARS))) (BQUOTE (CL:DO ((%%SUBSEQ (CL:NTHCDR (\, START) (\, SEQUENCE)) (CDR %%SUBSEQ)) ((\, INDEX-VAR) (\, START) (CL:1+ (\, INDEX-VAR))) (\, CURRENT-ELEMENT-VAR) (\,@ OTHER-VARS)) ((EQL (\, INDEX-VAR) (\, END)) (\, RETURN-FORM)) (SETQ (\, CURRENT-ELEMENT-VAR) (CAR %%SUBSEQ)) (\,@ BODY)))))
(DEFMACRO FORWARD-VECTOR-LOOP (SEQUENCE START END LOCAL-VARS RETURN-FORM &REST BODY) "Canonical forward loop for vectors" (LET ((INDEX-VAR (CAR LOCAL-VARS)) (CURRENT-ELEMENT-VAR (CADR LOCAL-VARS)) (OTHER-VARS (CDDR LOCAL-VARS))) (BQUOTE (CL:DO (((\, INDEX-VAR) (\, START) (CL:1+ (\, INDEX-VAR))) (\, CURRENT-ELEMENT-VAR) (\,@ OTHER-VARS)) ((EQL (\, INDEX-VAR) (\, END)) (\, RETURN-FORM)) (SETQ (\, CURRENT-ELEMENT-VAR) (CL:AREF (\, SEQUENCE) (\, INDEX-VAR))) (\,@ BODY)))))
(CL:DEFUN CL:COMPLEMENT (CL::FN) (CL:FUNCTION (CL:LAMBDA (&REST CL::ARGUMENTS) (NOT (CL:APPLY CL::FN CL::ARGUMENTS)))))
(DEFOPTIMIZER CL:COMPLEMENT (CL::FN &ENVIRONMENT CL::ENV) (* ;; "If we can find the argument list for FN and it's a simple one (it will be 99%% of the time), we can build a decent COMPLEMENT that doesn't do the extra &REST and APPLY") (LET (CL::FN-NAME CL::FN-ARG-LIST) (CL:IF (AND (CL:CONSP CL::FN) (OR (EQ (CAR CL::FN) (QUOTE QUOTE)) (EQ (CAR CL::FN) (QUOTE CL:FUNCTION))) (CL:SYMBOLP (CL:SETQ CL::FN-NAME (CADR CL::FN))) (CL:CONSP (CL:SETQ CL::FN-ARG-LIST (CAR (NLSETQ (SMARTARGLIST CL::FN-NAME)))))) (BQUOTE (CL:FUNCTION (CL:LAMBDA (\, CL::FN-ARG-LIST) (NOT ((\, CL::FN-NAME) (\,@ CL::FN-ARG-LIST)))))) (QUOTE COMPILER:PASS))))
(PUTPROPS CMLSEQCOMMON FILETYPE CL:COMPILE-FILE)
(DECLARE%: EVAL@COMPILE DONTCOPY DONTEVAL@LOAD
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
)
(PUTPROPS CMLSEQCOMMON COPYRIGHT ("Venue & Xerox Corporation" 1986 1990 1991))
(DECLARE%: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLSEQCOMMON.LCOM Normal file

Binary file not shown.

115
CLTL2/CMLSEQMAPPERS Normal file
View File

@@ -0,0 +1,115 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "29-Aug-91 16:51:48" {DSK}<new>sources>lispcore>sources>CMLSEQMAPPERS.;2 14225
changes to%: (FUNCTIONS REDUCE-FROM-END REDUCE-FROM-START CL:REDUCE)
previous date%: "16-May-90 14:31:36" {DSK}<new>sources>lispcore>sources>CMLSEQMAPPERS.;1)
(* ; "
Copyright (c) 1986, 1987, 1990, 1991 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLSEQMAPPERSCOMS)
(RPAQQ CMLSEQMAPPERSCOMS ((DECLARE%: EVAL@COMPILE DONTCOPY (FILES CMLSEQCOMMON)) (FUNCTIONS %%FILL-SLICE %%MAP-FOR-EFFECT %%MAP-FOR-EFFECT-MULTIPLE %%MAP-FOR-EFFECT-SINGLE %%MAP-FOR-RESULT-MULTIPLE %%MAP-FOR-RESULT-SINGLE %%MIN-SEQUENCE-LENGTH CL:MAP) (* ;; "For compatibility with old optimizers") (FUNCTIONS %%MAP-SINGLE-FOR-EFFECT %%MAP-SINGLE-TO-LIST %%MAP-SINGLE-TO-SIMPLE %%MAP-TO-LIST %%MAP-TO-SIMPLE) (OPTIMIZERS CL:MAP) (FUNCTIONS %%SOME-MULTIPLE %%SOME-SINGLE %%EVERY-MULTIPLE %%EVERY-SINGLE %%NOTANY-MULTIPLE %%NOTANY-SINGLE %%NOTEVERY-MULTIPLE %%NOTEVERY-SINGLE CL:SOME CL:EVERY CL:NOTANY CL:NOTEVERY) (* ;; "For compatibility with old optimizers") (P (MOVD (QUOTE %%SOME-SINGLE) (QUOTE %%SINGLE-SOME)) (MOVD (QUOTE %%EVERY-SINGLE) (QUOTE %%SINGLE-EVERY)) (MOVD (QUOTE %%NOTEVERY-SINGLE) (QUOTE %%SINGLE-NOTEVERY)) (MOVD (QUOTE %%NOTANY-SINGLE) (QUOTE %%SINGLE-NOTANY))) (OPTIMIZERS CL:SOME CL:EVERY CL:NOTANY CL:NOTEVERY) (FUNCTIONS REDUCE-FROM-END REDUCE-FROM-START CL:REDUCE) (PROP FILETYPE CMLSEQMAPPERS) (DECLARE%: DONTEVAL@LOAD DONTCOPY DOEVAL@COMPILE (LOCALVARS . T))))
(DECLARE%: EVAL@COMPILE DONTCOPY
(FILESLOAD CMLSEQCOMMON)
)
(DEFMACRO %%FILL-SLICE (INDEX SLICE SEQUENCES) (BQUOTE (CL:DO ((%%SUBSLICE (\, SLICE) (CDR %%SUBSLICE)) (%%SUBSEQ (\, SEQUENCES) (CDR %%SUBSEQ)) %%SEQUENCE) ((NULL %%SUBSEQ) (\, SLICE)) (SETQ %%SEQUENCE (CAR %%SUBSEQ)) (RPLACA %%SUBSLICE (SEQ-DISPATCH %%SEQUENCE (PROG1 (CAR %%SEQUENCE) (RPLACA %%SUBSEQ (CDR %%SEQUENCE))) (CL:AREF %%SEQUENCE (\, INDEX)))))))
(CL:DEFUN %%MAP-FOR-EFFECT (FUNCTION SEQUENCE &REST MORE-SEQUENCES) (CL:IF (NULL MORE-SEQUENCES) (%%MAP-FOR-EFFECT-SINGLE FUNCTION SEQUENCE) (%%MAP-FOR-EFFECT-MULTIPLE FUNCTION (CONS SEQUENCE MORE-SEQUENCES))))
(CL:DEFUN %%MAP-FOR-EFFECT-MULTIPLE (FUNCTION SEQUENCES) (LET ((MIN-LENGTH (%%MIN-SEQUENCE-LENGTH SEQUENCES)) (ELT-SLICE (CL:MAKE-LIST (CL:LENGTH SEQUENCES)))) (CL:DOTIMES (I MIN-LENGTH) (CL:APPLY FUNCTION (%%FILL-SLICE I ELT-SLICE SEQUENCES)))))
(CL:DEFUN %%MAP-FOR-EFFECT-SINGLE (FUNCTION SEQUENCE) (SEQ-DISPATCH SEQUENCE (CL:DOLIST (ELT SEQUENCE) (CL:FUNCALL FUNCTION ELT)) (CL:DOTIMES (I (VECTOR-LENGTH SEQUENCE)) (CL:FUNCALL FUNCTION (CL:AREF SEQUENCE I)))))
(CL:DEFUN %%MAP-FOR-RESULT-MULTIPLE (RESULT-TYPE FUNCTION SEQUENCES) (LET* ((MIN-LENGTH (%%MIN-SEQUENCE-LENGTH SEQUENCES)) (ELT-SLICE (CL:MAKE-LIST (CL:LENGTH SEQUENCES))) (RESULT (MAKE-SEQUENCE-OF-TYPE RESULT-TYPE MIN-LENGTH))) (SEQ-DISPATCH RESULT (CL:DO ((SUBRESULT RESULT (CDR SUBRESULT)) (INDEX 0 (CL:1+ INDEX))) ((EQL INDEX MIN-LENGTH) RESULT) (RPLACA SUBRESULT (CL:APPLY FUNCTION (%%FILL-SLICE INDEX ELT-SLICE SEQUENCES)))) (CL:DO ((INDEX 0 (CL:1+ INDEX))) ((EQL INDEX MIN-LENGTH) RESULT) (CL:SETF (CL:AREF RESULT INDEX) (CL:APPLY FUNCTION (%%FILL-SLICE INDEX ELT-SLICE SEQUENCES)))))))
(CL:DEFUN %%MAP-FOR-RESULT-SINGLE (RESULT-TYPE FUNCTION SEQUENCE) (LET* ((LENGTH (CL:LENGTH SEQUENCE)) (RESULT (MAKE-SEQUENCE-OF-TYPE RESULT-TYPE LENGTH))) (SEQ-DISPATCH SEQUENCE (SEQ-DISPATCH RESULT (CL:DO ((SUBSEQ SEQUENCE (CDR SUBSEQ)) (SUBRESULT RESULT (CDR SUBRESULT))) ((NULL SUBSEQ)) (RPLACA SUBRESULT (CL:FUNCALL FUNCTION (CAR SUBSEQ)))) (CL:DO ((SUBSEQ SEQUENCE (CDR SUBSEQ)) (INDEX 0 (CL:1+ INDEX))) ((NULL SUBSEQ)) (CL:SETF (CL:AREF RESULT INDEX) (CL:FUNCALL FUNCTION (CAR SUBSEQ))))) (SEQ-DISPATCH RESULT (CL:DO ((INDEX 0 (CL:1+ INDEX)) (SUBRESULT RESULT (CDR SUBRESULT))) ((EQL INDEX LENGTH)) (RPLACA SUBRESULT (CL:FUNCALL FUNCTION (CL:AREF SEQUENCE INDEX)))) (CL:DO ((INDEX 0 (CL:1+ INDEX))) ((EQL INDEX LENGTH)) (CL:SETF (CL:AREF RESULT INDEX) (CL:FUNCALL FUNCTION (CL:AREF SEQUENCE INDEX)))))) RESULT))
(DEFMACRO %%MIN-SEQUENCE-LENGTH (SEQUENCES) (BQUOTE (CL:DO ((MIN-LENGTH (CL:LENGTH (CAR (\, SEQUENCES)))) (SUBSEQ (CDR (\, SEQUENCES)) (CDR SUBSEQ)) NEXT-LENGTH) ((NULL SUBSEQ) MIN-LENGTH) (SETQ NEXT-LENGTH (CL:LENGTH (CAR SUBSEQ))) (CL:IF (< NEXT-LENGTH MIN-LENGTH) (SETQ MIN-LENGTH NEXT-LENGTH)))))
(CL:DEFUN CL:MAP (RESULT-TYPE FUNCTION SEQUENCE &REST MORE-SEQUENCES) "FUNCTION must take as many arguments as there are sequences provided. The result is a sequence such that element i is the result of applying FUNCTION to element i of each of the argument sequences." (CL:IF (NULL RESULT-TYPE) (CL:IF (NULL MORE-SEQUENCES) (%%MAP-FOR-EFFECT-SINGLE FUNCTION SEQUENCE) (%%MAP-FOR-EFFECT-MULTIPLE FUNCTION (CONS SEQUENCE MORE-SEQUENCES))) (CL:IF (NULL MORE-SEQUENCES) (%%MAP-FOR-RESULT-SINGLE RESULT-TYPE FUNCTION SEQUENCE) (%%MAP-FOR-RESULT-MULTIPLE RESULT-TYPE FUNCTION (CONS SEQUENCE MORE-SEQUENCES)))))
(* ;; "For compatibility with old optimizers")
(CL:DEFUN %%MAP-SINGLE-FOR-EFFECT (FUNCTION SEQUENCE) (%%MAP-FOR-EFFECT-SINGLE FUNCTION SEQUENCE))
(CL:DEFUN %%MAP-SINGLE-TO-LIST (FUNCTION SEQUENCE) (%%MAP-FOR-RESULT-SINGLE (QUOTE LIST) FUNCTION SEQUENCE))
(CL:DEFUN %%MAP-SINGLE-TO-SIMPLE (RESULT-TYPE FUNCTION SEQUENCE) (%%MAP-FOR-RESULT-SINGLE RESULT-TYPE FUNCTION SEQUENCE))
(CL:DEFUN %%MAP-TO-LIST (FUNCTION SEQUENCE &REST MORE-SEQUENCES) (CL:IF (NULL MORE-SEQUENCES) (%%MAP-FOR-RESULT-SINGLE (QUOTE LIST) FUNCTION SEQUENCE) (%%MAP-FOR-RESULT-MULTIPLE (QUOTE LIST) FUNCTION (CONS SEQUENCE MORE-SEQUENCES))))
(CL:DEFUN %%MAP-TO-SIMPLE (RESULT-TYPE FUNCTION SEQUENCE &REST MORE-SEQUENCES) (CL:IF (NULL MORE-SEQUENCES) (%%MAP-FOR-RESULT-SINGLE RESULT-TYPE FUNCTION SEQUENCE) (%%MAP-FOR-RESULT-MULTIPLE RESULT-TYPE FUNCTION (CONS SEQUENCE MORE-SEQUENCES))))
(DEFOPTIMIZER CL:MAP (RESULT-TYPE FUNCTION FIRST-SEQUNCE &REST MORE-SEQUENCES) (CL:IF (AND (NULL MORE-SEQUENCES) (CL:CONSTANTP RESULT-TYPE)) (CL:IF (NULL (EVAL RESULT-TYPE)) (BQUOTE (%%MAP-FOR-EFFECT-SINGLE (\, FUNCTION) (\, FIRST-SEQUNCE))) (BQUOTE (%%MAP-FOR-RESULT-SINGLE (\, RESULT-TYPE) (\, FUNCTION) (\, FIRST-SEQUNCE)))) (QUOTE COMPILER:PASS)))
(CL:DEFUN %%SOME-MULTIPLE (PREDICATE SEQUENCES) (LET ((MIN-LENGTH (%%MIN-SEQUENCE-LENGTH SEQUENCES)) (ELT-SLICE (CL:MAKE-LIST (CL:LENGTH SEQUENCES)))) (CL:DO ((INDEX 0 (CL:1+ INDEX)) PREDICATE-RESULT) ((EQL INDEX MIN-LENGTH)) (SETQ PREDICATE-RESULT (CL:APPLY PREDICATE (%%FILL-SLICE INDEX ELT-SLICE SEQUENCES))) (CL:IF PREDICATE-RESULT (RETURN PREDICATE-RESULT)))))
(CL:DEFUN %%SOME-SINGLE (PREDICATE SEQUENCE) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (SEQ-DISPATCH SEQUENCE (FORWARD-LIST-LOOP SEQUENCE 0 LENGTH (INDEX CURRENT PREDICATE-RESULT) NIL (SETQ PREDICATE-RESULT (CL:FUNCALL PREDICATE CURRENT)) (CL:IF PREDICATE-RESULT (RETURN PREDICATE-RESULT))) (FORWARD-VECTOR-LOOP SEQUENCE 0 LENGTH (INDEX CURRENT PREDICATE-RESULT) NIL (SETQ PREDICATE-RESULT (CL:FUNCALL PREDICATE CURRENT)) (CL:IF PREDICATE-RESULT (RETURN PREDICATE-RESULT))))))
(CL:DEFUN %%EVERY-MULTIPLE (PREDICATE SEQUENCES) (LET ((MIN-LENGTH (%%MIN-SEQUENCE-LENGTH SEQUENCES)) (ELT-SLICE (CL:MAKE-LIST (CL:LENGTH SEQUENCES)))) (CL:DOTIMES (INDEX MIN-LENGTH T) (CL:IF (NULL (CL:APPLY PREDICATE (%%FILL-SLICE INDEX ELT-SLICE SEQUENCES))) (RETURN NIL)))))
(CL:DEFUN %%EVERY-SINGLE (PREDICATE FIRST-SEQUENCE) (SEQ-DISPATCH FIRST-SEQUENCE (CL:DOLIST (ELT FIRST-SEQUENCE T) (CL:IF (NULL (CL:FUNCALL PREDICATE ELT)) (RETURN NIL))) (CL:DOTIMES (INDEX (VECTOR-LENGTH FIRST-SEQUENCE) T) (CL:IF (NULL (CL:FUNCALL PREDICATE (CL:AREF FIRST-SEQUENCE INDEX))) (RETURN NIL)))))
(CL:DEFUN %%NOTANY-MULTIPLE (PREDICATE SEQUENCES) (LET ((MIN-LENGTH (%%MIN-SEQUENCE-LENGTH SEQUENCES)) (ELT-SLICE (CL:MAKE-LIST (CL:LENGTH SEQUENCES)))) (CL:DOTIMES (INDEX MIN-LENGTH T) (CL:IF (CL:APPLY PREDICATE (%%FILL-SLICE INDEX ELT-SLICE SEQUENCES)) (RETURN NIL)))))
(CL:DEFUN %%NOTANY-SINGLE (PREDICATE FIRST-SEQUENCE) (SEQ-DISPATCH FIRST-SEQUENCE (CL:DOLIST (ELT FIRST-SEQUENCE T) (CL:IF (CL:FUNCALL PREDICATE ELT) (RETURN NIL))) (CL:DOTIMES (I (VECTOR-LENGTH FIRST-SEQUENCE) T) (CL:IF (CL:FUNCALL PREDICATE (CL:AREF FIRST-SEQUENCE I)) (RETURN NIL)))))
(CL:DEFUN %%NOTEVERY-MULTIPLE (PREDICATE SEQUENCES) (LET ((MIN-LENGTH (%%MIN-SEQUENCE-LENGTH SEQUENCES)) (ELT-SLICE (CL:MAKE-LIST (CL:LENGTH SEQUENCES)))) (CL:DOTIMES (INDEX MIN-LENGTH) (CL:IF (NULL (CL:APPLY PREDICATE (%%FILL-SLICE INDEX ELT-SLICE SEQUENCES))) (RETURN T)))))
(CL:DEFUN %%NOTEVERY-SINGLE (PREDICATE FIRST-SEQUENCE) (SEQ-DISPATCH FIRST-SEQUENCE (CL:DOLIST (ELT FIRST-SEQUENCE) (CL:IF (NULL (CL:FUNCALL PREDICATE ELT)) (RETURN T))) (CL:DOTIMES (I (VECTOR-LENGTH FIRST-SEQUENCE)) (CL:IF (NULL (CL:FUNCALL PREDICATE (CL:AREF FIRST-SEQUENCE I))) (RETURN T)))))
(CL:DEFUN CL:SOME (PREDICATE FIRST-SEQUENCE &REST MORE-SEQUENCES) "PREDICATE is applied to the elements with index 0 of the sequences, then possibly to those with index 1, and so on. SOME returns the first non-() value encountered, or () if the end of a sequence is reached." (CL:IF (NULL MORE-SEQUENCES) (%%SOME-SINGLE PREDICATE FIRST-SEQUENCE) (%%SOME-MULTIPLE PREDICATE (CONS FIRST-SEQUENCE MORE-SEQUENCES))))
(CL:DEFUN CL:EVERY (PREDICATE FIRST-SEQUENCE &REST MORE-SEQUENCES) "PREDICATE is applied to the elements with index 0 of the sequences, then possibly to those with index 1, and so on. EVERY returns () as soon as any invocation of PREDICATE returns (), or T if every invocation is non-()." (CL:IF (NULL MORE-SEQUENCES) (%%EVERY-SINGLE PREDICATE FIRST-SEQUENCE) (%%EVERY-MULTIPLE PREDICATE (CONS FIRST-SEQUENCE MORE-SEQUENCES))))
(CL:DEFUN CL:NOTANY (PREDICATE FIRST-SEQUENCE &REST MORE-SEQUENCES) "PREDICATE is applied to the elements with index 0 of the sequences, then possibly to those with index 1, and so on. NOTANY returns () as soon as any invocation of PREDICATE returns a non-() value, or T if the end of a sequence is reached." (CL:IF (NULL MORE-SEQUENCES) (%%NOTANY-SINGLE PREDICATE FIRST-SEQUENCE) (%%NOTANY-MULTIPLE PREDICATE (CONS FIRST-SEQUENCE MORE-SEQUENCES))))
(CL:DEFUN CL:NOTEVERY (PREDICATE FIRST-SEQUENCE &REST MORE-SEQUENCES) "PREDICATE is applied to the elements with index 0 of the sequences, then possibly to those with index 1, and so on. NOTEVERY returns T as soon as any invocation of PREDICATE returns (), or () if every invocation is non-()." (CL:IF (NULL MORE-SEQUENCES) (%%NOTEVERY-SINGLE PREDICATE FIRST-SEQUENCE) (%%NOTEVERY-MULTIPLE PREDICATE (CONS FIRST-SEQUENCE MORE-SEQUENCES))))
(* ;; "For compatibility with old optimizers")
(MOVD (QUOTE %%SOME-SINGLE) (QUOTE %%SINGLE-SOME))
(MOVD (QUOTE %%EVERY-SINGLE) (QUOTE %%SINGLE-EVERY))
(MOVD (QUOTE %%NOTEVERY-SINGLE) (QUOTE %%SINGLE-NOTEVERY))
(MOVD (QUOTE %%NOTANY-SINGLE) (QUOTE %%SINGLE-NOTANY))
(DEFOPTIMIZER CL:SOME (PREDICATE SEQUENCE &REST MORE-SEQUENCES) (COND ((NULL MORE-SEQUENCES) (BQUOTE (%%SOME-SINGLE (\, PREDICATE) (\, SEQUENCE)))) (T (QUOTE COMPILER:PASS))))
(DEFOPTIMIZER CL:EVERY (PREDICATE SEQUENCE &REST MORE-SEQUENCES) (COND ((NULL MORE-SEQUENCES) (BQUOTE (%%EVERY-SINGLE (\, PREDICATE) (\, SEQUENCE)))) (T (QUOTE COMPILER:PASS))))
(DEFOPTIMIZER CL:NOTANY (PREDICATE SEQUENCE &REST MORE-SEQUENCES) (COND ((NULL MORE-SEQUENCES) (BQUOTE (%%NOTANY-SINGLE (\, PREDICATE) (\, SEQUENCE)))) (T (QUOTE COMPILER:PASS))))
(DEFOPTIMIZER CL:NOTEVERY (PREDICATE SEQUENCE &REST MORE-SEQUENCES) (COND ((NULL MORE-SEQUENCES) (BQUOTE (%%NOTEVERY-SINGLE (\, PREDICATE) (\, SEQUENCE)))) (T (QUOTE COMPILER:PASS))))
(CL:DEFUN REDUCE-FROM-END (FUNCTION SEQUENCE START END INITIAL-VALUE &OPTIONAL KEY) "Backward reduction" (CL:IF KEY (SEQ-DISPATCH SEQUENCE (BACKWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT (ACCUMULATOR INITIAL-VALUE)) ACCUMULATOR (SETQ ACCUMULATOR (CL:FUNCALL FUNCTION (CL:FUNCALL KEY CURRENT) ACCUMULATOR))) (BACKWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (ACCUMULATOR INITIAL-VALUE)) ACCUMULATOR (SETQ ACCUMULATOR (CL:FUNCALL FUNCTION (CL:FUNCALL KEY CURRENT) ACCUMULATOR)))) (SEQ-DISPATCH SEQUENCE (BACKWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT (ACCUMULATOR INITIAL-VALUE)) ACCUMULATOR (SETQ ACCUMULATOR (CL:FUNCALL FUNCTION CURRENT ACCUMULATOR))) (BACKWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (ACCUMULATOR INITIAL-VALUE)) ACCUMULATOR (SETQ ACCUMULATOR (CL:FUNCALL FUNCTION CURRENT ACCUMULATOR))))))
(CL:DEFUN REDUCE-FROM-START (FUNCTION SEQUENCE START END INITIAL-VALUE &OPTIONAL KEY) (CL:IF KEY (SEQ-DISPATCH SEQUENCE (FORWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT (ACCUMULATOR INITIAL-VALUE)) ACCUMULATOR (SETQ ACCUMULATOR (CL:FUNCALL FUNCTION ACCUMULATOR (CL:FUNCALL KEY CURRENT)))) (FORWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (ACCUMULATOR INITIAL-VALUE)) ACCUMULATOR (SETQ ACCUMULATOR (CL:FUNCALL FUNCTION ACCUMULATOR (CL:FUNCALL KEY CURRENT))))) (SEQ-DISPATCH SEQUENCE (FORWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT (ACCUMULATOR INITIAL-VALUE)) ACCUMULATOR (SETQ ACCUMULATOR (CL:FUNCALL FUNCTION ACCUMULATOR CURRENT))) (FORWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (ACCUMULATOR INITIAL-VALUE)) ACCUMULATOR (SETQ ACCUMULATOR (CL:FUNCALL FUNCTION ACCUMULATOR CURRENT))))))
(CL:DEFUN CL:REDUCE (FUNCTION SEQUENCE &KEY (START 0) END FROM-END (INITIAL-VALUE NIL INITIAL-VALUE-P) (KEY (QUOTE CL:IDENTITY) KEY-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF INITIAL-VALUE-P (CL:IF FROM-END (REDUCE-FROM-END FUNCTION SEQUENCE START END INITIAL-VALUE (AND KEY-P KEY)) (REDUCE-FROM-START FUNCTION SEQUENCE START END INITIAL-VALUE (AND KEY-P KEY))) (CASE (- END START) (0 (CL:FUNCALL FUNCTION)) (1 (CL:FUNCALL KEY (CL:ELT SEQUENCE START))) (T (CL:IF FROM-END (REDUCE-FROM-END FUNCTION SEQUENCE START (CL:1- END) (CL:FUNCALL KEY (CL:ELT SEQUENCE (CL:1- END))) (AND KEY-P KEY)) (REDUCE-FROM-START FUNCTION SEQUENCE (CL:1+ START) END (CL:FUNCALL KEY (CL:ELT SEQUENCE START)) (AND KEY-P KEY))))))))
(PUTPROPS CMLSEQMAPPERS FILETYPE CL:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DONTCOPY DOEVAL@COMPILE
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
)
(PUTPROPS CMLSEQMAPPERS COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991))
(DECLARE%: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLSEQMAPPERS.LCOM Normal file

Binary file not shown.

143
CLTL2/CMLSEQMODIFY Normal file
View File

@@ -0,0 +1,143 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "29-Aug-91 16:38:18" {DSK}<new>sources>lispcore>sources>CMLSEQMODIFY.;2 34278
changes to%: (VARS CMLSEQMODIFYCOMS) (FUNCTIONS CL:MAP-INTO CL::MAP-INTO-SINGLE CL::MAP-INTO-MULTIPLE)
previous date%: "16-May-90 14:33:28" {DSK}<new>sources>lispcore>sources>CMLSEQMODIFY.;1)
(* ; "
Copyright (c) 1986, 1987, 1990, 1991 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLSEQMODIFYCOMS)
(RPAQQ CMLSEQMODIFYCOMS ((DECLARE%: EVAL@COMPILE DONTCOPY (FILES CMLSEQCOMMON)) (FUNCTIONS CL:FILL CL:REPLACE) (FUNCTIONS %%DESTRUCTIVE-RESULT-VECTOR) (FUNCTIONS SIMPLE-REMOVE-MACRO SIMPLE-REMOVE SIMPLE-REMOVE-IF SIMPLE-REMOVE-IF-NOT COMPLEX-REMOVE-MACRO COMPLEX-REMOVE COMPLEX-REMOVE-IF COMPLEX-REMOVE-IF-NOT CL:REMOVE CL:REMOVE-IF CL:REMOVE-IF-NOT) (FUNCTIONS SIMPLE-DELETE-MACRO SIMPLE-DELETE SIMPLE-DELETE-IF SIMPLE-DELETE-IF-NOT COMPLEX-DELETE-MACRO COMPLEX-DELETE COMPLEX-DELETE-IF COMPLEX-DELETE-IF-NOT CL:DELETE CL:DELETE-IF CL:DELETE-IF-NOT) (FUNCTIONS SIMPLE-REMOVE-DUPLICATES COMPLEX-REMOVE-DUPLICATES CL:REMOVE-DUPLICATES) (FUNCTIONS SIMPLE-DELETE-DUPLICATES COMPLEX-DELETE-DUPLICATES CL:DELETE-DUPLICATES) (FUNCTIONS SIMPLE-SUBSTITUTE-MACRO SIMPLE-SUBSTITUTE SIMPLE-SUBSTITUTE-IF SIMPLE-SUBSTITUTE-IF-NOT COMPLEX-SUBSTITUTE-MACRO COMPLEX-SUBSTITUTE COMPLEX-SUBSTITUTE-IF COMPLEX-SUBSTITUTE-IF-NOT CL:SUBSTITUTE CL:SUBSTITUTE-IF CL:SUBSTITUTE-IF-NOT) (FUNCTIONS SIMPLE-NSUBSTITUTE-MACRO SIMPLE-NSUBSTITUTE SIMPLE-NSUBSTITUTE-IF SIMPLE-NSUBSTITUTE-IF-NOT COMPLEX-NSUBSTITUTE-MACRO COMPLEX-NSUBSTITUTE COMPLEX-NSUBSTITUTE-IF COMPLEX-NSUBSTITUTE-IF-NOT CL:NSUBSTITUTE CL:NSUBSTITUTE-IF CL:NSUBSTITUTE-IF-NOT) (FUNCTIONS CL:MAP-INTO CL::MAP-INTO-SINGLE CL::MAP-INTO-MULTIPLE) (PROP FILETYPE CMLSEQMODIFY) (DECLARE%: DONTCOPY DONTEVAL@LOAD DOEVAL@COMPILE (LOCALVARS . T))))
(DECLARE%: EVAL@COMPILE DONTCOPY
(FILESLOAD CMLSEQCOMMON)
)
(CL:DEFUN CL:FILL (SEQUENCE ITEM &KEY (START 0) END) "Replace the specified elements of SEQUENCE with ITEM." (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (SEQ-DISPATCH SEQUENCE (FORWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT) SEQUENCE (RPLACA %%SUBSEQ ITEM)) (FILL-VECTOR-SUBSEQ SEQUENCE START END ITEM))))
(CL:DEFUN CL:REPLACE (SEQUENCE1 SEQUENCE2 &KEY (START1 0) END1 (START2 0) END2) (LET ((LENGTH1 (CL:LENGTH SEQUENCE1)) (LENGTH2 (CL:LENGTH SEQUENCE2))) (CL:IF (NULL END1) (SETQ END1 LENGTH1)) (CL:IF (NULL END2) (SETQ END2 LENGTH2)) (CHECK-SUBSEQ SEQUENCE1 START1 END1 LENGTH1) (CHECK-SUBSEQ SEQUENCE2 START2 END2 LENGTH2) (LET ((SUBLEN1 (- END1 START1)) (SUBLEN2 (- END2 START2))) (* ; "Make equal length") (CL:IF (< SUBLEN1 SUBLEN2) (SETQ END2 (+ START2 SUBLEN1)) (SETQ END1 (+ START1 SUBLEN2))) (* ; "Check for overlap") (CL:WHEN (AND (EQ SEQUENCE1 SEQUENCE2) (> START1 START2) (< START1 END2)) (SETQ SEQUENCE2 (CL:SUBSEQ SEQUENCE2 START2 END2)) (SETQ START2 0) (SETQ END2 (- END2 START2))) (SEQ-DISPATCH SEQUENCE1 (SEQ-DISPATCH SEQUENCE2 (CL:DO ((SUBSEQ1 (CL:NTHCDR START1 SEQUENCE1) (CDR SUBSEQ1)) (SUBSEQ2 (CL:NTHCDR START2 SEQUENCE2) (CDR SUBSEQ2)) (INDEX1 START1 (CL:1+ INDEX1))) ((EQL INDEX1 END1)) (RPLACA SUBSEQ1 (CAR SUBSEQ2))) (CL:DO ((SUBSEQ1 (CL:NTHCDR START1 SEQUENCE1) (CDR SUBSEQ1)) (INDEX1 START1 (CL:1+ INDEX1)) (INDEX2 START2 (CL:1+ INDEX2))) ((EQL INDEX1 END1)) (RPLACA SUBSEQ1 (CL:AREF SEQUENCE2 INDEX2)))) (SEQ-DISPATCH SEQUENCE2 (CL:DO ((SUBSEQ2 (CL:NTHCDR START2 SEQUENCE2) (CDR SUBSEQ2)) (INDEX1 START1 (CL:1+ INDEX1))) ((EQL INDEX1 END1)) (CL:SETF (CL:AREF SEQUENCE1 INDEX1) (CAR SUBSEQ2))) (CL:DO ((INDEX1 START1 (CL:1+ INDEX1)) (INDEX2 START2 (CL:1+ INDEX2))) ((EQL INDEX1 END1)) (CL:SETF (CL:AREF SEQUENCE1 INDEX1) (CL:AREF SEQUENCE2 INDEX2))))) SEQUENCE1)))
(CL:DEFUN %%DESTRUCTIVE-RESULT-VECTOR (VECTOR START) (CL:IF (CL:ARRAY-HAS-FILL-POINTER-P VECTOR) VECTOR (LET ((RESULT (CL:MAKE-ARRAY (VECTOR-LENGTH VECTOR) :ELEMENT-TYPE (CL:ARRAY-ELEMENT-TYPE VECTOR) :FILL-POINTER T))) (COPY-VECTOR VECTOR RESULT :END1 START))))
(DEFMACRO SIMPLE-REMOVE-MACRO (SEQUENCE START END TEST-FORM) (BQUOTE (SEQ-DISPATCH (\, SEQUENCE) (LET ((RESULT-HEAD (CL:SUBSEQ (\, SEQUENCE) 0 (\, START))) (RESULT-TAIL (CL:NTHCDR (\, END) (\, SEQUENCE))) (RESULT-MIDDLE (FORWARD-LIST-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT NEW-LIST TAIL) NEW-LIST (CL:IF (NOT (\, TEST-FORM)) (COLLECT-ITEM CURRENT NEW-LIST TAIL))))) (NCONC RESULT-HEAD RESULT-MIDDLE RESULT-TAIL)) (LET* ((LENGTH (VECTOR-LENGTH (\, SEQUENCE))) (RESULT (CL:MAKE-ARRAY LENGTH :ELEMENT-TYPE (CL:ARRAY-ELEMENT-TYPE (\, SEQUENCE)) :FILL-POINTER T)) (NUMBER-OF-MATCHES 0)) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) 0 (\, START) RESULT 0) (FORWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT (SLOW-INDEX (\, START))) NIL (COND ((NOT (\, TEST-FORM)) (CL:SETF (CL:AREF RESULT SLOW-INDEX) CURRENT) (CL:INCF SLOW-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES)))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) (\, END) LENGTH RESULT (- (\, END) NUMBER-OF-MATCHES)) (CL:SETF (CL:FILL-POINTER RESULT) (- LENGTH NUMBER-OF-MATCHES)) RESULT))))
(CL:DEFUN SIMPLE-REMOVE (ITEM SEQUENCE START END) (SIMPLE-REMOVE-MACRO SEQUENCE START END (EQL ITEM CURRENT)))
(CL:DEFUN SIMPLE-REMOVE-IF (TEST SEQUENCE START END) (SIMPLE-REMOVE-MACRO SEQUENCE START END (CL:FUNCALL TEST CURRENT)))
(CL:DEFUN SIMPLE-REMOVE-IF-NOT (TEST SEQUENCE START END) (SIMPLE-REMOVE-MACRO SEQUENCE START END (NOT (CL:FUNCALL TEST CURRENT))))
(DEFMACRO COMPLEX-REMOVE-MACRO (SEQUENCE START END FROM-END KEY COUNT TEST-FORM) (BQUOTE (LET ((NUMBER-OF-MATCHES 0)) (SEQ-DISPATCH (\, SEQUENCE) (LET ((RESULT-HEAD (CL:SUBSEQ (\, SEQUENCE) 0 (\, START))) (RESULT-TAIL (CL:NTHCDR (\, END) (\, SEQUENCE))) (RESULT-MIDDLE (CL:IF (NULL (AND (\, FROM-END) (\, COUNT))) (FORWARD-LIST-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT NEW-LIST TAIL) NEW-LIST (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) (COLLECT-ITEM CURRENT NEW-LIST TAIL)) (T (CL:INCF NUMBER-OF-MATCHES)))) (BACKWARD-LIST-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT NEW-LIST) NEW-LIST (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) (CL:PUSH CURRENT NEW-LIST)) (T (CL:INCF NUMBER-OF-MATCHES))))))) (NCONC RESULT-HEAD RESULT-MIDDLE RESULT-TAIL)) (LET* ((LENGTH (VECTOR-LENGTH (\, SEQUENCE))) (RESULT (CL:MAKE-ARRAY LENGTH :ELEMENT-TYPE (CL:ARRAY-ELEMENT-TYPE (\, SEQUENCE)) :FILL-POINTER T))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) 0 (\, START) RESULT 0) (CL:IF (NULL (AND (\, FROM-END) (\, COUNT))) (FORWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT (RESULT-INDEX (\, START))) NIL (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) (CL:SETF (CL:AREF RESULT RESULT-INDEX) CURRENT) (CL:INCF RESULT-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES)))) (BACKWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT (RESULT-INDEX (CL:1- (\, END)))) (AND (> NUMBER-OF-MATCHES 0) (COPY-VECTOR-SUBSEQ RESULT (+ (\, START) NUMBER-OF-MATCHES) (\, END) RESULT (\, START) (- (\, END) NUMBER-OF-MATCHES))) (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) (CL:SETF (CL:AREF RESULT RESULT-INDEX) CURRENT) (CL:DECF RESULT-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES))))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) (\, END) LENGTH RESULT (- (\, END) NUMBER-OF-MATCHES)) (CL:SETF (CL:FILL-POINTER RESULT) (- LENGTH NUMBER-OF-MATCHES)) RESULT)))))
(CL:DEFUN COMPLEX-REMOVE (ITEM SEQUENCE START END FROM-END KEY COUNT TEST TEST-NOT-P) (COMPLEX-REMOVE-MACRO SEQUENCE START END FROM-END KEY COUNT (CL:IF TEST-NOT-P (NOT (CL:FUNCALL TEST ITEM (CL:FUNCALL KEY CURRENT))) (CL:FUNCALL TEST ITEM (CL:FUNCALL KEY CURRENT)))))
(CL:DEFUN COMPLEX-REMOVE-IF (TEST SEQUENCE START END FROM-END KEY COUNT) (COMPLEX-REMOVE-MACRO SEQUENCE START END FROM-END KEY COUNT (CL:FUNCALL TEST (CL:FUNCALL KEY CURRENT))))
(CL:DEFUN COMPLEX-REMOVE-IF-NOT (TEST SEQUENCE START END FROM-END KEY COUNT) (COMPLEX-REMOVE-MACRO SEQUENCE START END FROM-END KEY COUNT (NOT (CL:FUNCALL TEST (CL:FUNCALL KEY CURRENT)))))
(CL:DEFUN CL:REMOVE (ITEM SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P) (TEST (QUOTE EQL) TEST-P) (TEST-NOT NIL TEST-NOT-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (AND TEST-P TEST-NOT-P) (CL:ERROR "Both test and test-not provided")) (CL:IF (OR FROM-END-P KEY-P COUNT TEST-P TEST-NOT-P) (COMPLEX-REMOVE ITEM SEQUENCE START END FROM-END KEY COUNT (CL:IF TEST-NOT-P TEST-NOT TEST) TEST-NOT-P) (SIMPLE-REMOVE ITEM SEQUENCE START END))))
(CL:DEFUN CL:REMOVE-IF (TEST SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (OR FROM-END-P KEY-P COUNT) (COMPLEX-REMOVE-IF TEST SEQUENCE START END FROM-END KEY COUNT) (SIMPLE-REMOVE-IF TEST SEQUENCE START END))))
(CL:DEFUN CL:REMOVE-IF-NOT (TEST SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (OR FROM-END-P KEY-P COUNT) (COMPLEX-REMOVE-IF-NOT TEST SEQUENCE START END FROM-END KEY COUNT) (SIMPLE-REMOVE-IF-NOT TEST SEQUENCE START END))))
(DEFMACRO SIMPLE-DELETE-MACRO (SEQUENCE START END TEST-FORM) (BQUOTE (SEQ-DISPATCH (\, SEQUENCE) (LET ((HANDLE (CONS NIL (\, SEQUENCE)))) (FORWARD-LIST-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT (PREVIOUS (CL:NTHCDR (\, START) HANDLE))) (CDR HANDLE) (CL:IF (NOT (\, TEST-FORM)) (SETQ PREVIOUS (CDR PREVIOUS)) (RPLACD PREVIOUS (CDR %%SUBSEQ))))) (LET ((LENGTH (VECTOR-LENGTH (\, SEQUENCE))) (NUMBER-OF-MATCHES 0) (RESULT (%%DESTRUCTIVE-RESULT-VECTOR (\, SEQUENCE) (\, START)))) (FORWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT (SLOW-INDEX (\, START))) NIL (COND ((NOT (\, TEST-FORM)) (CL:SETF (CL:AREF RESULT SLOW-INDEX) CURRENT) (CL:INCF SLOW-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES)))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) (\, END) LENGTH RESULT (- (\, END) NUMBER-OF-MATCHES)) (CL:SETF (CL:FILL-POINTER RESULT) (- LENGTH NUMBER-OF-MATCHES)) RESULT))))
(CL:DEFUN SIMPLE-DELETE (ITEM SEQUENCE START END) (SIMPLE-DELETE-MACRO SEQUENCE START END (EQL ITEM CURRENT)))
(CL:DEFUN SIMPLE-DELETE-IF (TEST SEQUENCE START END) (SIMPLE-DELETE-MACRO SEQUENCE START END (CL:FUNCALL TEST CURRENT)))
(CL:DEFUN SIMPLE-DELETE-IF-NOT (TEST SEQUENCE START END) (SIMPLE-DELETE-MACRO SEQUENCE START END (NOT (CL:FUNCALL TEST CURRENT))))
(DEFMACRO COMPLEX-DELETE-MACRO (SEQUENCE START END FROM-END KEY COUNT TEST-FORM) (BQUOTE (LET ((NUMBER-OF-MATCHES 0)) (SEQ-DISPATCH (\, SEQUENCE) (LET ((HANDLE (CONS NIL (\, SEQUENCE)))) (CL:IF (NULL (AND (\, FROM-END) (\, COUNT))) (CL:DO ((PREVIOUS (CL:NTHCDR (\, START) HANDLE)) (%%SUBSEQ (CL:NTHCDR (\, START) (\, SEQUENCE)) (CDR %%SUBSEQ)) (INDEX (\, START) (CL:1+ INDEX)) CURRENT) ((OR (EQL INDEX (\, END)) (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT)))) (CDR HANDLE)) (SETQ CURRENT (CAR %%SUBSEQ)) (COND ((NOT (\, TEST-FORM)) (SETQ PREVIOUS (CDR PREVIOUS))) (T (RPLACD PREVIOUS (CDR %%SUBSEQ)) (CL:INCF NUMBER-OF-MATCHES)))) (CL:DO ((INDEX (CL:1- (\, END)) (CL:1- INDEX)) (LAST (CL:NTHCDR (\, END) (\, SEQUENCE))) PREVIOUS CURRENT) ((OR (< INDEX (\, START)) (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT)))) (CDR HANDLE)) (SETQ PREVIOUS (CL:NTHCDR INDEX HANDLE)) (SETQ CURRENT (CADR PREVIOUS)) (COND ((NOT (\, TEST-FORM)) (SETQ LAST (CDR PREVIOUS))) (T (RPLACD PREVIOUS LAST) (CL:INCF NUMBER-OF-MATCHES)))))) (LET ((LENGTH (VECTOR-LENGTH (\, SEQUENCE))) (RESULT (%%DESTRUCTIVE-RESULT-VECTOR (\, SEQUENCE) (\, START)))) (CL:IF (NULL (AND (\, FROM-END) (\, COUNT))) (FORWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT (SLOW-INDEX (\, START))) NIL (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) (CL:SETF (CL:AREF RESULT SLOW-INDEX) CURRENT) (CL:INCF SLOW-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES)))) (BACKWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT (SLOW-INDEX (CL:1- (\, END)))) (AND (> NUMBER-OF-MATCHES 0) (COPY-VECTOR-SUBSEQ RESULT (+ (\, START) NUMBER-OF-MATCHES) (\, END) RESULT (\, START) (- (\, END) NUMBER-OF-MATCHES))) (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) (CL:SETF (CL:AREF RESULT SLOW-INDEX) CURRENT) (CL:DECF SLOW-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES))))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) (\, END) LENGTH RESULT (- (\, END) NUMBER-OF-MATCHES)) (CL:SETF (CL:FILL-POINTER RESULT) (- LENGTH NUMBER-OF-MATCHES)) RESULT)))))
(CL:DEFUN COMPLEX-DELETE (ITEM SEQUENCE START END FROM-END KEY COUNT TEST TEST-NOT-P) (COMPLEX-DELETE-MACRO SEQUENCE START END FROM-END KEY COUNT (CL:IF TEST-NOT-P (NOT (CL:FUNCALL TEST ITEM (CL:FUNCALL KEY CURRENT))) (CL:FUNCALL TEST ITEM (CL:FUNCALL KEY CURRENT)))))
(CL:DEFUN COMPLEX-DELETE-IF (TEST SEQUENCE START END FROM-END KEY COUNT) (COMPLEX-DELETE-MACRO SEQUENCE START END FROM-END KEY COUNT (CL:FUNCALL TEST (CL:FUNCALL KEY CURRENT))))
(CL:DEFUN COMPLEX-DELETE-IF-NOT (TEST SEQUENCE START END FROM-END KEY COUNT) (COMPLEX-DELETE-MACRO SEQUENCE START END FROM-END KEY COUNT (NOT (CL:FUNCALL TEST (CL:FUNCALL KEY CURRENT)))))
(CL:DEFUN CL:DELETE (ITEM SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P) (TEST (QUOTE EQL) TEST-P) (TEST-NOT NIL TEST-NOT-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (AND TEST-P TEST-NOT-P) (CL:ERROR "Both test and test-not provided")) (CL:IF (OR FROM-END-P KEY-P COUNT TEST-P TEST-NOT-P) (COMPLEX-DELETE ITEM SEQUENCE START END FROM-END KEY COUNT (CL:IF TEST-NOT-P TEST-NOT TEST) TEST-NOT-P) (SIMPLE-DELETE ITEM SEQUENCE START END))))
(CL:DEFUN CL:DELETE-IF (TEST SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (OR FROM-END-P KEY-P COUNT) (COMPLEX-DELETE-IF TEST SEQUENCE START END FROM-END KEY COUNT) (SIMPLE-DELETE-IF TEST SEQUENCE START END))))
(CL:DEFUN CL:DELETE-IF-NOT (TEST SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (OR FROM-END-P KEY-P COUNT) (COMPLEX-DELETE-IF-NOT TEST SEQUENCE START END FROM-END KEY COUNT) (SIMPLE-DELETE-IF-NOT TEST SEQUENCE START END))))
(CL:DEFUN SIMPLE-REMOVE-DUPLICATES (SEQUENCE START END) (SIMPLE-REMOVE-MACRO SEQUENCE START END (SIMPLE-POSITION CURRENT SEQUENCE (CL:1+ INDEX) END)))
(CL:DEFUN COMPLEX-REMOVE-DUPLICATES (SEQUENCE START END FROM-END KEY TEST TEST-NOT-P) (SEQ-DISPATCH SEQUENCE (LET ((RESULT-HEAD (CL:SUBSEQ SEQUENCE 0 START)) (RESULT-TAIL (CL:NTHCDR END SEQUENCE)) (RESULT-MIDDLE (CL:IF (NULL FROM-END) (FORWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT NEW-LIST TAIL) NEW-LIST (CL:IF (NOT (COMPLEX-POSITION (CL:FUNCALL KEY CURRENT) SEQUENCE (CL:1+ INDEX) END NIL KEY TEST TEST-NOT-P)) (COLLECT-ITEM CURRENT NEW-LIST TAIL))) (FORWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT NEW-LIST TAIL) NEW-LIST (CL:IF (NOT (COMPLEX-POSITION (CL:FUNCALL KEY CURRENT) SEQUENCE START INDEX NIL KEY TEST TEST-NOT-P)) (COLLECT-ITEM CURRENT NEW-LIST TAIL)))))) (NCONC RESULT-HEAD RESULT-MIDDLE RESULT-TAIL)) (LET* ((LENGTH (VECTOR-LENGTH SEQUENCE)) (RESULT (CL:MAKE-ARRAY LENGTH :ELEMENT-TYPE (CL:ARRAY-ELEMENT-TYPE SEQUENCE) :FILL-POINTER T)) (NUMBER-OF-MATCHES 0)) (COPY-VECTOR-SUBSEQ SEQUENCE 0 START RESULT 0) (CL:IF (NULL FROM-END) (FORWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (RESULT-INDEX START) TEST-RESULT) NIL (COND ((NOT (COMPLEX-POSITION (CL:FUNCALL KEY CURRENT) SEQUENCE (CL:1+ INDEX) END NIL KEY TEST TEST-NOT-P)) (CL:SETF (CL:AREF RESULT RESULT-INDEX) CURRENT) (CL:INCF RESULT-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES)))) (FORWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (RESULT-INDEX START) TEST-RESULT) NIL (COND ((NOT (COMPLEX-POSITION (CL:FUNCALL KEY CURRENT) SEQUENCE START INDEX NIL KEY TEST TEST-NOT-P)) (CL:SETF (CL:AREF RESULT RESULT-INDEX) CURRENT) (CL:INCF RESULT-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES))))) (COPY-VECTOR-SUBSEQ SEQUENCE END LENGTH RESULT (- END NUMBER-OF-MATCHES)) (CL:SETF (CL:FILL-POINTER RESULT) (- LENGTH NUMBER-OF-MATCHES)) RESULT)))
(CL:DEFUN CL:REMOVE-DUPLICATES (SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) (KEY (QUOTE CL:IDENTITY) KEY-P) (TEST (QUOTE EQL) TEST-P) (TEST-NOT NIL TEST-NOT-P)) "The elements of Sequence are examined, and if any two match, one is discarded. The resulting sequence is returned." (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (AND TEST-P TEST-NOT-P) (CL:ERROR "Both test and test-not provided")) (CL:IF (OR FROM-END-P KEY-P TEST-P TEST-NOT-P) (COMPLEX-REMOVE-DUPLICATES SEQUENCE START END FROM-END KEY (CL:IF TEST-NOT-P TEST-NOT TEST) TEST-NOT-P) (SIMPLE-REMOVE-DUPLICATES SEQUENCE START END))))
(CL:DEFUN SIMPLE-DELETE-DUPLICATES (SEQUENCE START END) (SEQ-DISPATCH SEQUENCE (LET ((HANDLE (CONS NIL SEQUENCE))) (FORWARD-LIST-LOOP SEQUENCE START END (INDEX CURRENT (PREVIOUS (CL:NTHCDR START HANDLE))) (CDR HANDLE) (CL:IF (NOT (SIMPLE-POSITION CURRENT (CDR %%SUBSEQ) 0 (- END INDEX 1))) (SETQ PREVIOUS (CDR PREVIOUS)) (RPLACD PREVIOUS (CDR %%SUBSEQ))))) (LET ((LENGTH (VECTOR-LENGTH SEQUENCE)) (NUMBER-OF-MATCHES 0) (RESULT (%%DESTRUCTIVE-RESULT-VECTOR SEQUENCE START))) (FORWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (SLOW-INDEX START)) NIL (COND ((NOT (SIMPLE-POSITION CURRENT SEQUENCE (CL:1+ INDEX) END)) (CL:SETF (CL:AREF RESULT SLOW-INDEX) CURRENT) (CL:INCF SLOW-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES)))) (COPY-VECTOR-SUBSEQ SEQUENCE END LENGTH RESULT (- END NUMBER-OF-MATCHES)) (CL:SETF (CL:FILL-POINTER RESULT) (- LENGTH NUMBER-OF-MATCHES)) RESULT)))
(CL:DEFUN COMPLEX-DELETE-DUPLICATES (SEQUENCE START END FROM-END KEY TEST TEST-NOT-P) (SEQ-DISPATCH SEQUENCE (LET ((HANDLE (CONS NIL SEQUENCE))) (CL:IF (NULL FROM-END) (CL:DO ((PREVIOUS (CL:NTHCDR START HANDLE)) (%%SUBSEQ (CL:NTHCDR START SEQUENCE) (CDR %%SUBSEQ)) (INDEX START (CL:1+ INDEX))) ((EQL INDEX END) (CDR HANDLE)) (CL:IF (NOT (COMPLEX-POSITION (CL:FUNCALL KEY (CAR %%SUBSEQ)) (CDR %%SUBSEQ) 0 (- END INDEX 1) NIL KEY TEST TEST-NOT-P)) (SETQ PREVIOUS (CDR PREVIOUS)) (RPLACD PREVIOUS (CDR %%SUBSEQ)))) (CL:DO ((NUMBER-OF-MATCHES 0) (PREVIOUS (CL:NTHCDR START HANDLE)) (%%SUBSEQ (CL:NTHCDR START SEQUENCE) (CDR %%SUBSEQ)) (INDEX START (CL:1+ INDEX))) ((EQL INDEX END) (CDR HANDLE)) (COND ((NOT (COMPLEX-POSITION (CL:FUNCALL KEY (CAR %%SUBSEQ)) SEQUENCE START (- INDEX NUMBER-OF-MATCHES) NIL KEY TEST TEST-NOT-P)) (SETQ PREVIOUS (CDR PREVIOUS))) (T (RPLACD PREVIOUS (CDR %%SUBSEQ)) (CL:INCF NUMBER-OF-MATCHES)))))) (LET ((LENGTH (VECTOR-LENGTH SEQUENCE)) (NUMBER-OF-MATCHES 0) (RESULT (%%DESTRUCTIVE-RESULT-VECTOR SEQUENCE START))) (CL:IF (NULL FROM-END) (FORWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (RESULT-INDEX START) TEST-RESULT) NIL (COND ((NOT (COMPLEX-POSITION (CL:FUNCALL KEY CURRENT) SEQUENCE (CL:1+ INDEX) END NIL KEY TEST TEST-NOT-P)) (CL:SETF (CL:AREF RESULT RESULT-INDEX) CURRENT) (CL:INCF RESULT-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES)))) (FORWARD-VECTOR-LOOP SEQUENCE START END (INDEX CURRENT (RESULT-INDEX START) TEST-RESULT) NIL (COND ((NOT (COMPLEX-POSITION (CL:FUNCALL KEY CURRENT) SEQUENCE START INDEX NIL KEY TEST TEST-NOT-P)) (CL:SETF (CL:AREF RESULT RESULT-INDEX) CURRENT) (CL:INCF RESULT-INDEX)) (T (CL:INCF NUMBER-OF-MATCHES))))) (COPY-VECTOR-SUBSEQ SEQUENCE END LENGTH RESULT (- END NUMBER-OF-MATCHES)) (CL:SETF (CL:FILL-POINTER RESULT) (- LENGTH NUMBER-OF-MATCHES)) RESULT)))
(CL:DEFUN CL:DELETE-DUPLICATES (SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) (KEY (QUOTE CL:IDENTITY) KEY-P) (TEST (QUOTE EQL) TEST-P) (TEST-NOT NIL TEST-NOT-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (AND TEST-P TEST-NOT-P) (CL:ERROR "Both test and test-not provided")) (CL:IF (OR FROM-END-P KEY-P TEST-P TEST-NOT-P) (COMPLEX-DELETE-DUPLICATES SEQUENCE START END FROM-END KEY (CL:IF TEST-NOT-P TEST-NOT TEST) TEST-NOT-P) (SIMPLE-DELETE-DUPLICATES SEQUENCE START END))))
(DEFMACRO SIMPLE-SUBSTITUTE-MACRO (NEWITEM SEQUENCE START END TEST-FORM) (BQUOTE (SEQ-DISPATCH (\, SEQUENCE) (LET ((RESULT-HEAD (CL:SUBSEQ (\, SEQUENCE) 0 (\, START))) (RESULT-TAIL (CL:NTHCDR (\, END) (\, SEQUENCE))) (RESULT-MIDDLE (FORWARD-LIST-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT NEW-LIST TAIL NEW-ELEMENT) NEW-LIST (SETQ NEW-ELEMENT (CL:IF (\, TEST-FORM) (\, NEWITEM) CURRENT)) (COLLECT-ITEM NEW-ELEMENT NEW-LIST TAIL)))) (NCONC RESULT-HEAD RESULT-MIDDLE RESULT-TAIL)) (LET* ((LENGTH (VECTOR-LENGTH (\, SEQUENCE))) (RESULT (MAKE-VECTOR LENGTH :ELEMENT-TYPE (CL:ARRAY-ELEMENT-TYPE (\, SEQUENCE))))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) 0 (\, START) RESULT 0) (FORWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT) NIL (CL:SETF (CL:AREF RESULT INDEX) (CL:IF (\, TEST-FORM) (\, NEWITEM) CURRENT))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) (\, END) LENGTH RESULT (\, END)) RESULT))))
(CL:DEFUN SIMPLE-SUBSTITUTE (NEWITEM OLDITEM SEQUENCE START END) (SIMPLE-SUBSTITUTE-MACRO NEWITEM SEQUENCE START END (EQL OLDITEM CURRENT)))
(CL:DEFUN SIMPLE-SUBSTITUTE-IF (NEWITEM TEST SEQUENCE START END) (SIMPLE-SUBSTITUTE-MACRO NEWITEM SEQUENCE START END (CL:FUNCALL TEST CURRENT)))
(CL:DEFUN SIMPLE-SUBSTITUTE-IF-NOT (NEWITEM TEST SEQUENCE START END) (SIMPLE-SUBSTITUTE-MACRO NEWITEM SEQUENCE START END (NOT (CL:FUNCALL TEST CURRENT))))
(DEFMACRO COMPLEX-SUBSTITUTE-MACRO (NEWITEM SEQUENCE START END FROM-END KEY COUNT TEST-FORM) (BQUOTE (LET ((NUMBER-OF-MATCHES 0)) (SEQ-DISPATCH (\, SEQUENCE) (LET ((RESULT-HEAD (CL:SUBSEQ (\, SEQUENCE) 0 (\, START))) (RESULT-TAIL (CL:NTHCDR (\, END) (\, SEQUENCE))) (RESULT-MIDDLE (CL:IF (NULL (AND (\, FROM-END) (\, COUNT))) (FORWARD-LIST-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT NEW-LIST TAIL NEW-ELEMENT) NEW-LIST (SETQ NEW-ELEMENT (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) CURRENT) (T (CL:INCF NUMBER-OF-MATCHES) (\, NEWITEM)))) (COLLECT-ITEM NEW-ELEMENT NEW-LIST TAIL)) (BACKWARD-LIST-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT NEW-LIST NEW-ELEMENT) NEW-LIST (SETQ NEW-ELEMENT (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) CURRENT) (T (CL:INCF NUMBER-OF-MATCHES) (\, NEWITEM)))) (CL:PUSH NEW-ELEMENT NEW-LIST))))) (NCONC RESULT-HEAD RESULT-MIDDLE RESULT-TAIL)) (LET* ((LENGTH (VECTOR-LENGTH (\, SEQUENCE))) (RESULT (MAKE-VECTOR LENGTH :ELEMENT-TYPE (CL:ARRAY-ELEMENT-TYPE (\, SEQUENCE))))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) 0 (\, START) RESULT 0) (CL:IF (NULL (\, FROM-END)) (FORWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT) NIL (CL:SETF (CL:AREF RESULT INDEX) (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) CURRENT) (T (CL:INCF NUMBER-OF-MATCHES) (\, NEWITEM))))) (BACKWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT) NIL (CL:SETF (CL:AREF RESULT INDEX) (COND ((OR (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT))) (NOT (\, TEST-FORM))) CURRENT) (T (CL:INCF NUMBER-OF-MATCHES) (\, NEWITEM)))))) (COPY-VECTOR-SUBSEQ (\, SEQUENCE) (\, END) LENGTH RESULT (\, END)) RESULT)))))
(CL:DEFUN COMPLEX-SUBSTITUTE (NEWITEM OLDITEM SEQUENCE START END FROM-END KEY COUNT TEST TEST-NOT-P) (COMPLEX-SUBSTITUTE-MACRO NEWITEM SEQUENCE START END FROM-END KEY COUNT (CL:IF TEST-NOT-P (NOT (CL:FUNCALL TEST OLDITEM (CL:FUNCALL KEY CURRENT))) (CL:FUNCALL TEST OLDITEM (CL:FUNCALL KEY CURRENT)))))
(CL:DEFUN COMPLEX-SUBSTITUTE-IF (NEWITEM TEST SEQUENCE START END FROM-END KEY COUNT) (COMPLEX-SUBSTITUTE-MACRO NEWITEM SEQUENCE START END FROM-END KEY COUNT (CL:FUNCALL TEST (CL:FUNCALL KEY CURRENT))))
(CL:DEFUN COMPLEX-SUBSTITUTE-IF-NOT (NEWITEM TEST SEQUENCE START END FROM-END KEY COUNT) (COMPLEX-SUBSTITUTE-MACRO NEWITEM SEQUENCE START END FROM-END KEY COUNT (NOT (CL:FUNCALL TEST (CL:FUNCALL KEY CURRENT)))))
(CL:DEFUN CL:SUBSTITUTE (NEWITEM OLDITEM SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P) (TEST (QUOTE EQL) TEST-P) (TEST-NOT NIL TEST-NOT-P)) "Returns a sequence of the same kind as Sequence with the same elements except that all elements that match Old are replaced with New." (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (AND TEST-P TEST-NOT-P) (CL:ERROR "Both test and test-not provided")) (CL:IF (OR FROM-END-P KEY-P COUNT TEST-P TEST-NOT-P) (COMPLEX-SUBSTITUTE NEWITEM OLDITEM SEQUENCE START END FROM-END KEY COUNT (CL:IF TEST-NOT-P TEST-NOT TEST) TEST-NOT-P) (SIMPLE-SUBSTITUTE NEWITEM OLDITEM SEQUENCE START END))))
(CL:DEFUN CL:SUBSTITUTE-IF (NEWITEM TEST SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P)) "Returns a sequence of the same kind as Sequence with the same elements except that all elements that match Old are replaced with New." (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (OR FROM-END-P KEY-P COUNT) (COMPLEX-SUBSTITUTE-IF NEWITEM TEST SEQUENCE START END FROM-END KEY COUNT) (SIMPLE-SUBSTITUTE-IF NEWITEM TEST SEQUENCE START END))))
(CL:DEFUN CL:SUBSTITUTE-IF-NOT (NEWITEM TEST SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P)) "Returns a sequence of the same kind as Sequence with the same elements except that all elements that match Old are replaced with New." (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (OR FROM-END-P KEY-P COUNT) (COMPLEX-SUBSTITUTE-IF-NOT NEWITEM TEST SEQUENCE START END FROM-END KEY COUNT) (SIMPLE-SUBSTITUTE-IF-NOT NEWITEM TEST SEQUENCE START END))))
(DEFMACRO SIMPLE-NSUBSTITUTE-MACRO (NEWITEM SEQUENCE START END TEST-FORM) (BQUOTE (SEQ-DISPATCH (\, SEQUENCE) (FORWARD-LIST-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT NEW-LIST TAIL NEW-ELEMENT) (\, SEQUENCE) (CL:IF (\, TEST-FORM) (RPLACA %%SUBSEQ (\, NEWITEM)))) (FORWARD-VECTOR-LOOP (\, SEQUENCE) (\, START) (\, END) (INDEX CURRENT) (\, SEQUENCE) (CL:IF (\, TEST-FORM) (CL:SETF (CL:AREF (\, SEQUENCE) INDEX) (\, NEWITEM)))))))
(CL:DEFUN SIMPLE-NSUBSTITUTE (NEWITEM OLDITEM SEQUENCE START END) (SIMPLE-NSUBSTITUTE-MACRO NEWITEM SEQUENCE START END (EQL OLDITEM CURRENT)))
(CL:DEFUN SIMPLE-NSUBSTITUTE-IF (NEWITEM TEST SEQUENCE START END) (SIMPLE-NSUBSTITUTE-MACRO NEWITEM SEQUENCE START END (CL:FUNCALL TEST CURRENT)))
(CL:DEFUN SIMPLE-NSUBSTITUTE-IF-NOT (NEWITEM TEST SEQUENCE START END) (SIMPLE-NSUBSTITUTE-MACRO NEWITEM SEQUENCE START END (NOT (CL:FUNCALL TEST CURRENT))))
(DEFMACRO COMPLEX-NSUBSTITUTE-MACRO (NEWITEM SEQUENCE START END FROM-END KEY COUNT TEST-FORM) (BQUOTE (LET ((NUMBER-OF-MATCHES 0)) (SEQ-DISPATCH (\, SEQUENCE) (CL:IF (NULL (AND (\, FROM-END) (\, COUNT))) (CL:DO ((%%SUBSEQ (CL:NTHCDR (\, START) (\, SEQUENCE)) (CDR %%SUBSEQ)) (INDEX (\, START) (CL:1+ INDEX)) CURRENT) ((OR (EQL INDEX (\, END)) (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT)))) (\, SEQUENCE)) (SETQ CURRENT (CAR %%SUBSEQ)) (CL:IF (AND (\, TEST-FORM) (CL:INCF NUMBER-OF-MATCHES)) (RPLACA %%SUBSEQ (\, NEWITEM)))) (CL:DO ((INDEX (CL:1- (\, END)) (CL:1- INDEX)) %%SUBSEQ CURRENT) ((OR (< INDEX (\, START)) (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT)))) (\, SEQUENCE)) (SETQ %%SUBSEQ (CL:NTHCDR INDEX (\, SEQUENCE))) (SETQ CURRENT (CAR %%SUBSEQ)) (CL:IF (AND (\, TEST-FORM) (CL:INCF NUMBER-OF-MATCHES)) (RPLACA %%SUBSEQ (\, NEWITEM))))) (LET ((LENGTH (VECTOR-LENGTH (\, SEQUENCE)))) (CL:IF (NULL (\, FROM-END)) (CL:DO ((INDEX (\, START) (CL:1+ INDEX)) CURRENT) ((OR (EQL INDEX (\, END)) (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT)))) (\, SEQUENCE)) (SETQ CURRENT (CL:AREF (\, SEQUENCE) INDEX)) (CL:IF (AND (\, TEST-FORM) (CL:INCF NUMBER-OF-MATCHES)) (CL:SETF (CL:AREF (\, SEQUENCE) INDEX) (\, NEWITEM)))) (CL:DO ((INDEX (CL:1- (\, END)) (CL:1- INDEX)) CURRENT) ((OR (< INDEX (\, START)) (AND (\, COUNT) (>= NUMBER-OF-MATCHES (\, COUNT)))) (\, SEQUENCE)) (SETQ CURRENT (CL:AREF (\, SEQUENCE) INDEX)) (CL:IF (AND (\, TEST-FORM) (CL:INCF NUMBER-OF-MATCHES)) (CL:SETF (CL:AREF (\, SEQUENCE) INDEX) (\, NEWITEM))))))))))
(CL:DEFUN COMPLEX-NSUBSTITUTE (NEWITEM OLDITEM SEQUENCE START END FROM-END KEY COUNT TEST TEST-NOT-P) (COMPLEX-NSUBSTITUTE-MACRO NEWITEM SEQUENCE START END FROM-END KEY COUNT (CL:IF TEST-NOT-P (NOT (CL:FUNCALL TEST OLDITEM (CL:FUNCALL KEY CURRENT))) (CL:FUNCALL TEST OLDITEM (CL:FUNCALL KEY CURRENT)))))
(CL:DEFUN COMPLEX-NSUBSTITUTE-IF (NEWITEM TEST SEQUENCE START END FROM-END KEY COUNT) (COMPLEX-NSUBSTITUTE-MACRO NEWITEM SEQUENCE START END FROM-END KEY COUNT (CL:FUNCALL TEST (CL:FUNCALL KEY CURRENT))))
(CL:DEFUN COMPLEX-NSUBSTITUTE-IF-NOT (NEWITEM TEST SEQUENCE START END FROM-END KEY COUNT) (COMPLEX-NSUBSTITUTE-MACRO NEWITEM SEQUENCE START END FROM-END KEY COUNT (NOT (CL:FUNCALL TEST (CL:FUNCALL KEY CURRENT)))))
(CL:DEFUN CL:NSUBSTITUTE (NEWITEM OLDITEM SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P) (TEST (QUOTE EQL) TEST-P) (TEST-NOT NIL TEST-NOT-P)) (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (AND TEST-P TEST-NOT-P) (CL:ERROR "Both test and test-not provided")) (CL:IF (OR FROM-END-P KEY-P COUNT TEST-P TEST-NOT-P) (COMPLEX-NSUBSTITUTE NEWITEM OLDITEM SEQUENCE START END FROM-END KEY COUNT (CL:IF TEST-NOT-P TEST-NOT TEST) TEST-NOT-P) (SIMPLE-NSUBSTITUTE NEWITEM OLDITEM SEQUENCE START END))))
(CL:DEFUN CL:NSUBSTITUTE-IF (NEWITEM TEST SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P)) "Returns a sequence of the same kind as Sequence with the same elements except that all elements that match Old are replaced with New." (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (OR FROM-END-P KEY-P COUNT) (COMPLEX-NSUBSTITUTE-IF NEWITEM TEST SEQUENCE START END FROM-END KEY COUNT) (SIMPLE-NSUBSTITUTE-IF NEWITEM TEST SEQUENCE START END))))
(CL:DEFUN CL:NSUBSTITUTE-IF-NOT (NEWITEM TEST SEQUENCE &KEY (START 0) END (FROM-END NIL FROM-END-P) COUNT (KEY (QUOTE CL:IDENTITY) KEY-P)) "Returns a sequence of the same kind as Sequence with the same elements except that all elements that match Old are replaced with New." (LET ((LENGTH (CL:LENGTH SEQUENCE))) (CL:IF (NULL END) (SETQ END LENGTH)) (CHECK-SUBSEQ SEQUENCE START END LENGTH) (CL:IF (OR FROM-END-P KEY-P COUNT) (COMPLEX-NSUBSTITUTE-IF-NOT NEWITEM TEST SEQUENCE START END FROM-END KEY COUNT) (SIMPLE-NSUBSTITUTE-IF-NOT NEWITEM TEST SEQUENCE START END))))
(CL:DEFUN CL:MAP-INTO (CL::RESULT-SEQUENCE CL:FUNCTION &REST CL::SEQUENCES) (* ;; "This is going to need work analogous to MAP; tomorrow...") (CL:IF (CDR CL::SEQUENCES) (CL::MAP-INTO-MULTIPLE CL::RESULT-SEQUENCE CL:FUNCTION CL::SEQUENCES) (CL::MAP-INTO-SINGLE CL::RESULT-SEQUENCE CL:FUNCTION (CAR CL::SEQUENCES))))
(CL:DEFUN CL::MAP-INTO-SINGLE (CL::RESULT-SEQUENCE CL:FUNCTION SEQUENCE) (* ;; "Code borrowed from %%MAP-FOR-RESULT-SINGLE; needed changes to handle possible fill-pointer adjustment of RESULT-SEQUENCE") (LET (LENGTH) (SEQ-DISPATCH CL::RESULT-SEQUENCE (PROGN (CL:SETQ LENGTH (MIN (CL:LENGTH CL::RESULT-SEQUENCE) (CL:LENGTH SEQUENCE))) (SEQ-DISPATCH SEQUENCE (CL:DO ((SUBSEQ SEQUENCE (CDR SUBSEQ)) (SUBRESULT CL::RESULT-SEQUENCE (CDR SUBRESULT))) ((OR (NULL SUBSEQ) (NULL SUBRESULT))) (RPLACA SUBRESULT (CL:FUNCALL CL:FUNCTION (CAR SUBSEQ)))) (CL:DO ((INDEX 0 (CL:1+ INDEX)) (SUBRESULT CL::RESULT-SEQUENCE (CDR SUBRESULT))) ((EQL INDEX LENGTH)) (RPLACA SUBRESULT (CL:FUNCALL CL:FUNCTION (CL:AREF SEQUENCE INDEX)))))) (PROGN (* ;; "The actual length we want to do is (min (length sequence) (array-total-size result-sequence)), because RESULT-SEQUENCE might have a fill-pointer; if it does, we'll adjust it here.") (CL:SETQ LENGTH (MIN (CL:ARRAY-TOTAL-SIZE CL::RESULT-SEQUENCE) (CL:LENGTH SEQUENCE))) (CL:WHEN (CL:ARRAY-HAS-FILL-POINTER-P CL::RESULT-SEQUENCE) (CL:SETF (CL:FILL-POINTER CL::RESULT-SEQUENCE) LENGTH)) (SEQ-DISPATCH SEQUENCE (CL:DO ((SUBSEQ SEQUENCE (CDR SUBSEQ)) (INDEX 0 (CL:1+ INDEX))) ((OR (NULL SUBSEQ) (EQL INDEX LENGTH))) (CL:SETF (CL:AREF CL::RESULT-SEQUENCE INDEX) (CL:FUNCALL CL:FUNCTION (CAR SUBSEQ)))) (CL:DO ((INDEX 0 (CL:1+ INDEX))) ((EQL INDEX LENGTH)) (CL:SETF (CL:AREF CL::RESULT-SEQUENCE INDEX) (CL:FUNCALL CL:FUNCTION (CL:AREF SEQUENCE INDEX))))))) CL::RESULT-SEQUENCE))
(CL:DEFUN CL::MAP-INTO-MULTIPLE (CL::RESULT-SEQUENCE CL:FUNCTION CL::SEQUENCES) (* ;; "Code taken from %%MAP-FOR-RESULT-MULTIPLE and munged to handle case of fill-pointer in RESULT-SEQUENCE") (LET* ((MIN-LENGTH (%%MIN-SEQUENCE-LENGTH CL::SEQUENCES)) (ELT-SLICE (CL:MAKE-LIST (CL:LENGTH CL::SEQUENCES)))) (SEQ-DISPATCH CL::RESULT-SEQUENCE (PROGN (CL:SETQ MIN-LENGTH (MIN MIN-LENGTH (CL:LENGTH CL::RESULT-SEQUENCE))) (CL:DO ((SUBRESULT CL::RESULT-SEQUENCE (CDR SUBRESULT)) (INDEX 0 (CL:1+ INDEX))) ((EQL INDEX MIN-LENGTH) CL::RESULT-SEQUENCE) (RPLACA SUBRESULT (CL:APPLY CL:FUNCTION (%%FILL-SLICE INDEX ELT-SLICE CL::SEQUENCES))))) (PROGN (CL:SETQ MIN-LENGTH (MIN MIN-LENGTH (CL:ARRAY-TOTAL-SIZE CL::RESULT-SEQUENCE))) (CL:IF (CL:ARRAY-HAS-FILL-POINTER-P CL::RESULT-SEQUENCE) (CL:SETF (CL:FILL-POINTER CL::RESULT-SEQUENCE) MIN-LENGTH)) (CL:DO ((INDEX 0 (CL:1+ INDEX))) ((EQL INDEX MIN-LENGTH) CL::RESULT-SEQUENCE) (CL:SETF (CL:AREF CL::RESULT-SEQUENCE INDEX) (CL:APPLY CL:FUNCTION (%%FILL-SLICE INDEX ELT-SLICE CL::SEQUENCES))))))))
(PUTPROPS CMLSEQMODIFY FILETYPE CL:COMPILE-FILE)
(DECLARE%: DONTCOPY DONTEVAL@LOAD DOEVAL@COMPILE
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
)
(PUTPROPS CMLSEQMODIFY COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991))
(DECLARE%: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLSEQMODIFY.LCOM Normal file

Binary file not shown.

227
CLTL2/CMLSETF Normal file
View File

@@ -0,0 +1,227 @@
(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "LISP")
(IL:FILECREATED "14-Feb-92 13:26:45" IL:|{DSK}<usr>local>lde>lispcore>sources>CMLSETF.;4| 35330
IL:|changes| IL:|to:| (IL:VARS IL:CMLSETFCOMS) (IL:FUNCTIONS ROTATEF CL::ROTATEF-INTERNAL CL::MV-LET* SETF GET-SETF-METHOD-MULTIPLE-VALUE PSETF SHIFTF CL::SHIFTF-INTERNAL)
IL:|previous| IL:|date:| " 4-Jan-92 15:22:54" IL:|{DSK}<usr>local>lde>lispcore>sources>CMLSETF.;2|
)
; Copyright (c) 1986, 1987, 1988, 1990, 1992 by Venue & Xerox Corporation. All rights reserved.
(IL:PRETTYCOMPRINT IL:CMLSETFCOMS)
(IL:RPAQQ IL:CMLSETFCOMS ((IL:FUNCTIONS GET-SETF-METHOD GET-SIMPLE-SETF-METHOD GET-SETF-METHOD-MULTIPLE-VALUE CL::DEFUN-SETF-METHOD) (IL:DEFINE-TYPES IL:SETFS) (IL:FUNCTIONS DEFSETF DEFINE-MODIFY-MACRO DEFINE-SETF-METHOD) (IL:COMS (IL:* IL:|;;| "Support for defstruct and friends ") (IL:FUNCTIONS DEFINE-SHARED-SETF-MACRO DEFINE-SHARED-SETF GET-SHARED-SETF-METHOD)) (IL:FUNCTIONS SETF SETF-ERROR) (IL:FUNCTIONS PSETF SHIFTF ROTATEF POP REMF) (IL:* IL:|;;| "A little suppost stuff to make writing the undoable versions easier") (IL:FUNCTIONS CL::SHIFTF-INTERNAL CL::ROTATEF-INTERNAL) (IL:* IL:|;;| "A little support macro to make ROTATEF prettier") (IL:FUNCTIONS CL::MV-LET*) (IL:FUNCTIONS INCF DECF) (IL:FUNCTIONS MAYBE-MAKE-BINDING-FORM COUNT-OCCURRENCES CL::SETF-NAME-P XCL::DEFUN-SETF-NAME XCL::SET-DEFUN-SETF) (IL:FUNCTIONS PUSH PUSHNEW) (IL:SETFS CAR CDR CAAAAR CAAADR CAAAR CAADAR CAADDR CAADR CAAR CADAAR CADADR CADAR CADDAR CADDDR CADDR CADR CDAAAR CDAADR CDAAR CDADAR CDADDR CDADR CDAR CDDAAR CDDADR CDDAR CDDDAR CDDDDR CDDDR CDDR FIRST SECOND THIRD FOURTH FIFTH SIXTH SEVENTH EIGHTH NINTH TENTH REST NTHCDR NTH GETF APPLY LDB MASK-FIELD CHAR-BIT THE CL:FDEFINITION) (IL:COMS (IL:* IL:\; "Some IL setfs, for no especially good reason") (IL:SETFS IL:GETHASH) (IL:FUNCTIONS IL:%SET-IL-GETHASH)) (IL:PROP IL:PROPTYPE :SETF-METHOD-EXPANDER :SETF-INVERSE :SHARED-SETF-INVERSE) (IL:PROP (IL:FILETYPE IL:MAKEFILE-ENVIRONMENT) IL:CMLSETF) (IL:DECLARE\: IL:DONTEVAL@LOAD IL:DOEVAL@COMPILE IL:DONTCOPY IL:COMPILERVARS (IL:ADDVARS (IL:NLAMA) (IL:NLAML) (IL:LAMA)))))
(DEFUN GET-SETF-METHOD (FORM &OPTIONAL ENVIRONMENT) (LET (TEMP) (COND ((SYMBOLP FORM) (IL:* IL:|;;| "Symbols have a simple, constant SETF method.") (VALUES NIL NIL (LIST (SETQ TEMP (IL:GENSYM))) (IL:BQUOTE (SETQ (IL:\\\, FORM) (IL:\\\, TEMP))) FORM)) ((NOT (CONSP FORM)) (IL:* IL:\; "Syntax error") (SETF-ERROR FORM)) ((SETQ TEMP (IL:LOCAL-MACRO-FUNCTION (CAR FORM) ENVIRONMENT)) (IL:* IL:|;;| "Lexical macros cannot have SETF methods defined upon them, so just expand this and try again.") (GET-SETF-METHOD (FUNCALL TEMP FORM ENVIRONMENT) ENVIRONMENT)) ((SETQ TEMP (OR (GET (CAR FORM) (QUOTE :SETF-INVERSE)) (GET (CAR FORM) (QUOTE IL:SETF-INVERSE)) (GET (CAR FORM) (QUOTE IL:SETFN)))) (GET-SIMPLE-SETF-METHOD FORM TEMP)) ((SETQ TEMP (GET (CAR FORM) (QUOTE :SHARED-SETF-INVERSE))) (GET-SHARED-SETF-METHOD FORM TEMP)) ((SETQ TEMP (OR (GET (CAR FORM) (QUOTE :SETF-METHOD-EXPANDER)) (GET (CAR FORM) (QUOTE IL:SETF-METHOD-EXPANDER)))) (IL:* IL:|;;| "Do check number of the Store Variables") (MULTIPLE-VALUE-BIND (TEMPS VALUES STORES SETTER GETTER) (FUNCALL TEMP FORM ENVIRONMENT) (WHEN (/= (LENGTH STORES) 1) (WARN "SETF method contains more than one store variable. Only top of the elements was accepted.") (SETQ STORES (LIST (CAR STORES)))) (VALUES TEMPS VALUES STORES SETTER GETTER))) (T (MULTIPLE-VALUE-BIND (EXPANSION DONE) (MACROEXPAND-1 FORM ENVIRONMENT) (IF (AND DONE (NOT (EQ EXPANSION FORM))) (GET-SETF-METHOD EXPANSION ENVIRONMENT) (CL::DEFUN-SETF-METHOD FORM ENVIRONMENT)))))))
(DEFUN GET-SIMPLE-SETF-METHOD (FORM SETF-INVERSE) (IL:* IL:|;;| "Produce SETF method for a form that has a setf-inverse. Five values to return are: temp vars, values to bind them to, store temp var, store form, access form; the latter two are expressions that can use any of them temp vars.") (LET ((NEW-VAR (IL:GENSYM)) VARS VALS ARGS SETF-INVERSE-FORM GET-FORM) (SETQ ARGS (MAPCAR (FUNCTION (LAMBDA (ARG) (COND ((IF (CONSP ARG) (EQ (CAR ARG) (QUOTE QUOTE)) (CONSTANTP ARG)) (IL:* IL:|;;| "We don't need gensym for this constant argument. The test is a little more conservative than CL:CONSTANTP because it's not obvious that it's ok to evaluate a \"constant expression\" multiple times and get the same EQ object every time.") ARG) (T (IL:* IL:|;;| "Anything else might be side-effected, so will need to bind") (PUSH ARG VALS) (LET ((G (IL:GENSYM))) (PUSH G VARS) G))))) (CDR FORM))) (SETQ SETF-INVERSE-FORM (MACROEXPAND-1 (IL:BQUOTE ((IL:\\\, SETF-INVERSE) (IL:\\\,@ ARGS) (IL:\\\, NEW-VAR))))) (SETQ GET-FORM (MACROEXPAND-1 (IL:BQUOTE ((IL:\\\, (CAR FORM)) (IL:\\\,@ ARGS))))) (IL:* IL:|;;| "ARGS is now the arguments to FORM with gensyms substituted for the non-constant expressions") (VALUES (SETQ VARS (NREVERSE VARS)) (SETQ VALS (NREVERSE VALS)) (LIST NEW-VAR) SETF-INVERSE-FORM GET-FORM)))
(DEFUN GET-SETF-METHOD-MULTIPLE-VALUE (FORM &OPTIONAL ENVIRONMENT) (IL:* IL:\; "Edited 6-Feb-92 15:31 by jrb:") (LET (TEMP) (COND ((SYMBOLP FORM) (IL:* IL:|;;| "Symbols have a simple, constant SETF method.") (VALUES NIL NIL (LIST (SETQ TEMP (IL:GENSYM))) (IL:BQUOTE (SETQ (IL:\\\, FORM) (IL:\\\, TEMP))) FORM)) ((NOT (CONSP FORM)) (IL:* IL:\; "Syntax error") (SETF-ERROR FORM)) ((SETQ TEMP (IL:LOCAL-MACRO-FUNCTION (CAR FORM) ENVIRONMENT)) (IL:* IL:|;;| "Lexical macros cannot have SETF methods defined upon them, so just expand this and try again.") (GET-SETF-METHOD (FUNCALL TEMP FORM ENVIRONMENT) ENVIRONMENT)) ((SETQ TEMP (OR (GET (CAR FORM) (QUOTE :SETF-INVERSE)) (GET (CAR FORM) (QUOTE IL:SETF-INVERSE)) (GET (CAR FORM) (QUOTE IL:SETFN)))) (GET-SIMPLE-SETF-METHOD FORM TEMP)) ((SETQ TEMP (GET (CAR FORM) (QUOTE :SHARED-SETF-INVERSE))) (GET-SHARED-SETF-METHOD FORM TEMP)) ((SETQ TEMP (OR (GET (CAR FORM) (QUOTE :SETF-METHOD-EXPANDER)) (GET (CAR FORM) (QUOTE IL:SETF-METHOD-EXPANDER)))) (IL:* IL:|;;| "Does not check the number of Store Variables.") (FUNCALL TEMP FORM ENVIRONMENT)) (T (MULTIPLE-VALUE-BIND (EXPANSION DONE) (MACROEXPAND-1 FORM ENVIRONMENT) (IF (AND DONE (NOT (EQ EXPANSION FORM))) (GET-SETF-METHOD EXPANSION ENVIRONMENT) (CL::DEFUN-SETF-METHOD FORM ENVIRONMENT)))))))
(DEFUN CL::DEFUN-SETF-METHOD (CL::FORM CL::ENVIRONMENT) (IL:* IL:|;;| "This doesn't need to do anything special with the ENVIRONMENT; all special search necessary is done by #'(SETF ,(CAR FORM))") (LET* ((CL::NEWVAL (GENSYM)) (CL::LET-LIST (MAPCAR (FUNCTION (LAMBDA (CL::X) (LIST (GENSYM) CL::X))) (CDR CL::FORM))) (CL::TEMPS (MAPCAR (FUNCTION CAR) CL::LET-LIST))) (VALUES CL::TEMPS (CDR CL::FORM) (LIST CL::NEWVAL) (IL:BQUOTE (FUNCALL (FUNCTION (SETF (IL:\\\, (CAR CL::FORM)))) (IL:\\\, CL::NEWVAL) (IL:\\\,@ CL::TEMPS))) (CONS (CAR CL::FORM) CL::TEMPS))))
(XCL:DEF-DEFINE-TYPE IL:SETFS "Common Lisp SETF definitions")
(XCL:DEFDEFINER (DEFSETF (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFSETF (IL:\\\, NAME) "Inverse function")))))) IL:SETFS (NAME &REST REST &ENVIRONMENT ENV) (IL:* IL:|;;;| "Associates a SETF update function or macro with the specified access function or macro") (COND ((NULL REST) (ERROR "No body for DEFSETF of ~A" NAME)) ((AND (LISTP (CAR REST)) (CDR REST) (LISTP (CADR REST))) (IL:* IL:|;;| "The complex form:") (IL:* IL:|;;| "(defsetf access-fn args (store-var) {decl | doc}* {form}*)") (XCL:DESTRUCTURING-BIND (ARG-LIST (STORE-VAR &REST OTHERS) &BODY BODY) REST (IF OTHERS (CERROR "Ignore the extra items in the list." "Currently only one new-value variable is allowed in DEFSETF.")) (LET ((WHOLE-VAR (XCL:PACK (LIST NAME "-setf-form") (SYMBOL-PACKAGE NAME))) (ENVIRONMENT (XCL:PACK (LIST NAME "-setf-env") (SYMBOL-PACKAGE NAME))) (EXPANDER (XCL:PACK (LIST NAME "-setf-expander") (SYMBOL-PACKAGE NAME)))) (MULTIPLE-VALUE-BIND (CODE DECLS DOC) (IL:PARSE-DEFMACRO ARG-LIST WHOLE-VAR BODY NAME ENV :ENVIRONMENT ENVIRONMENT) (IL:BQUOTE (PROGN (EVAL-WHEN (EVAL COMPILE LOAD) (SETF (SYMBOL-FUNCTION (QUOTE (IL:\\\, EXPANDER))) (FUNCTION (LAMBDA (ACCESS-FORM (IL:\\\, ENVIRONMENT)) (LET* ((DUMMIES (MAPCAR (FUNCTION (LAMBDA (X) (IL:GENSYM))) (CDR ACCESS-FORM))) ((IL:\\\, WHOLE-VAR) (CONS (CAR ACCESS-FORM) DUMMIES)) ((IL:\\\, STORE-VAR) (IL:GENSYM))) (VALUES DUMMIES (CDR ACCESS-FORM) (LIST (IL:\\\, STORE-VAR)) (BLOCK (IL:\\\, NAME) (IL:\\\, CODE)) (IL:\\\, WHOLE-VAR)))))) (SET-SETF-METHOD-EXPANDER (QUOTE (IL:\\\, NAME)) (QUOTE (IL:\\\, EXPANDER)))) (IL:\\\,@ (AND DOC (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE SETF)) (IL:\\\, DOC)))))))))))) ((SYMBOLP (CAR REST)) (IL:* IL:|;;| "The short form:") (IL:* IL:|;;| "(defsetf access-fn update-fn [doc])") (LET ((UPDATE-FN (CAR REST)) (DOC (CADR REST))) (IL:BQUOTE (PROGN (EVAL-WHEN (LOAD COMPILE EVAL) (SET-SETF-INVERSE (QUOTE (IL:\\\, NAME)) (QUOTE (IL:\\\, UPDATE-FN)))) (IL:\\\,@ (AND DOC (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE SETF)) (IL:\\\, DOC)))))))))) (T (ERROR "Ill-formed DEFSETF for ~S." NAME))))
(XCL:DEFDEFINER (DEFINE-MODIFY-MACRO (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFINE-MODIFY-MACRO (IL:\\\, NAME) (IL:\\\,@ (XCL::%MAKE-FUNCTION-PROTOTYPE)))))))) IL:FUNCTIONS (NAME LAMBDA-LIST FUNCTION &OPTIONAL DOC-STRING) "Creates a new read-modify-write macro like PUSH or INCF." (LET ((OTHER-ARGS NIL) (REST-ARG NIL)) (DO ((LL LAMBDA-LIST (CDR LL)) (ARG NIL)) ((NULL LL)) (SETQ ARG (CAR LL)) (COND ((EQ ARG (QUOTE &OPTIONAL))) ((EQ ARG (QUOTE &REST)) (SETQ REST-ARG (CADR LL)) (RETURN NIL)) ((SYMBOLP ARG) (PUSH ARG OTHER-ARGS)) (T (PUSH (CAR ARG) OTHER-ARGS)))) (SETQ OTHER-ARGS (NREVERSE OTHER-ARGS)) (IL:BQUOTE (DEFMACRO (IL:\\\, NAME) (SI::%$$MODIFY-MACRO-FORM (IL:\\\,@ LAMBDA-LIST) &ENVIRONMENT SI::%$$MODIFY-MACRO-ENVIRONMENT) (IL:\\\, DOC-STRING) (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVALS SETTER GETTER) (GET-SETF-METHOD SI::%$$MODIFY-MACRO-FORM SI::%$$MODIFY-MACRO-ENVIRONMENT) (IL:BQUOTE ((IL:\\\, (QUOTE LET*)) ((IL:\\\,@ (MAPCAR (FUNCTION LIST) DUMMIES VALS)) ((IL:\\\, (CAR NEWVALS)) (IL:\\\, (IL:\\\, (IF REST-ARG (IL:BQUOTE (LIST* (QUOTE (IL:\\\, FUNCTION)) GETTER (IL:\\\,@ OTHER-ARGS) (IL:\\\, REST-ARG))) (IL:BQUOTE (LIST (QUOTE (IL:\\\, FUNCTION)) GETTER (IL:\\\,@ OTHER-ARGS)))))))) (IL:\\\, SETTER))))))))
(XCL:DEFDEFINER (DEFINE-SETF-METHOD (:PROTOTYPE (LAMBDA (NAME) (AND (SYMBOLP NAME) (IL:BQUOTE (DEFINE-SETF-METHOD (IL:\\\, NAME) ("Arg list") "Body")))))) IL:SETFS (NAME LAMBDA-LIST &ENVIRONMENT ENV &BODY BODY) (LET ((WHOLE (XCL:PACK (LIST "whole-" NAME) (SYMBOL-PACKAGE NAME))) (ENVIRONMENT (XCL:PACK (LIST "env-" NAME) (SYMBOL-PACKAGE NAME))) (EXPANDER (XCL:PACK (LIST "setf-expander-" NAME) (SYMBOL-PACKAGE NAME)))) (MULTIPLE-VALUE-BIND (NEWBODY LOCAL-DECS DOC) (IL:PARSE-DEFMACRO LAMBDA-LIST WHOLE BODY NAME ENV :ENVIRONMENT ENVIRONMENT :ERROR-STRING "Setf expander for ~S cannot be called with ~S args.") (IL:BQUOTE (EVAL-WHEN (EVAL COMPILE LOAD) (DEFUN (IL:\\\, EXPANDER) ((IL:\\\, WHOLE) (IL:\\\, ENVIRONMENT)) (IL:\\\,@ LOCAL-DECS) (BLOCK (IL:\\\, NAME) (IL:\\\, NEWBODY))) (SET-SETF-METHOD-EXPANDER (QUOTE (IL:\\\, NAME)) (QUOTE (IL:\\\, EXPANDER))) (IL:\\\,@ (AND DOC (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE SETF)) (IL:\\\, DOC)))))))))))
(IL:* IL:|;;| "Support for defstruct and friends ")
(XCL:DEFDEFINER DEFINE-SHARED-SETF-MACRO IL:FUNCTIONS (NAME ACCESSOR ARG-LIST STORE-VAR &BODY BODY &ENVIRONMENT ENV) (IL:* IL:|;;;| "Defines a shared SETF update function for a family of accessores -- used by defstruct") (IF (NOT (AND (CONSP STORE-VAR) (EQ 1 (LENGTH STORE-VAR)))) (ERROR "Store-var should be a list of one element: ~s" STORE-VAR)) (MULTIPLE-VALUE-BIND (CODE DECLS DOC) (XCL:PARSE-BODY BODY ENV T) (IL:BQUOTE (DEFMACRO (IL:\\\, NAME) ((IL:\\\, ACCESSOR) (IL:\\\,@ ARG-LIST) (IL:\\\,@ STORE-VAR)) (IL:\\\,@ DOC) (IL:\\\,@ DECLS) (IL:\\\,@ CODE)))))
(XCL:DEFDEFINER DEFINE-SHARED-SETF IL:SETFS (NAME SHARED-EXPANDER &OPTIONAL DOC) (IL:* IL:|;;;| "Associates a shared SETF update macro with the specified accessor function -- used by defstruct") (IL:BQUOTE (PROGN (EVAL-WHEN (LOAD COMPILE EVAL) (SET-SHARED-SETF-INVERSE (QUOTE (IL:\\\, NAME)) (QUOTE (IL:\\\, SHARED-EXPANDER)))) (IL:\\\,@ (AND DOC (IL:BQUOTE ((SETF (DOCUMENTATION (QUOTE (IL:\\\, NAME)) (QUOTE SETF)) (IL:\\\, DOC)))))))))
(DEFUN GET-SHARED-SETF-METHOD (FORM SHARED-SETF-INVERSE) (IL:* IL:|;;| "Produce SETF method for a form that has a shared-setf-inverse. Five values to return are: temp vars, values to bind them to, store temp var, store form, access form; the latter two are expressions that can use any of them temp vars.") (LET ((NEW-VAR (IL:GENSYM)) VARS VALS ARGS SHARED-SETF-INVERSE-FORM GET-FORM) (SETQ ARGS (MAPCAR (FUNCTION (LAMBDA (ARG) (COND ((IF (CONSP ARG) (EQ (CAR ARG) (QUOTE QUOTE)) (CONSTANTP ARG)) (IL:* IL:|;;| "We don't need gensym for this constant argument. The test is a little more conservative than CL:CONSTANTP because it's not obvious that it's ok to evaluate a \"constant expression\" multiple times and get the same EQ object every time.") ARG) (T (IL:* IL:|;;| "Anything else might be side-effected, so will need to bind") (PUSH ARG VALS) (LET ((G (IL:GENSYM))) (PUSH G VARS) G))))) (CDR FORM))) (SETQ SHARED-SETF-INVERSE-FORM (MACROEXPAND-1 (IL:BQUOTE ((IL:\\\, SHARED-SETF-INVERSE) (IL:\\\, (CAR FORM)) (IL:\\\,@ ARGS) (IL:\\\, NEW-VAR))))) (SETQ GET-FORM (MACROEXPAND-1 (IL:BQUOTE ((IL:\\\, (CAR FORM)) (IL:\\\,@ ARGS))))) (IL:* IL:|;;| "ARGS is now the arguments to FORM with gensyms substituted for the non-constant expressions") (VALUES (SETQ VARS (NREVERSE VARS)) (SETQ VALS (NREVERSE VALS)) (LIST NEW-VAR) SHARED-SETF-INVERSE-FORM GET-FORM)))
(DEFMACRO SETF (PLACE NEW-VALUE &REST OTHERS &ENVIRONMENT ENV) (IL:* IL:|;;;| "Takes pairs of arguments like SETQ. The first is a place and the second is the value that is supposed to go into that place. Returns the last value. The place argument may be any of the access forms for which SETF knows a corresponding setting form.") (IL:* IL:|;;;| "We short-circuit the normal SETF-method mechanism for two very common special cases, so as to produce much simpler and more efficient code. The two cases are symbols and forms with simple inverses.") (COND (OTHERS (IL:BQUOTE (PROGN (SETF (IL:\\\, PLACE) (IL:\\\, NEW-VALUE)) (SETF (IL:\\\,@ OTHERS))))) (T (PROG (TEMP) LP (COND ((SYMBOLP PLACE) (RETURN (IL:BQUOTE (SETQ (IL:\\\, PLACE) (IL:\\\, NEW-VALUE))))) ((OR (NOT (CONSP PLACE)) (NOT (SYMBOLP (CAR PLACE)))) (SETF-ERROR PLACE)) ((SETQ TEMP (IL:LOCAL-MACRO-FUNCTION (CAR PLACE) ENV)) (IL:* IL:|;;| "Before looking for an inverse, we have to macroexpand until it isn't a reference to a lexical macro, since those can't have SETF methods.") (SETQ PLACE (FUNCALL TEMP PLACE ENV))) ((SETQ TEMP (OR (GET (CAR PLACE) (QUOTE :SETF-INVERSE)) (GET (CAR PLACE) (QUOTE IL:SETF-INVERSE)) (GET (CAR PLACE) (QUOTE IL:SETFN)))) (RETURN (IL:BQUOTE ((IL:\\\, TEMP) (IL:\\\,@ (CDR PLACE)) (IL:\\\, NEW-VALUE))))) ((SETQ TEMP (GET (CAR PLACE) (QUOTE :SHARED-SETF-INVERSE))) (RETURN (IL:BQUOTE ((IL:\\\, TEMP) (IL:\\\, (CAR PLACE)) (IL:\\\,@ (CDR PLACE)) (IL:\\\, NEW-VALUE))))) ((OR (GET (CAR PLACE) (QUOTE :SETF-METHOD-EXPANDER)) (GET (CAR PLACE) (QUOTE IL:SETF-METHOD-EXPANDER))) (IL:* IL:|;;| "General setf hair") (RETURN (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVALS SETTER GETTER) (GET-SETF-METHOD-MULTIPLE-VALUE PLACE ENV) (IF (NULL (CDR NEWVALS)) (IL:BQUOTE ((IL:\\\, (QUOTE LET*)) ((IL:\\\,@ (MAPCAR (FUNCTION LIST) DUMMIES VALS)) ((IL:\\\, (CAR NEWVALS)) (IL:\\\, NEW-VALUE))) (IL:\\\, SETTER))) (IL:* IL:|;;| "It's one of those multiple-value jobbers...") (IL:BQUOTE (LET* ((IL:\\\,@ (MAPCAR (FUNCTION LIST) DUMMIES VALS))) (MULTIPLE-VALUE-BIND (IL:\\\, NEWVALS) (IL:\\\, NEW-VALUE) (IL:\\\, SETTER)))))))) ((MULTIPLE-VALUE-BIND (EXPANSION DONE) (MACROEXPAND-1 PLACE ENV) (IL:* IL:|;;| "Try macro expanding") (WHEN (AND DONE (NOT (EQ EXPANSION PLACE))) (SETQ PLACE EXPANSION)))) (T (IL:* IL:|;;| "Nothing worked; we have to assume there's a (defun (setf mumble)...) out there somewhere") (RETURN (LET ((NEW-VALUE-TEMP (GENSYM)) (LET-LIST (MAPCAR (FUNCTION (LAMBDA (X) (LIST (GENSYM) X))) (CDR PLACE)))) (IL:BQUOTE (LET ((IL:\\\,@ LET-LIST) ((IL:\\\, NEW-VALUE-TEMP) (IL:\\\, NEW-VALUE))) (FUNCALL (FUNCTION (SETF (IL:\\\, (CAR PLACE)))) (IL:\\\, NEW-VALUE-TEMP) (IL:\\\,@ (MAPCAR (FUNCTION CAR) LET-LIST))))))))) (GO LP)))))
(DEFUN SETF-ERROR (FN &OPTIONAL FORM) (IL:* IL:|;;| "Common error routine for invalid SETF's. FN is the thing we tried to find a setf method for, FORM is its parent (not supplied when the form is a non-list).") (ERROR "~S is not a known location specifier for SETF." FN))
(DEFMACRO PSETF (&REST ARGS &ENVIRONMENT ENV) (IL:* IL:|;;| "This is to SETF as PSETQ is to SETQ. Args are alternating place expressions and values to go into those places. All of the subforms and values are determined, left to right, and only then are the locations updated. Returns NIL.\"") (DO ((A ARGS (CDDR A)) (LET-LIST NIL) (MV-SET-LIST NIL) (SETF-LIST NIL)) ((ATOM A) (IL:BQUOTE ((IL:\\\, (QUOTE LET)) (IL:\\\, (REVERSE LET-LIST)) (IL:\\\,@ (REVERSE MV-SET-LIST)) (IL:\\\,@ (REVERSE SETF-LIST)) NIL))) (IF (ATOM (CDR A)) (ERROR "Odd number of args to PSETF.")) (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD-MULTIPLE-VALUE (CAR A) ENV) (DECLARE (IGNORE GETTER)) (DO* ((D DUMMIES (CDR D)) (V VALS (CDR V))) ((NULL D)) (PUSH (LIST (CAR D) (CAR V)) LET-LIST)) (IF (CDR NEWVAL) (PROGN (SETQ LET-LIST (APPEND NEWVAL LET-LIST)) (PUSH (IL:BQUOTE (MULTIPLE-VALUE-SETQ (IL:\\\, NEWVAL) (IL:\\\, (CADR A)))) MV-SET-LIST)) (PUSH (LIST (CAR NEWVAL) (CADR A)) LET-LIST)) (PUSH SETTER SETF-LIST))))
(DEFMACRO SHIFTF (&REST ARGS &ENVIRONMENT ENV) (IL:* IL:|;;| "Assigns to each place the value of the form to its right, returns old value of 1st") (IL:* IL:|;;| "CLtL2 is ambiguous on whether multiple-values from the first form should be returned or not. Consistencty votes yes, expediency votes no; I choose consistency (screw the New Jersey design philosophy!).") (COND ((OR (NULL ARGS) (NULL (CDR ARGS))) (ERROR "SHIFTF needs at least two arguments")) (T (CL::SHIFTF-INTERNAL ARGS ENV (QUOTE GET-SETF-METHOD-MULTIPLE-VALUE)))))
(DEFMACRO ROTATEF (&REST ARGS &ENVIRONMENT ENV) (IL:* IL:|;;| "Assigns to each place the value of the form to its right; last gets first. Returns NIL.") (IL:* IL:|;;| "forms evaluated in order") (COND ((NULL ARGS) NIL) ((NULL (CDR ARGS)) (IL:BQUOTE (PROGN (IL:\\\, (CAR ARGS)) NIL))) (T (CL::ROTATEF-INTERNAL ARGS ENV (QUOTE GET-SETF-METHOD-MULTIPLE-VALUE)))))
(DEFMACRO POP (PLACE &ENVIRONMENT ENV) "Pops one item off the front of PLACE and returns it." (IF (SYMBOLP PLACE) (IL:BQUOTE (PROG1 (CAR (IL:\\\, PLACE)) (SETQ (IL:\\\, PLACE) (CDR (IL:\\\, PLACE))))) (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD PLACE ENV) (IL:BQUOTE ((IL:\\\, (QUOTE LET*)) ((IL:\\\,@ (MAPCAR (FUNCTION LIST) DUMMIES VALS)) (IL:\\\, (LIST (CAR NEWVAL) GETTER))) (PROG1 (CAR (IL:\\\, (CAR NEWVAL))) (SETQ (IL:\\\, (CAR NEWVAL)) (CDR (IL:\\\, (CAR NEWVAL)))) (IL:\\\, SETTER)))))))
(DEFMACRO REMF (PLACE INDICATOR &ENVIRONMENT ENV) "Destructively remove INDICATOR from PLACE, returning T if it was present, NIL if not" (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD PLACE ENV) (LET ((IND-TEMP (IL:GENSYM)) (LOCAL1 (IL:GENSYM)) (LOCAL2 (IL:GENSYM))) (IL:BQUOTE ((IL:\\\, (QUOTE LET*)) ((IL:\\\,@ (MAPCAR (FUNCTION LIST) DUMMIES VALS)) ((IL:\\\, (CAR NEWVAL)) (IL:\\\, GETTER)) ((IL:\\\, IND-TEMP) (IL:\\\, INDICATOR))) (DO (((IL:\\\, LOCAL1) (IL:\\\, (CAR NEWVAL)) (CDDR (IL:\\\, LOCAL1))) ((IL:\\\, LOCAL2) NIL (IL:\\\, LOCAL1))) ((ATOM (IL:\\\, LOCAL1)) NIL) (COND ((ATOM (CDR (IL:\\\, LOCAL1))) (ERROR "Odd-length property list in REMF.")) ((EQ (CAR (IL:\\\, LOCAL1)) (IL:\\\, IND-TEMP)) (COND ((IL:\\\, LOCAL2) (RPLACD (CDR (IL:\\\, LOCAL2)) (CDDR (IL:\\\, LOCAL1))) (RETURN T)) (T (SETQ (IL:\\\, (CAR NEWVAL)) (CDDR (IL:\\\, (CAR NEWVAL)))) (IL:\\\, SETTER) (RETURN T)))))))))))
(IL:* IL:|;;| "A little suppost stuff to make writing the undoable versions easier")
(DEFUN CL::SHIFTF-INTERNAL (CL::ARGS CL::ENV CL::SETF-METHOD-GETTER) (IL:* IL:\; "Edited 11-Feb-92 15:45 by jrb:") (LET (CL::LET-LIST CL::MV-SET-LIST CL::SETF-LIST CL::GETTER) (FLET ((CL::BIND-LETS (CL::DUMMIES CL::VALS) (DO ((CL::D CL::DUMMIES (CDR CL::D)) (CL::V CL::VALS (CDR CL::V))) ((NULL CL::D)) (PUSH (LIST (CAR CL::D) (CAR CL::V)) CL::LET-LIST))) (CL::HANDLE-GETTER (CL::NEXT-VAR CL::GETTER) (SETQ CL::LET-LIST (APPEND CL::NEXT-VAR CL::LET-LIST)) (PUSH (IF (CDR CL::NEXT-VAR) (IL:BQUOTE (MULTIPLE-VALUE-SETQ (IL:\\\, CL::NEXT-VAR) (IL:\\\, CL::GETTER))) (IL:BQUOTE (SETQ (IL:\\\, (CAR CL::NEXT-VAR)) (IL:\\\, CL::GETTER)))) CL::MV-SET-LIST))) (MULTIPLE-VALUE-BIND (CL::DUMMIES CL::VALS CL::FIRST-NEWVAL CL::SETTER CL::FIRST-GETTER) (FUNCALL CL::SETF-METHOD-GETTER (CAR CL::ARGS) CL::ENV) (CL::BIND-LETS CL::DUMMIES CL::VALS) (PUSH CL::SETTER CL::SETF-LIST) (DO* ((CL::A (CDR CL::ARGS) (CDR CL::A)) (CL::NEXT-VAR CL::FIRST-NEWVAL) (CL::DUMMIES) (CL::VALS) (CL::NEWVAL) (CL::SETTER)) ((ATOM (CDR CL::A)) (CL::HANDLE-GETTER CL::NEXT-VAR (CAR CL::A)) (IL:BQUOTE (LET* (IL:\\\, (REVERSE CL::LET-LIST)) (MULTIPLE-VALUE-PROG1 (IL:\\\, CL::FIRST-GETTER) (IL:\\\,@ (REVERSE CL::MV-SET-LIST)) (IL:\\\,@ (REVERSE CL::SETF-LIST)))))) (MULTIPLE-VALUE-SETQ (CL::DUMMIES CL::VALS CL::NEWVAL CL::SETTER CL::GETTER) (FUNCALL CL::SETF-METHOD-GETTER (CAR CL::A) CL::ENV)) (CL::BIND-LETS CL::DUMMIES CL::VALS) (CL::HANDLE-GETTER CL::NEXT-VAR CL::GETTER) (PUSH CL::SETTER CL::SETF-LIST) (SETQ CL::NEXT-VAR CL::NEWVAL))))))
(DEFUN CL::ROTATEF-INTERNAL (CL::ARGS CL::ENV CL::SETF-METHOD-GETTER) (IL:* IL:\; "Edited 12-Feb-92 13:10 by jrb:") (DO ((CL::A CL::ARGS (CDR CL::A)) (CL::LET-LIST NIL) (CL::SETF-LIST NIL) (CL::NEXT-VAR NIL) (CL::FIX-ME NIL)) ((ATOM CL::A) (SETF (FIRST CL::FIX-ME) (IF (CDR CL::NEXT-VAR) CL::NEXT-VAR (CAR CL::NEXT-VAR))) (IL:BQUOTE (CL::MV-LET* (IL:\\\, (REVERSE CL::LET-LIST)) (IL:\\\,@ (REVERSE CL::SETF-LIST)) NIL))) (MULTIPLE-VALUE-BIND (CL::DUMMIES CL::VALS CL::NEWVAL CL::SETTER CL::GETTER) (FUNCALL CL::SETF-METHOD-GETTER (CAR CL::A) CL::ENV) (DO ((CL::D CL::DUMMIES (CDR CL::D)) (CL::V CL::VALS (CDR CL::V))) ((NULL CL::D)) (PUSH (LIST (CAR CL::D) (CAR CL::V)) CL::LET-LIST)) (PUSH (LIST (IF (CDR CL::NEXT-VAR) CL::NEXT-VAR (CAR CL::NEXT-VAR)) CL::GETTER) CL::LET-LIST) (UNLESS CL::FIX-ME (SETQ CL::FIX-ME (CAR CL::LET-LIST))) (PUSH CL::SETTER CL::SETF-LIST) (SETQ CL::NEXT-VAR CL::NEWVAL))))
(IL:* IL:|;;| "A little support macro to make ROTATEF prettier")
(DEFMACRO CL::MV-LET* (CL::BINDING-LIST &REST CL::FORMS) (IF (NULL CL::BINDING-LIST) (IL:BQUOTE (LAMBDA NIL (IL:\\\,@ CL::FORMS))) (LABELS ((CL::MUNCH-CLAUSE (CL::BINDING-LIST) (LET ((CL::CLAUSE (POP CL::BINDING-LIST))) (IF (CONSP (CAR CL::CLAUSE)) (IL:BQUOTE (MULTIPLE-VALUE-BIND (IL:\\\, (CAR CL::CLAUSE)) (IL:\\\, (CADR CL::CLAUSE)) (IL:\\\,@ (IF CL::BINDING-LIST (LIST (CL::MUNCH-CLAUSE CL::BINDING-LIST)) CL::FORMS)))) (IL:BQUOTE ((LAMBDA ((IL:\\\, (CAR CL::CLAUSE))) (IL:\\\,@ (IF CL::BINDING-LIST (LIST (CL::MUNCH-CLAUSE CL::BINDING-LIST)) CL::FORMS))) (IL:\\\, (CADR CL::CLAUSE)))))))) (CL::MUNCH-CLAUSE CL::BINDING-LIST))))
(DEFINE-MODIFY-MACRO INCF (&OPTIONAL (DELTA 1)) + "The first argument is some location holding a number. This number is
incremented by the second argument, DELTA, which defaults to 1.")
(DEFINE-MODIFY-MACRO DECF (&OPTIONAL (DELTA 1)) - "The first argument is some location holding a number. This number is
decremented by the second argument, DELTA, which defaults to 1.")
(DEFUN MAYBE-MAKE-BINDING-FORM (NEWVAL-FORM DUMMIES VALS NEWVAR SETTER GETTER) (IL:* IL:|;;| "For use in SETF-like forms to produce their final expression without using the NEWVAR gensym where possible. DUMMIES thru GETTER are the five values returned from the SETF method. NEWVAL-FORM is an expression to which the (sole) NEWVAR is logically to be bound, written in terms of the GETTER form. If it looks like there are no side-effect problems, we substitute NEWVAL-FORM into SETTER; otherwise we return a binding form that returns SETTER correctly.") (IF (OR DUMMIES (> (COUNT-OCCURRENCES (CAR NEWVAR) SETTER) 1)) (IL:* IL:\; " have to do messy binding form") (IL:BQUOTE ((IL:\\\, (QUOTE LET*)) ((IL:\\\,@ (MAPCAR (FUNCTION LIST) DUMMIES VALS)) ((IL:\\\, (CAR NEWVAR)) (IL:\\\, NEWVAL-FORM))) (IL:\\\, SETTER))) (IL:* IL:\; "No temp vars, setter used only once, so nothing can be side-effected, so store it directly") (SUBST NEWVAL-FORM (CAR NEWVAR) SETTER)))
(DEFUN COUNT-OCCURRENCES (SYMBOL FORM) (COND ((CONSP FORM) (+ (COUNT-OCCURRENCES SYMBOL (CAR FORM)) (COUNT-OCCURRENCES SYMBOL (CDR FORM)))) ((EQ SYMBOL FORM) 1) (T 0)))
(DEFMACRO CL::SETF-NAME-P (CL::THING) (IL:BQUOTE (AND (CONSP (IL:\\\, CL::THING)) (EQ (CAR (IL:\\\, CL::THING)) (QUOTE SETF)) (CONSP (CDR (IL:\\\, CL::THING))) (SYMBOLP (CADR (IL:\\\, CL::THING))))))
(DEFUN XCL::DEFUN-SETF-NAME (XCL::REAL-NAME) (XCL:PACK (LIST XCL::REAL-NAME "-defun-setf") (SYMBOL-PACKAGE XCL::REAL-NAME)))
(DEFUN XCL::SET-DEFUN-SETF (XCL::NAME XCL::DEFUN-SETF-FN) (REMPROP XCL::NAME (QUOTE IL:SETF-METHOD-EXPANDER)) (REMPROP XCL::NAME :SETF-METHOD-EXPANDER) (REMPROP XCL::NAME :SETF-INVERSE) (SETF (GET XCL::NAME :SETF-DEFUN) XCL::DEFUN-SETF-FN))
(DEFMACRO PUSH (OBJ PLACE &ENVIRONMENT ENV) "Conses OBJ onto PLACE, returning the modified list." (IF (SYMBOLP PLACE) (IL:BQUOTE (SETQ (IL:\\\, PLACE) (CONS (IL:\\\, OBJ) (IL:\\\, PLACE)))) (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD PLACE ENV) (MAYBE-MAKE-BINDING-FORM (IL:BQUOTE (CONS (IL:\\\, OBJ) (IL:\\\, GETTER))) DUMMIES VALS NEWVAL SETTER GETTER))))
(DEFMACRO PUSHNEW (OBJ PLACE &REST KEYS &ENVIRONMENT ENV) "Conses OBJ onto PLACE unless its already there, using :TEST if necessary" (IF (SYMBOLP PLACE) (IL:BQUOTE (SETQ (IL:\\\, PLACE) (ADJOIN (IL:\\\, OBJ) (IL:\\\, PLACE) (IL:\\\,@ KEYS)))) (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD PLACE ENV) (MAYBE-MAKE-BINDING-FORM (IL:BQUOTE (ADJOIN (IL:\\\, OBJ) (IL:\\\, GETTER) (IL:\\\,@ KEYS))) DUMMIES VALS NEWVAL SETTER GETTER))))
(DEFSETF CAR (X) (V) (IL:BQUOTE (CAR (RPLACA (IL:\\\, X) (IL:\\\, V)))))
(DEFSETF CDR (X) (V) (IL:BQUOTE (CDR (RPLACD (IL:\\\, X) (IL:\\\, V)))))
(DEFSETF CAAAAR (X) (V) (IL:BQUOTE (CAR (RPLACA (CAAAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CAAADR (X) (V) (IL:BQUOTE (CAR (RPLACA (CAADR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CAAAR (X) (V) (IL:BQUOTE (CAR (RPLACA (CAAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CAADAR (X) (V) (IL:BQUOTE (CAR (RPLACA (CADAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CAADDR (X) (V) (IL:BQUOTE (CAR (RPLACA (CADDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CAADR (X) (V) (IL:BQUOTE (CAR (RPLACA (CADR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CAAR (X) (V) (IL:BQUOTE (CAR (RPLACA (CAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CADAAR (X) (V) (IL:BQUOTE (CAR (RPLACA (CDAAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CADADR (X) (V) (IL:BQUOTE (CAR (RPLACA (CDADR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CADAR (X) (V) (IL:BQUOTE (CAR (RPLACA (CDAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CADDAR (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CADDDR (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CADDR (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CADR (X) (V) (IL:BQUOTE (CAR (RPLACA (CDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDAAAR (X) (V) (IL:BQUOTE (CDR (RPLACD (CAAAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDAADR (X) (V) (IL:BQUOTE (CDR (RPLACD (CAADR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDAAR (X) (V) (IL:BQUOTE (CDR (RPLACD (CAAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDADAR (X) (V) (IL:BQUOTE (CDR (RPLACD (CADAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDADDR (X) (V) (IL:BQUOTE (CDR (RPLACD (CADDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDADR (X) (V) (IL:BQUOTE (CDR (RPLACD (CADR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDAR (X) (V) (IL:BQUOTE (CDR (RPLACD (CAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDDAAR (X) (V) (IL:BQUOTE (CDR (RPLACD (CDAAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDDADR (X) (V) (IL:BQUOTE (CDR (RPLACD (CDADR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDDAR (X) (V) (IL:BQUOTE (CDR (RPLACD (CDAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDDDAR (X) (V) (IL:BQUOTE (CDR (RPLACD (CDDAR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDDDDR (X) (V) (IL:BQUOTE (CDR (RPLACD (CDDDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDDDR (X) (V) (IL:BQUOTE (CDR (RPLACD (CDDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF CDDR (X) (V) (IL:BQUOTE (CDR (RPLACD (CDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF FIRST (X) (V) (IL:BQUOTE (CAR (RPLACA (IL:\\\, X) (IL:\\\, V)))))
(DEFSETF SECOND (X) (V) (IL:BQUOTE (CAR (RPLACA (CDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF THIRD (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF FOURTH (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF FIFTH (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDDDR (IL:\\\, X)) (IL:\\\, V)))))
(DEFSETF SIXTH (X) (V) (IL:BQUOTE (CAR (RPLACA (CDR (CDDDDR (IL:\\\, X))) (IL:\\\, V)))))
(DEFSETF SEVENTH (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDR (CDDDDR (IL:\\\, X))) (IL:\\\, V)))))
(DEFSETF EIGHTH (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDDR (CDDDDR (IL:\\\, X))) (IL:\\\, V)))))
(DEFSETF NINTH (X) (V) (IL:BQUOTE (CAR (RPLACA (CDDDDR (CDDDDR (IL:\\\, X))) (IL:\\\, V)))))
(DEFSETF TENTH (X) (V) (IL:BQUOTE (CAR (RPLACA (CDR (CDDDDR (CDDDDR (IL:\\\, X)))) (IL:\\\, V)))))
(DEFSETF REST (X) (V) (IL:BQUOTE (CDR (RPLACD (IL:\\\, X) (IL:\\\, V)))))
(DEFSETF NTHCDR (N LIST) (NEWVAL) (IL:BQUOTE (CDR (RPLACD (NTHCDR (1- (IL:\\\, N)) (IL:\\\, LIST)) (IL:\\\, NEWVAL)))))
(DEFSETF NTH %SET-NTH)
(DEFINE-SETF-METHOD GETF (PLACE PROP &OPTIONAL DEFAULT &ENVIRONMENT ENV) (MULTIPLE-VALUE-BIND (TEMPS VALUES STORES SET GET) (GET-SETF-METHOD PLACE ENV) (LET ((NEWVAL (IL:GENSYM)) (PTEMP (IL:GENSYM)) (DEF-TEMP (IL:GENSYM))) (VALUES (IL:BQUOTE ((IL:\\\,@ TEMPS) (IL:\\\, (CAR STORES)) (IL:\\\, PTEMP) (IL:\\\,@ (IF DEFAULT (IL:BQUOTE ((IL:\\\, DEF-TEMP))))))) (IL:BQUOTE ((IL:\\\,@ VALUES) (IL:\\\, GET) (IL:\\\, PROP) (IL:\\\,@ (IF DEFAULT (IL:BQUOTE ((IL:\\\, DEFAULT))))))) (IL:BQUOTE ((IL:\\\, NEWVAL))) (IL:BQUOTE (COND ((NULL (IL:\\\, (CAR STORES))) (LET* (IL:\\\, (LIST (APPEND STORES (IL:BQUOTE ((LIST (IL:\\\, PTEMP) (IL:\\\, NEWVAL))))))) (IL:\\\, SET)) (IL:\\\, NEWVAL)) (T (IL:LISTPUT (IL:\\\, (CAR STORES)) (IL:\\\, PTEMP) (IL:\\\, NEWVAL))))) (IL:BQUOTE (GETF (IL:\\\, (CAR STORES)) (IL:\\\, PTEMP) (IL:\\\,@ (IF DEFAULT (IL:BQUOTE ((IL:\\\, DEF-TEMP)))))))))))
(DEFINE-SETF-METHOD APPLY (FN &REST ARGS &ENVIRONMENT ENV) (IF (AND (CONSP FN) (EQ (LENGTH FN) 2) (MEMBER (FIRST FN) (QUOTE (FUNCTION IL:FUNCTION QUOTE)) :TEST (FUNCTION EQ)) (SYMBOLP (SECOND FN))) (SETQ FN (SECOND FN)) (ERROR "Setf of Apply is only defined for function args of form #'symbol.")) (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD (CONS FN ARGS) ENV) (IL:* IL:|;;| "Make sure the place is one that we can handle.") (UNLESS (AND (EQ (CAR (LAST ARGS)) (CAR (LAST VALS))) (EQ (CAR (LAST GETTER)) (CAR (LAST DUMMIES))) (EQ (CAR (LAST SETTER)) (CAR (LAST DUMMIES)))) (ERROR "Apply of ~S not understood as a location for Setf." FN)) (VALUES DUMMIES VALS NEWVAL (IL:BQUOTE (APPLY (FUNCTION (IL:\\\, (CAR SETTER))) (IL:\\\,@ (CDR SETTER)))) (IL:BQUOTE (APPLY (FUNCTION (IL:\\\, (CAR GETTER))) (IL:\\\,@ (CDR GETTER)))))))
(DEFINE-SETF-METHOD LDB (BYTESPEC PLACE &ENVIRONMENT ENV) "The first argument is a byte specifier. The second is any place form
acceptable to SETF. Replaces the specified byte of the number in this
place with bits from the low-order end of the new value." (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD PLACE ENV) (LET ((BTEMP (IL:GENSYM)) (GNUVAL (IL:GENSYM))) (VALUES (CONS BTEMP DUMMIES) (CONS BYTESPEC VALS) (LIST GNUVAL) (IL:BQUOTE (LET (((IL:\\\, (CAR NEWVAL)) (DPB (IL:\\\, GNUVAL) (IL:\\\, BTEMP) (IL:\\\, GETTER)))) (IL:\\\, SETTER) (IL:\\\, GNUVAL))) (IL:BQUOTE (LDB (IL:\\\, BTEMP) (IL:\\\, GETTER)))))))
(DEFINE-SETF-METHOD MASK-FIELD (BYTESPEC PLACE &ENVIRONMENT ENV) "The first argument is a byte specifier. The second is any place form
acceptable to SETF. Replaces the specified byte of the number in this place
with bits from the corresponding position in the new value." (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD PLACE) (LET ((BTEMP (IL:GENSYM)) (GNUVAL (IL:GENSYM))) (VALUES (CONS BTEMP DUMMIES) (CONS BYTESPEC VALS) (LIST GNUVAL) (IL:BQUOTE (LET (((IL:\\\, (CAR NEWVAL)) (DEPOSIT-FIELD (IL:\\\, GNUVAL) (IL:\\\, BTEMP) (IL:\\\, GETTER)))) (IL:\\\, SETTER) (IL:\\\, GNUVAL))) (IL:BQUOTE (MASK-FIELD (IL:\\\, BTEMP) (IL:\\\, GETTER)))))))
(DEFINE-SETF-METHOD CHAR-BIT (PLACE BIT-NAME &ENVIRONMENT ENV) "The first argument is any place form acceptable to SETF. Replaces the
specified bit of the character in this place with the new value." (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD PLACE ENV) (LET ((BTEMP (IL:GENSYM)) (GNUVAL (IL:GENSYM))) (VALUES (IL:BQUOTE ((IL:\\\,@ DUMMIES) (IL:\\\, BTEMP))) (IL:BQUOTE ((IL:\\\,@ VALS) (IL:\\\, BIT-NAME))) (LIST GNUVAL) (IL:BQUOTE (LET (((IL:\\\, (CAR NEWVAL)) (SET-CHAR-BIT (IL:\\\, GETTER) (IL:\\\, BTEMP) (IL:\\\, GNUVAL)))) (IL:\\\, SETTER) (IL:\\\, GNUVAL))) (IL:BQUOTE (CHAR-BIT (IL:\\\, GETTER) (IL:\\\, BTEMP)))))))
(DEFINE-SETF-METHOD THE (TYPE PLACE &ENVIRONMENT ENV) (MULTIPLE-VALUE-BIND (DUMMIES VALS NEWVAL SETTER GETTER) (GET-SETF-METHOD PLACE ENV) (VALUES DUMMIES VALS NEWVAL (SUBST (IL:BQUOTE (THE (IL:\\\, TYPE) (IL:\\\, (CAR NEWVAL)))) (CAR NEWVAL) SETTER) (IL:BQUOTE (THE (IL:\\\, TYPE) (IL:\\\, GETTER))))))
(DEFSETF CL:FDEFINITION CL::SET-FDEFINITION)
(IL:* IL:\; "Some IL setfs, for no especially good reason")
(DEFSETF IL:GETHASH IL:%SET-IL-GETHASH)
(DEFMACRO IL:%SET-IL-GETHASH (KEY HASH-TABLE &OPTIONAL NEWVALUE) (IL:* IL:|;;| "SETF inverse for IL:GETHASH. Tricky parts are that args to IL:PUTHASH are in wrong order, and IL:GETHASH might default its second arg (yuck, let's flush that), in which case the third arg is absent and the second is the new value.") (COND ((NOT NEWVALUE) (IL:* IL:\; "Defaulted hash table") (IL:BQUOTE (IL:PUTHASH (IL:\\\, KEY) (IL:\\\, HASH-TABLE)))) ((OR (IL:CONSTANTEXPRESSIONP NEWVALUE) (AND (SYMBOLP NEWVALUE) (SYMBOLP HASH-TABLE))) (IL:* IL:\; "Ok to swap args") (IL:BQUOTE (IL:PUTHASH (IL:\\\, KEY) (IL:\\\, NEWVALUE) (IL:\\\, HASH-TABLE)))) (T (IL:BQUOTE (LET (IL:$$GETHASH-TABLE) (DECLARE (IL:LOCALVARS IL:$$GETHASH-TABLE)) (IL:PUTHASH (IL:\\\, KEY) (PROGN (IL:SETQ IL:$$GETHASH-TABLE (IL:\\\, HASH-TABLE)) (IL:\\\, NEWVALUE)) IL:$$GETHASH-TABLE))))))
(IL:PUTPROPS :SETF-METHOD-EXPANDER IL:PROPTYPE IGNORE)
(IL:PUTPROPS :SETF-INVERSE IL:PROPTYPE IGNORE)
(IL:PUTPROPS :SHARED-SETF-INVERSE IL:PROPTYPE IGNORE)
(IL:PUTPROPS IL:CMLSETF IL:FILETYPE :COMPILE-FILE)
(IL:PUTPROPS IL:CMLSETF 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:CMLSETF IL:COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1990 1992))
(IL:DECLARE\: IL:DONTCOPY
(IL:FILEMAP (NIL)))
IL:STOP

BIN
CLTL2/CMLSETF.DFASL Normal file

Binary file not shown.

752
CLTL2/CMLSMARTARGS Normal file
View File

@@ -0,0 +1,752 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 15:15:10" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLSMARTARGS.;2" 36820
previous date%: "13-Apr-92 16:26:44" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLSMARTARGS.;1"
)
(* ; "
Copyright (c) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLSMARTARGSCOMS)
(RPAQQ CMLSMARTARGSCOMS
((VARS *CL-ARGINFO-LIST* *XCL-ARGINFO-LIST*)
(FUNCTIONS ARGINFO-MUNG CLSMARTEN)
[DECLARE%: DONTEVAL@LOAD DOCOPY (P (CLSMARTEN *CL-ARGINFO-LIST*)
(CLSMARTEN *XCL-ARGINFO-LIST*)
(SETQ *CL-ARGINFO-LIST* (SETQ *XCL-ARGINFO-LIST*
'NOBIND]
(PROP FILETYPE CMLSMARTARGS)))
(RPAQQ *CL-ARGINFO-LIST*
(((LISP:* +)
&REST NUMBERS)
((- / LISP:/= < <= = > >= MAX MIN)
LISP:NUMBER &REST MORE-NUMBERS)
((LISP:1+ LISP:1- ABS LISP:ACOS LISP:ACOSH LISP:ASIN LISP:ASINH LISP:ATANH LISP:CONJUGATE
LISP:COSH LISP:EXP LISP:IMAGPART MINUSP LISP:PHASE LISP:PLUSP LISP:RATIONAL
LISP:RATIONALIZE LISP:REALPART LISP:SIGNUM LISP:SINH LISP:SQRT LISP:TANH LISP:ZEROP)
LISP:NUMBER)
(LISP:ACONS KEY DATUM A-LIST)
((LISP:ADJOIN LISP:MEMBER)
ITEM LIST &KEY :TEST :TEST-NOT :KEY)
(LISP:ADJUST-ARRAY LISP:ARRAY NEW-DIMENSIONS &KEY :ELEMENT-TYPE :INITIAL-ELEMENT
:INITIAL-CONTENTS :FILL-POINTER :DISPLACED-TO :DISPLACED-INDEX-OFFSET :FATP
:DISPLACED-TO-BASE)
((LISP:ADJUSTABLE-ARRAY-P LISP:ARRAY-DIMENSIONS LISP:ARRAY-ELEMENT-TYPE
LISP:ARRAY-HAS-FILL-POINTER-P LISP:ARRAY-RANK LISP:ARRAY-TOTAL-SIZE)
LISP:ARRAY)
((LISP:ALPHA-CHAR-P LISP:ALPHANUMERICP LISP:BOTH-CASE-P LISP:CHAR-BITS LISP:CHAR-CODE
LISP:CHAR-DOWNCASE LISP:CHAR-FONT LISP:CHAR-INT LISP:CHAR-NAME LISP:CHAR-UPCASE
LISP:GRAPHIC-CHAR-P LISP:LOWER-CASE-P LISP:STANDARD-CHAR-P LISP:STRING-CHAR-P
LISP:UPPER-CASE-P)
LISP:CHAR)
((AND OR PROGN)
(CURLYLIST FORM)
#\*)
((LISP:APPEND NCONC)
&REST LISTS)
(LISP:APPLY LISP:FUNCTION ARG &REST MORE-ARGS)
(LISP:APPLYHOOK LISP:FUNCTION ARGS EVALHOOKFN APPLYHOOKFN &OPTIONAL ENV)
((LISP:APROPOS LISP:APROPOS-LIST)
STRING &OPTIONAL PACKAGE)
((LISP:AREF LISP:ARRAY-IN-BOUNDS-P LISP:ARRAY-ROW-MAJOR-INDEX)
LISP:ARRAY &REST SUBSCRIPTS)
(LISP:ARRAY-DIMENSION LISP:ARRAY AXIS-NUMBER)
((LISP:ARRAYP LISP:ATOM LISP:BIT-VECTOR-P LISP:CHARACTER LISP:CHARACTERP LISP:COMMONP
LISP:COMPILED-FUNCTION-P LISP:COMPLEXP LISP:CONSP LISP:CONSTANTP LISP:COPY-TREE
LISP:DESCRIBE LISP:ENDP LISP:FLOATP LISP:FUNCTIONP LISP:HASH-TABLE-P LISP:IDENTITY
INSPECT LISP:INTEGERP LISP:KEYWORDP LISP:LISTP NULL LISP:NUMBERP LISP:PACKAGEP
LISP:PATHNAMEP LISP:PRIN1-TO-STRING LISP:PRINC-TO-STRING LISP:RANDOM-STATE-P
LISP:RATIONALP READTABLEP LISP:SIMPLE-BIT-VECTOR-P LISP:SIMPLE-STRING-P
LISP:SIMPLE-VECTOR-P STREAMP LISP:STRINGP LISP:SXHASH LISP:SYMBOLP LISP:TYPE-OF
LISP:VECTORP)
OBJECT)
(LISP:ASH INTEGER LISP:COUNT)
[LISP:ASSERT TEST-FORM (SQUARELIST ((CURLYLIST* PLACE))
(SQUARELIST STRING (CURLYLIST* ARG]
((LISP:ASSOC LISP:RASSOC)
ITEM A-LIST &KEY :TEST :TEST-NOT :KEY)
((LISP:ASSOC-IF LISP:ASSOC-IF-NOT LISP:RASSOC-IF LISP:RASSOC-IF-NOT)
PREDICATE A-LIST &KEY :KEY)
(LISP:ATAN Y &OPTIONAL X)
(BIT BIT-ARRAY &REST SUBSCRIPTS)
((LISP:BIT-AND LISP:BIT-EQV LISP:BIT-IOR LISP:BIT-XOR)
BIT-ARRAY1 BIT-ARRAY-2 &OPTIONAL RESULT-BIT-ARRAY)
((LISP:BIT-ANDC1 LISP:BIT-ANDC2 LISP:BIT-NAND LISP:BIT-NOR LISP:BIT-ORC1 LISP:BIT-ORC2)
BIT-ARRAY1 BIT-ARRAY2 &OPTIONAL RESULT-BIT-ARRAY)
(LISP:BIT-NOT BIT-ARRAY &OPTIONAL RESULT-BIT-ARRAY)
(LISP:BLOCK NAME
(CURLYLIST FORM)
#\*)
(LISP:BOOLE OP INTEGER1 INTEGER2)
((BOUNDP LISP:FBOUNDP LISP:FMAKUNBOUND LISP:MAKE-SYNONYM-STREAM LISP:MAKUNBOUND
LISP:SPECIAL-FORM-P LISP:SYMBOL-FUNCTION LISP:SYMBOL-PLIST LISP:SYMBOL-VALUE)
LISP:SYMBOL)
(LISP:BREAK &OPTIONAL FORMAT-STRING &REST ARGS)
((LISP:BUTLAST LISP:NBUTLAST)
LIST &OPTIONAL N)
(BYTE SIZE LISP:POSITION)
((LISP:BYTE-POSITION BYTE-SIZE)
BYTESPEC)
((CAAAAR CAAADR CAAAR CAADAR CAADDR CAADR CAAR CADAAR CADADR CADAR CADDAR CADDDR CADDR CADR
CAR CDAAAR CDAADR CDAAR CDADAR CDADDR CDADR CDAR CDDAAR CDDADR CDDAR CDDDAR CDDDDR
CDDDR CDDR CDR LISP:EIGHTH LISP:FIFTH LISP:FIRST LISP:FOURTH LISP:LIST-LENGTH
LISP:NINTH LISP:REST LISP:SECOND LISP:SEVENTH LISP:SIXTH LISP:TENTH LISP:THIRD)
LIST)
[(CASE LISP:ECASE)
KEYFORM
(CURLYLIST* ((CURLYLIST ((CURLYLIST* KEY))
#\| KEY)
(CURLYLIST* FORM]
(LISP:CATCH TAG
(CURLYLIST FORM)
#\*)
[LISP:CCASE KEYPLACE (CURLYLIST* ((CURLYLIST ((CURLYLIST* KEY))
#\| KEY)
(CURLYLIST* FORM]
((LISP:CEILING LISP:FCEILING LISP:FFLOOR LISP:FLOOR LISP:FROUND LISP:FTRUNCATE ROUND
LISP:TRUNCATE)
LISP:NUMBER &OPTIONAL DIVISOR)
(LISP:CERROR CONTINUE-FORMAT-STRING ERROR-FORMAT-STRING &REST ARGS)
(LISP:CHAR STRING INDEX)
(LISP:CHAR-BIT LISP:CHAR NAME)
((LISP:CHAR-EQUAL LISP:CHAR-GREATERP LISP:CHAR-LESSP LISP:CHAR-NOT-EQUAL
LISP:CHAR-NOT-GREATERP LISP:CHAR-NOT-LESSP LISP:CHAR/= LISP:CHAR< LISP:CHAR<=
LISP:CHAR= LISP:CHAR> LISP:CHAR>=)
LISP:CHARACTER &REST MORE-CHARACTERS)
(LISP:CHECK-TYPE PLACE TYPESPEC &OPTIONAL STRING)
((LISP:CIS LISP:COS LISP:SIN LISP:TAN)
RADIANS)
((LISP:CLEAR-INPUT LISP:LISTEN)
&OPTIONAL INPUT-STREAM)
((LISP:CLEAR-OUTPUT LISP:FINISH-OUTPUT LISP:FORCE-OUTPUT LISP:FRESH-LINE LISP:TERPRI)
&OPTIONAL OUTPUT-STREAM)
(LISP:CLOSE STREAM &KEY :ABORT)
((CLRHASH LISP:HASH-TABLE-COUNT)
LISP:HASH-TABLE)
(LISP:CODE-CHAR CODE &OPTIONAL BITS FONT)
(COERCE OBJECT RESULT-TYPE)
(LISP:COMPILE NAME &OPTIONAL DEFINITION &KEY :LAP)
(LISP:COMPILE-FILE INPUT-PATHNAME &KEY :OUTPUT-FILE :ERROR-FILE :ERRORS-TO-TERMINAL :LAP-FILE
:LOAD :FILE-MANAGER-FORMAT :PROCESS-ENTIRE-FILE)
(LISP:COMPILER-LET ((CURLYLIST VAR #\| (VAR VALUE))
#\*)
(CURLYLIST FORM)
#\*)
(COMPLEX LISP:REALPART &OPTIONAL IMAGPART)
(LISP:COMPUTE-RESTARTS &OPTIONAL CONDITION)
(LISP:CONCATENATE RESULT-TYPE &REST SEQUENCES)
(COND (CURLYLIST (TEST (CURLYLIST FORM)
#\*))
#\*)
((CONS LISP:NRECONC LISP:REVAPPEND RPLACA RPLACD)
X Y)
((LISP:COPY-ALIST LISP:COPY-LIST LISP:VALUES-LIST)
LIST)
(LISP:COPY-READTABLE &OPTIONAL FROM-READTABLE TO-READTABLE)
((LISP:COPY-SEQ LISP:LENGTH LISP:NREVERSE LISP:REVERSE)
SEQUENCE)
(LISP:COPY-SYMBOL SYM &OPTIONAL COPY-PROPS)
((LISP:COUNT LISP:FIND LISP:POSITION)
ITEM SEQUENCE &KEY :FROM-END :TEST :TEST-NOT :START :END :KEY)
((LISP:COUNT-IF LISP:COUNT-IF-NOT LISP:FIND-IF LISP:FIND-IF-NOT LISP:POSITION-IF
LISP:POSITION-IF-NOT)
TEST SEQUENCE &KEY :FROM-END :START :END :KEY)
[LISP:CTYPECASE KEYPLACE (CURLYLIST* (TYPE (CURLYLIST* FORM]
((LISP:DECF LISP:INCF)
PLACE
(SQUARELIST DELTA))
(LISP:DECLAIM (CURLYLIST* DECL-SPEC)
#\*)
(DECLARE (CURLYLIST DECL-SPEC)
#\*)
((LISP:DECODE-FLOAT LISP:FLOAT-DIGITS LISP:FLOAT-PRECISION LISP:FLOAT-RADIX
LISP:INTEGER-DECODE-FLOAT)
FLOAT)
(LISP:DECODE-UNIVERSAL-TIME UNIVERSAL-TIME &OPTIONAL TIME-ZONE)
((LISP:DEFCONSTANT LISP:DEFPARAMETER)
NAME INITIAL-VALUE (SQUARELIST LISP:DOCUMENTATION))
(DEFINE-CONDITION NAME ((CURLYLIST PARENT-TYPE)
#\*)
(SQUARELIST ((CURLYLIST SLOT-SPECIFIER)
#\*)
(CURLYLIST OPTION)
#\*))
(LISP:DEFINE-MODIFY-MACRO NAME LAMBDA-LIST LISP:FUNCTION (SQUARELIST DOC-STRING))
(LISP:DEFINE-SETF-METHOD ACCESS-FN LAMBDA-LIST (CURLYLIST LISP:DECLARATION #\| DOC-STRING)
#\*
(CURLYLIST FORM)
#\*)
((DEFMACRO LISP:DEFTYPE LISP:DEFUN)
NAME LAMBDA-LIST (CURLYLIST* LISP:DECLARATION #\| DOC-STRING)
(CURLYLIST* FORM))
(DEFPACKAGE DEFINED-PACKAGE-NAME (CURLYLIST OPTION)
#\*)
(LISP:DEFSETF ACCESS-FN (CURLYLIST UPDATE-FN (SQUARELIST DOC-STRING)
#\| LAMBDA-LIST (STORE-VARIABLE)
(CURLYLIST LISP:DECLARATION #\| DOC-STRING)
#\*
(CURLYLIST FORM)
#\*))
(LISP:DEFSTRUCT NAME-AND-OPTIONS (SQUARELIST DOC-STRING)
(CURLYLIST SLOT-DESCRIPTION)
#\+)
(LISP:DEFVAR NAME (SQUARELIST INITIAL-VALUE (SQUARELIST LISP:DOCUMENTATION)))
((LISP:DELETE LISP:REMOVE)
ITEM SEQUENCE &KEY :FROM-END :TEST :TEST-NOT :START :END :COUNT :KEY)
((LISP:DELETE-DUPLICATES LISP:REMOVE-DUPLICATES)
SEQUENCE &KEY :FROM-END :TEST :TEST-NOT :START :END :KEY)
((LISP:DELETE-FILE LISP:FILE-AUTHOR LISP:FILE-WRITE-DATE LISP:PROBE-FILE)
FILE)
((LISP:DELETE-IF LISP:DELETE-IF-NOT LISP:REMOVE-IF LISP:REMOVE-IF-NOT)
TEST SEQUENCE &KEY :FROM-END :START :END :COUNT :KEY)
((LISP:DENOMINATOR LISP:NUMERATOR)
LISP:RATIONAL)
((LISP:DEPOSIT-FIELD DPB)
NEWBYTE BYTESPEC INTEGER)
(DESTRUCTURING-BIND BIND-PATTERN VALUE &BODY BODY)
(LISP:DIGIT-CHAR WEIGHT &OPTIONAL RADIX FONT)
(LISP:DIGIT-CHAR-P LISP:CHAR &OPTIONAL RADIX)
((LISP:DIRECTORY LISP:DIRECTORY-NAMESTRING LISP:FILE-NAMESTRING LISP:HOST-NAMESTRING
LISP:NAMESTRING PATHNAME LISP:PATHNAME-DEVICE LISP:PATHNAME-DIRECTORY
LISP:PATHNAME-HOST LISP:PATHNAME-NAME LISP:PATHNAME-TYPE LISP:PATHNAME-VERSION
LISP:TRUENAME)
PATHNAME)
(LISP:DISASSEMBLE NAME-OR-COMPILED-FUNCTION)
((LISP:DO LISP:DO*)
[(CURLYLIST* VAR #\| (VAR (SQUARELIST INIT (SQUARELIST LISP:STEP]
(END-TEST (CURLYLIST* RESULT))
(CURLYLIST* LISP:DECLARATION)
(CURLYLIST* TAG #\| STATEMENT))
(LISP:DO-ALL-SYMBOLS (VAR (SQUARELIST RESULT-FORM))
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST TAG #\| STATEMENT)
#\*)
((LISP:DO-EXTERNAL-SYMBOLS LISP:DO-SYMBOLS)
(VAR (SQUARELIST PACKAGE (SQUARELIST RESULT-FORM)))
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST TAG #\| STATEMENT)
#\*)
(LISP:DOCUMENTATION LISP:SYMBOL DOC-TYPE)
(LISP:DOLIST (VAR LISTFORM (SQUARELIST RESULTFORM))
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST TAG #\| STATEMENT)
#\*)
(LISP:DOTIMES (VAR COUNTFORM (SQUARELIST RESULTFORM))
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST TAG #\| STATEMENT)
#\*)
(DRIBBLE &OPTIONAL PATHNAME)
(ED &OPTIONAL NAME OPTIONS #\= ((CURLYLIST "FILEPKGTYPE" #\| :DISPLAY #\| :NEW)
#\*))
(LISP:ELT SEQUENCE INDEX)
(LISP:ENCODE-UNIVERSAL-TIME LISP:SECOND MINUTE HOUR DATE MONTH YEAR &OPTIONAL TIME-ZONE)
(LISP:ENOUGH-NAMESTRING PATHNAME &OPTIONAL DEFAULTS)
((EQ EQL LISP:EQUAL LISP:EQUALP)
X Y)
((LISP:ERROR LISP:WARN)
FORMAT-STRING &REST ARGS)
((LISP:ETYPECASE LISP:TYPECASE)
KEYFORM
(CURLYLIST (TYPE (CURLYLIST FORM)
#\*))
#\*)
((LISP:EVAL LISP:GET-SETF-METHOD LISP:GET-SETF-METHOD-MULTIPLE-VALUE)
FORM)
(LISP:EVAL-WHEN ((CURLYLIST SITUATION)
#\*)
(CURLYLIST FORM)
#\*)
(LISP:EVALHOOK FORM EVALHOOKFN APPLYHOOKFN &OPTIONAL ENV)
((EVENP LISP:INT-CHAR LISP:INTEGER-LENGTH LISP:ISQRT LISP:LOGCOUNT LOGNOT ODDP)
INTEGER)
((LISP:EVERY LISP:NOTANY LISP:NOTEVERY LISP:SOME)
PREDICATE SEQUENCE &REST MORE-SEQUENCES)
((EXPORT IMPORT LISP:SHADOW LISP:SHADOWING-IMPORT LISP:UNEXPORT)
SYMBOLS &OPTIONAL PACKAGE)
(LISP:EXPT BASE-NUMBER POWER-NUMBER)
(LISP:FILE-LENGTH FILE-STREAM)
(LISP:FILE-POSITION FILE-STREAM &OPTIONAL LISP:POSITION)
(LISP:FILL SEQUENCE ITEM &KEY :START :END)
((LISP:FILL-POINTER LISP:VECTOR-POP)
LISP:VECTOR)
(LISP:FIND-ALL-SYMBOLS STRING-OR-SYMBOL)
((LISP:FIND-PACKAGE LISP:NAME-CHAR)
NAME)
(LISP:FIND-RESTART RESTART-IDENTIFIER &OPTIONAL CONDITION)
((LISP:FIND-SYMBOL LISP:INTERN)
STRING &OPTIONAL PACKAGE)
((LISP:FLET LISP:LABELS)
((CURLYLIST (NAME LAMBDA-LIST (CURLYLIST LISP:DECLARATION #\| DOC-STRING)
#\*
(CURLYLIST FORM)
#\*))
#\*)
(CURLYLIST FORM)
#\*)
(FLOAT LISP:NUMBER &OPTIONAL OTHER)
(LISP:FLOAT-SIGN FLOAT1 &OPTIONAL FLOAT2)
(LISP:FORMAT DESTINATION CONTROL-STRING &REST ARGUMENTS)
(LISP:FUNCALL FN &REST ARGUMENTS)
#'FN
((LISP:GCD LOGAND LISP:LOGEQV LISP:LOGIOR LOGXOR)
&REST INTEGERS)
(LISP:GENSYM &OPTIONAL X)
(LISP:GENTEMP &OPTIONAL PREFIX PACKAGE)
(GET LISP:SYMBOL INDICATOR &OPTIONAL DEFAULT)
((LISP:GET-DECODED-TIME LISP:GET-INTERNAL-REAL-TIME LISP:GET-INTERNAL-RUN-TIME
LISP:GET-UNIVERSAL-TIME LISP:LISP-IMPLEMENTATION-TYPE
LISP:LISP-IMPLEMENTATION-VERSION LISP:LIST-ALL-PACKAGES LISP:LONG-SITE-NAME
LISP:MACHINE-INSTANCE LISP:MACHINE-TYPE LISP:MACHINE-VERSION
LISP:MAKE-STRING-OUTPUT-STREAM LISP:SHORT-SITE-NAME LISP:SOFTWARE-TYPE
LISP:SOFTWARE-VERSION))
(LISP:GET-DISPATCH-MACRO-CHARACTER DISP-CHAR SUB-CHAR &OPTIONAL LISP:READTABLE)
(LISP:GET-MACRO-CHARACTER LISP:CHAR &OPTIONAL LISP:READTABLE)
(LISP:GET-OUTPUT-STREAM-STRING STRING-OUTPUT-STREAM)
(LISP:GET-PROPERTIES PLACE INDICATOR-LIST)
(LISP:GETF PLACE INDICATOR &OPTIONAL DEFAULT)
(LISP:GETHASH KEY LISP:HASH-TABLE &OPTIONAL DEFAULT)
(GO TAG)
(HANDLER-BIND ((CURLYLIST (TYPE HANDLER))
#\*)
(CURLYLIST FORM)
#\*)
(LISP:HANDLER-CASE EXPRESSION (CURLYLIST (TYPESPEC ((SQUARELIST VAR))
(CURLYLIST FORM)
#\*))
#\*)
(IGNORE-ERRORS &BODY FORMS)
(LISP:IF TEST
THEN
(SQUARELIST ELSE))
(LISP:IN-PACKAGE NAME)
(LISP:IN-PACKAGE LISP:PACKAGE-NAME &KEY :NICKNAMES :USE)
((LISP:INPUT-STREAM-P LISP:OUTPUT-STREAM-P LISP:STREAM-ELEMENT-TYPE)
STREAM)
(LISP:INVOKE-RESTART RESTART-IDENTIFIER &REST ARGUMENTS)
((LISP:INTERSECTION LISP:NINTERSECTION LISP:NSET-DIFFERENCE LISP:NSET-EXCLUSIVE-OR
LISP:NUNION LISP:SET-DIFFERENCE LISP:SET-EXCLUSIVE-OR LISP:SUBSETP LISP:UNION)
LIST1 LIST2 &KEY :TEST :TEST-NOT :KEY)
(LAST LIST &OPTIONAL N)
(LISP:LCM &REST INTEGERS)
((LDB LISP:LDB-TEST LISP:MASK-FIELD)
BYTESPEC INTEGER)
(LISP:LDIFF LIST SUBLIST)
((LET LET*)
((CURLYLIST VAR #\| (VAR (SQUARELIST VALUE)))
#\*)
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
((LIST LISP:VALUES)
&REST ARGS)
(LIST* ARG &REST OTHERS)
(LISP:LOAD FILENAME &KEY :VERBOSE :PRINT :IF-DOES-NOT-EXIST :PACKAGE :LOADFLG)
(LISP:LOCALLY (CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(LISP:LOG LISP:NUMBER &OPTIONAL BASE)
((LISP:LOGANDC1 LISP:LOGANDC2 LISP:LOGNAND LISP:LOGNOR LISP:LOGORC1 LISP:LOGORC2 LISP:LOGTEST
)
INTEGER1 INTEGER2)
(LISP:LOGBITP INDEX INTEGER)
(LISP:LOOP (CURLYLIST LISP::LOOP-CLAUSE)
#\*
(CURLYLIST TAG #\| EXPR)
#\*)
(LISP:MACRO-FUNCTION SYMBOL &OPTIONAL ENV)
((LISP:MACROEXPAND LISP:MACROEXPAND-1)
FORM &OPTIONAL ENV)
(LISP:MACROLET ((CURLYLIST (NAME VARLIST (CURLYLIST LISP:DECLARATION #\| DOC-STRING)
#\*
(CURLYLIST FORM)
#\*))
#\*)
(CURLYLIST FORM)
#\*)
(LISP:MAKE-ARRAY DIMENSIONS &KEY :ELEMENT-TYPE :INITIAL-ELEMENT :INITIAL-CONTENTS :ADJUSTABLE
:FILL-POINTER :DISPLACED-TO :DISPLACED-INDEX-OFFSET :FATP :EXTENDABLE :READ-ONLY-P
:DISPLACED-TO-BASE)
((LISP:MAKE-BROADCAST-STREAM LISP:MAKE-CONCATENATED-STREAM)
&REST STREAMS)
(LISP:MAKE-CHAR LISP:CHAR &OPTIONAL BITS FONT)
(MAKE-CONDITION TYPE &REST SLOT-INITIALIZATIONS)
(LISP:MAKE-DISPATCH-MACRO-CHARACTER LISP:CHAR &OPTIONAL NON-TERMINATING-P LISP:READTABLE)
((LISP:MAKE-ECHO-STREAM LISP:MAKE-TWO-WAY-STREAM)
INPUT-STREAM OUTPUT-STREAM)
(LISP:MAKE-HASH-TABLE &KEY :TEST :SIZE :REHASH-SIZE :REHASH-THRESHOLD)
(LISP:MAKE-LIST SIZE &KEY :INITIAL-ELEMENT)
(LISP:MAKE-PACKAGE LISP:PACKAGE-NAME &KEY :NICKNAMES :USE :PREFIX-NAME :INTERNAL-SYMBOLS
:EXTERNAL-SYMBOLS :EXTERNAL-ONLY)
(LISP:MAKE-PATHNAME &KEY :HOST :DEVICE :DIRECTORY :NAME :TYPE :VERSION :DEFAULTS :CASE)
(LISP:MAKE-RANDOM-STATE &OPTIONAL STATE)
(LISP:MAKE-SEQUENCE TYPE SIZE &KEY :INITIAL-ELEMENT)
(LISP:MAKE-STRING SIZE &KEY :INITIAL-ELEMENT :ELEMENT-TYPE)
(LISP:MAKE-STRING-INPUT-STREAM STRING &OPTIONAL START END)
(LISP:MAKE-STRING-OUTPUT-STREAM &KEY :ELEMENT-TYPE)
(LISP:MAKE-SYMBOL PRINT-NAME)
(MAKE-VECTOR LISP:LENGTH &OPTIONAL TYPE INITIAL-VALUE)
(LISP:MAP RESULT-TYPE LISP:FUNCTION SEQUENCE &REST MORE-SEQUENCES)
(LISP:MAP-INTO RESULT-SEQUENCE FUNCTION &REST SEQUENCES)
((LISP:MAPC LISP:MAPCAN LISP:MAPCAR LISP:MAPCON LISP:MAPL LISP:MAPLIST)
LISP:FUNCTION LIST &REST MORE-LISTS)
(LISP:MAPHASH LISP:FUNCTION LISP:HASH-TABLE)
((LISP:MEMBER-IF LISP:MEMBER-IF-NOT)
PREDICATE LIST &KEY :KEY)
(LISP:MERGE RESULT-TYPE SEQUENCE1 SEQUENCE2 PREDICATE &KEY :KEY)
(LISP:MERGE-PATHNAMES PATHNAME &OPTIONAL DEFAULTS DEFAULT-VERSION)
((LISP:MISMATCH LISP:SEARCH)
SEQUENCE1 SEQUENCE2 &KEY :FROM-END :TEST :TEST-NOT :KEY :START1 :START2 :END1 :END2)
((LISP:MOD LISP:REM)
LISP:NUMBER DIVISOR)
(LISP:MULTIPLE-VALUE-BIND ((CURLYLIST VAR)
#\*)
VALUES-FORM
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(LISP:MULTIPLE-VALUE-CALL LISP:FUNCTION (CURLYLIST FORM)
#\*)
((LISP:MULTIPLE-VALUE-LIST LISP:STEP)
FORM)
(LISP:MULTIPLE-VALUE-PROG1 FORM (CURLYLIST FORM)
#\*)
(LISP:MULTIPLE-VALUE-SETQ VARIABLES FORM)
((NOT STRING)
X)
((LISP:NSTRING-CAPITALIZE LISP:NSTRING-DOWNCASE LISP:NSTRING-UPCASE LISP:STRING-CAPITALIZE
LISP:STRING-DOWNCASE LISP:STRING-UPCASE)
STRING &KEY :START :END)
((LISP:NSUBLIS LISP:SUBLIS)
ALIST TREE &KEY :TEST :TEST-NOT :KEY)
((LISP:NSUBST LISP:SUBST)
NEW OLD TREE &KEY :TEST :TEST-NOT :KEY)
((LISP:NSUBST-IF LISP:NSUBST-IF-NOT LISP:SUBST-IF LISP:SUBST-IF-NOT)
NEW TEST TREE &KEY :KEY)
((LISP:NSUBSTITUTE LISP:SUBSTITUTE)
NEWITEM OLDITEM SEQUENCE &KEY :FROM-END :TEST :TEST-NOT :START :END :COUNT :KEY)
((LISP:NSUBSTITUTE-IF LISP:NSUBSTITUTE-IF-NOT LISP:SUBSTITUTE-IF LISP:SUBSTITUTE-IF-NOT)
NEWITEM TEST SEQUENCE &KEY :FROM-END :START :END :COUNT :KEY)
((LISP:NTH LISP:NTHCDR)
N LIST)
(LISP:NTH-VALUE N FORM)
(OPEN FILENAME &KEY :DIRECTION :ELEMENT-TYPE :IF-EXISTS :IF-DOES-NOT-EXIST :EXTERNAL-FORMAT)
((LISP:PACKAGE-NAME LISP:PACKAGE-NICKNAMES LISP:PACKAGE-SHADOWING-SYMBOLS
LISP:PACKAGE-USE-LIST LISP:PACKAGE-USED-BY-LIST)
PACKAGE)
(LISP:PAIRLIS KEYS DATA &OPTIONAL A-LIST)
(LISP:PARSE-INTEGER STRING &KEY :START :END :RADIX :JUNK-ALLOWED)
(LISP:PARSE-NAMESTRING THING &OPTIONAL HOST DEFAULTS &KEY :START :END :JUNK-ALLOWED)
((LISP:PATHNAME-HOST LISP:PATHNAME-DEVICE LISP:PATHNAME-DIRECTORY LISP:PATHNAME-NAME
LISP:PATHNAME-TYPE)
PATHNAME &KEY :CASE)
(LISP:PEEK-CHAR &OPTIONAL PEEK-TYPE INPUT-STREAM EOF-ERROR-P EOF-VALUE RECURSIVE-P)
(LISP:POP PLACE)
((LISP:PPRINT LISP:PRIN1 LISP:PRINC LISP:PRINT)
OBJECT &OPTIONAL OUTPUT-STREAM)
(LISP:PRINT-UNREADABLE-OBJECT (LISP::OBJECT STREAM &KEY :TYPE :IDENTITY)
(CURLYLIST DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(LISP:PROCLAIM DECL-SPEC)
((PROG PROG*)
((CURLYLIST VAR #\| (VAR (SQUARELIST INIT)))
#\*)
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST TAG #\| STATEMENT)
#\*)
(PROG1 LISP:FIRST
(CURLYLIST FORM)
#\*)
(PROG2 LISP:FIRST LISP:SECOND (CURLYLIST FORM)
#\*)
(LISP:PROGV SYMBOLS LISP:VALUES
(CURLYLIST FORM)
#\*)
(LISP:PROVIDE MODULE-NAME)
((LISP:PSETF LISP:SETF)
(CURLYLIST PLACE NEWVALUE)
#\*)
((LISP:PSETQ LISP:SETQ)
(CURLYLIST VAR FORM)
#\*)
(LISP:PUSH ITEM PLACE)
(LISP:PUSHNEW ITEM LIST &KEY :TEST :TEST-NOT :KEY)
'OBJECT
(LISP:RANDOM LISP:NUMBER &OPTIONAL STATE)
((LISP:READ LISP:READ-CHAR LISP:READ-CHAR-NO-HANG LISP:READ-LINE)
&OPTIONAL INPUT-STREAM EOF-ERROR-P EOF-VALUE RECURSIVE-P)
(LISP:READ-BYTE BINARY-INPUT-STREAM &OPTIONAL EOF-ERROR-P EOF-VALUE)
(LISP:READ-DELIMITED-LIST LISP:CHAR &OPTIONAL INPUT-STREAM RECURSIVE-P)
(LISP:READ-FROM-STRING STRING &OPTIONAL EOF-ERROR-P EOF-VALUE &KEY :START :END
:PRESERVE-WHITESPACE)
(LISP:READ-PRESERVING-WHITESPACE &OPTIONAL IN-STREAM EOF-ERROR-P EOF-VALUE RECURSIVE-P)
(LISP:REDUCE LISP:FUNCTION SEQUENCE &KEY :FROM-END :START :END :INITIAL-VALUE)
(LISP:REMF PLACE INDICATOR)
(REMHASH KEY LISP:HASH-TABLE)
(REMPROP LISP:SYMBOL INDICATOR)
(LISP:RENAME-FILE FILE NEW-NAME)
(LISP:RENAME-PACKAGE PACKAGE NEW-NAME &OPTIONAL NEW-NICKNAMES)
(LISP:REPLACE SEQUENCE1 SEQUENCE2 &KEY :START1 :END1 :START2 :END2)
(LISP:REQUIRE MODULE-NAME &OPTIONAL PATHNAME)
(LISP:RESTART-BIND ((CURLYLIST (NAME FUNCTION (CURLYLIST KEYWORD VALUE)
#\*))
#\*)
(CURLYLIST FORM)
#\*)
(LISP:RESTART-CASE EXPRESSION (CURLYLIST (CASE-NAME ARG-LIST (CURLYLIST KEYWORD VALUE)
#\*
(CURLYLIST FORM)
#\*))
#\*)
(RETURN (SQUARELIST RESULT))
(LISP:RETURN-FROM NAME (SQUARELIST RESULT))
(LISP:ROTATEF (CURLYLIST PLACE)
#\*)
(LISP:SBIT SIMPLE-BIT-ARRAY &REST SUBSCRIPTS)
(LISP:SCALE-FLOAT FLOAT INTEGER)
(LISP:SCHAR LISP:SIMPLE-STRING INDEX)
(SET LISP:SYMBOL VALUE)
(LISP:SET-CHAR-BIT LISP:CHAR NAME NEWVALUE)
(LISP:SET-DISPATCH-MACRO-CHARACTER DISP-CHAR SUB-CHAR LISP:FUNCTION &OPTIONAL LISP:READTABLE)
(LISP:SET-MACRO-CHARACTER LISP:CHAR LISP:FUNCTION &OPTIONAL NON-TERMINATING-P LISP:READTABLE)
(LISP:SET-SYNTAX-FROM-CHAR TO-CHAR FROM-CHAR &OPTIONAL TO-READTABLE FROM-READTABLE)
(LISP:SHIFTF (CURLYLIST PLACE)
#\+ NEWVALUE)
(SIGNAL DATUM &REST ARGUMENTS)
(LISP:SLEEP SECONDS)
((LISP:SORT LISP:STABLE-SORT)
SEQUENCE PREDICATE &KEY :KEY)
((STORE-VALUE USE-VALUE)
NEW-VALUE &OPTIONAL CONDITION)
(LISP:STREAM-EXTERNAL-FORMAT STREAM)
((STRING-EQUAL LISP:STRING-GREATERP LISP:STRING-LESSP LISP:STRING-NOT-EQUAL
LISP:STRING-NOT-GREATERP LISP:STRING-NOT-LESSP LISP:STRING/= LISP:STRING<
LISP:STRING<= LISP:STRING= LISP:STRING> LISP:STRING>=)
STRING1 STRING2 &KEY :START1 :END1 :START2 :END2)
((LISP:STRING-LEFT-TRIM LISP:STRING-RIGHT-TRIM LISP:STRING-TRIM)
CHARACTER-BAG STRING)
(LISP:SUBSEQ SEQUENCE START &OPTIONAL END)
(LISP:SUBTYPEP TYPE1 TYPE2)
(LISP:SVREF LISP:SIMPLE-VECTOR INDEX)
(LISP::SYMBOL-MACROLET ((CURLYLIST (LISP::VAR LISP::EXPANSION))
#\*)
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST LISP::FORM)
#\*)
((LISP:SYMBOL-NAME LISP:SYMBOL-PACKAGE)
SYM)
(LISP:TAGBODY (CURLYLIST TAG #\| STATEMENT)
#\*)
(TAILP SUBLIST LIST)
(THE VALUE-TYPE FORM)
(LISP:THROW TAG RESULT)
(TIME FORM &KEY :REPEAT :OUTPUT :DATA-TYPES)
((TRACE UNTRACE)
(CURLYLIST FUNCTION-NAME)
#\*)
(LISP:TRANSLATE-PATHNAME PATHNAME &KEY)
(LISP:TRANSLATE-PATHNAME LISP::SOURCE LISP::FROM-WILDNAME LISP::TO-WILDNAME &KEY)
(LISP:TREE-EQUAL X Y &KEY :TEST :TEST-NOT)
(TYPEP OBJECT TYPE)
(LISP:UNINTERN LISP:SYMBOL &OPTIONAL PACKAGE)
((LISP:UNLESS LISP:WHEN)
TEST
(CURLYLIST FORM)
#\*)
(LISP:UNREAD-CHAR LISP:CHARACTER &OPTIONAL INPUT-STREAM)
(LISP:UNUSE-PACKAGE PACKAGES-TO-UNUSE &OPTIONAL PACKAGE)
(LISP:UNWIND-PROTECT
PROTECTED-FORM
(CURLYLIST CLEANUP-FORM)
#\*)
(LISP:USE-PACKAGE PACKAGES-TO-USE &OPTIONAL PACKAGE)
(LISP:USER-HOMEDIR-PATHNAME &OPTIONAL HOST)
(LISP:VECTOR &REST OBJECTS)
(LISP:VECTOR-PUSH NEW-ELEMENT LISP:VECTOR)
(LISP:VECTOR-PUSH-EXTEND NEW-ELEMENT LISP:VECTOR &OPTIONAL EXTENSION)
(LISP:WILD-PATHNAME-P PATHNAME &OPTIONAL LISP::FIELD-KEY)
(LISP:WITH-COMPILATION-UNIT ((CURLYLIST LISP::OPTION-NAME LISP::OPTION-VALUE)
#\*)
(CURLYLIST FORM)
#\*)
(LISP:WITH-CONDITION-RESTARTS CONDITION-FORM RESTARTS-FORM (CURLYLIST DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(LISP:WITH-INPUT-FROM-STRING (VAR STRING (CURLYLIST LISP:KEYWORD VALUE)
#\*)
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(LISP:WITH-HASH-TABLE-ITERATOR (LISP::MNAME LISP:HASH-TABLE)
(CURLYLIST FORM)
#\*)
(LISP:WITH-OPEN-FILE (STREAM FILENAME (CURLYLIST OPTIONS)
#\*)
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(LISP:WITH-OPEN-STREAM (VAR STREAM)
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(LISP:WITH-OUTPUT-TO-STRING (VAR (SQUARELIST STRING (SQUARELIST ":ELEMENT-TYPE" TYPE)))
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(LISP:WITH-PACKAGE-ITERATOR (MNAME PACKAGE-LIST (CURLYLIST LISP::SYMBOL-TYPE)
#\+)
(CURLYLIST LISP::FORM)
#\*)
(LISP:WITH-SIMPLE-RESTART (NAME FORMAT-STRING (CURLYLIST FORMAT-ARGUMENT)
#\*)
(CURLYLIST FORM)
#\*)
(LISP:WITH-STANDARD-IO-SYNTAX (CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST FORM)
#\*)
(WRITE OBJECT &KEY :STREAM :ESCAPE :RADIX :BASE :CIRCLE :PRETTY :LEVEL :LENGTH :CASE :GENSYM
:ARRAY :READABLY :RIGHT-MARGIN :MISER-WIDTH :LINES :PPRINT-DISPATCH)
(LISP:WRITE-BYTE INTEGER BINARY-OUTPUT-STREAM)
(LISP:WRITE-CHAR LISP:CHARACTER &OPTIONAL OUTPUT-STREAM)
((LISP:WRITE-LINE LISP:WRITE-STRING)
STRING &OPTIONAL OUTPUT-STREAM &KEY :START :END)
(LISP:WRITE-TO-STRING OBJECT &KEY :ESCAPE :RADIX :BASE :CIRCLE :PRETTY :LEVEL :LENGTH :CASE
:GENSYM :ARRAY :READABLY :RIGHT-MARGIN :MISER-WIDTH :LINES :PPRINT-DISPATCH)
((LISP:Y-OR-N-P LISP:YES-OR-NO-P)
&OPTIONAL FORMAT-STRING &REST ARGUMENTS)))
(RPAQQ *XCL-ARGINFO-LIST*
((ADD-EXEC &KEY :PROFILE :REGION :TTY :EXEC :ID)
(ASET NEWVALUE ARRAY &REST INDICES)
(CATCH-ABORT PRINT-FORM &BODY FORMS)
(CONDITION-CASE FORM (CURLYLIST (TYPE ((SQUARELIST VAR))
(CURLYLIST FORM)
#\*))
#\*)
((CONDITION-HANDLER CONDITION-REPORTER)
TYPE)
(COMPILER:COPY-ENV-WITH-FUNCTION ENVIRONMENT FUNCTION &OPTIONAL KIND EXP-FN)
(COMPILER:COPY-ENV-WITH-VARIABLE ENVIRONMENT VARIABLE &OPTIONAL KIND)
(DEBUG &OPTIONAL DATUM &REST ARGUMENTS)
(DEF-DEFINE-TYPE NAME DESCRIPTION-STRING &KEY :UNDEFINER)
(DEFAULT-PROCEED-TEST PROCEED-CASE-NAME)
(DEFCOMMAND NAME ARGUMENT-LIST &REST BODY)
(DEFDEFINER (CURLYLIST NAME #\| (NAME (CURLYLIST OPTION-CLAUSE)
#\*))
TYPE ARGLIST &BODY BODY)
(DEFGLOBALPARAMETER NAME INITIAL-VALUE &OPTIONAL DOC-STRING)
(DEFGLOBALVAR NAME &OPTIONAL INITIAL-VALUE DOC-STRING)
(DEFINE-PROCEED-FUNCTION NAME (SQUARELIST KEYWORD VALUE)
#\* &REST VARIABLES)
(DEFINLINE NAME ARG-LIST &BODY BODY)
(DEFOPTIMIZER FORM-NAME (SQUARELIST OPT-NAME)
(SQUARELIST ARG-LIST (SQUARELIST DECL #\| DOC-STRING)
#\*)
BODY)
((XCL:DO-INTERNAL-SYMBOLS DO-LOCAL-SYMBOLS)
(VAR (SQUARELIST PACKAGE (SQUARELIST RESULT-FORM)))
(CURLYLIST LISP:DECLARATION)
#\*
(CURLYLIST TAG #\| STATEMENT)
#\*)
(EXEC &KEY :TOP-LEVEL-P :WINDOW :TITLE :COMMAND-TABLES :ENVIRONMENT :PROMPT :FUNCTION
:PROFILE :ID)
(EXEC-EVAL FORM &OPTIONAL ENVIRONMENT &KEY :PROMPT :ID :TYPE)
(EXEC-FORMAT CONTROL-STRING &REST ARGUMENTS)
((EXTENDABLE-ARRAY-P READ-ONLY-ARRAY-P)
ARRAY)
(FILL-VECTOR VECTOR VALUE &KEY :START :END)
(GLOBALIZE NAMESTRINGS &OPTIONAL PACKAGE)
(INVOKE-PROCEED-CASE PROCEED-CASE &REST VALUES)
(COMPILER:MAKE-CONTEXT &KEY :TOP-LEVEL-P :VALUES-USED :PREDICATE-P)
(PARSE-BODY BODY ENVIRONMENT &OPTIONAL DOC-STRING-ALLOWED?)
(PROCEED-CASE FORM (CURLYLIST (PROCEED-FUNCTION-NAME ARGLIST (SQUARELIST KEYWORD VALUE)
#\*
(CURLYLIST BODY-FORM)
#\*))
#\*)
((XCL:SET-DEFAULT-EXEC-TYPE XCL:SET-EXEC-TYPE)
NAME)
(UNDOABLY (CURLYLIST FORMS))
(UNDOABLY-SETF (CURLYLIST PLACE VALUE)
#\*)))
(LISP:DEFUN ARGINFO-MUNG (LST)
(* ;; "Flattens list elements of LST into a single top-level list of characters and words, recognizing special directives (SQUARELIST . things) and (CURLYLIST . things) to mean turn it into [things] and {things}, respectively.")
[FOR THING IN LST JOIN (COND
[(LISP:CONSP THING)
(CASE (CAR THING)
(SQUARELIST (CONS #\[ (NCONC1 (ARGINFO-MUNG
(CDR THING))
#\])))
(CURLYLIST (CONS #\{ (NCONC1 (ARGINFO-MUNG
(CDR THING))
#\})))
(CURLYLIST* (CONS #\{ (NCONC (ARGINFO-MUNG
(CDR THING))
(LIST #\} #\*))))
(LISP:OTHERWISE (CONS #\( (NCONC1 (ARGINFO-MUNG
THING)
#\)))))]
(T (LIST THING])
(LISP:DEFUN CLSMARTEN (FNLIST)
(* ;; "Transfer arg info from entries in FNLIST to the ARGNAMES props of those fns that need it. Format of an entry in FNLIST is (Functions . StylizedArgInfo), where Functions can be a symbol or list of symbols.")
[LET ((NOSPELLFLG T)) (* ;
 "Tell SMARTARGLIST not to try too hard")
(DECLARE (LISP:SPECIAL NOSPELLFLG))
(LISP:DOLIST (PAIR FNLIST)
[LET (NEWARGS KNOWNARGS)
(LISP:DOLIST [FN (OR (LISTP (CAR PAIR))
(LIST (CAR PAIR]
(LISP:UNLESS (AND [SETQ KNOWNARGS (NLSETQ (SMARTARGLIST
FN
(MEMB (ARGTYPE FN)
'(0 2]
(LISP:LISTP (SETQ KNOWNARGS (CAR KNOWNARGS)))
(NOT (LISP:MACRO-FUNCTION FN)))
(* ;; "Only do this for fns for which SMARTARGLIST doesn't know the answer (something other than an atomic arglist) already. Also ignore macros to override arglists provided by DEFMACRO. The ARGTYPE check means try EXPLAINFLG=T in the case where the function is already defined as a lambda (don't want to do that for macros, since SMARTARGLIST would then fake something out of a macro/dmacro prop). Format of ARGNAMES prop for this kind of guy is (NIL PrettyArgs . InterlispArgs).")
(LISP:SETF (GET FN 'ARGNAMES)
(LIST* NIL [OR NEWARGS (SETQ NEWARGS (ARGINFO-MUNG (CDR PAIR]
KNOWNARGS))))])])
(DECLARE%: DONTEVAL@LOAD DOCOPY
(CLSMARTEN *CL-ARGINFO-LIST*)
(CLSMARTEN *XCL-ARGINFO-LIST*)
(SETQ *CL-ARGINFO-LIST* (SETQ *XCL-ARGINFO-LIST* 'NOBIND))
)
(PUTPROPS CMLSMARTARGS FILETYPE :COMPILE-FILE)
(PUTPROPS CMLSMARTARGS COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1989 1990 1991 1992 1993)
)
(DECLARE%: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLSMARTARGS.DFASL Normal file

Binary file not shown.

567
CLTL2/CMLSTRING Normal file
View File

@@ -0,0 +1,567 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "18-Oct-93 15:18:00" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLSTRING.;2" 30461
previous date%: "29-Aug-91 22:57:51" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLSTRING.;1")
(* ; "
Copyright (c) 1985, 1986, 1987, 1990, 1991, 1993 by Venue & Xerox Corporation. All rights reserved.
")
(PRETTYCOMPRINT CMLSTRINGCOMS)
(RPAQQ CMLSTRINGCOMS
(
(* ;; "run-time support ")
(FUNCTIONS LISP::SIMPLE-STRING= LISP::SIMPLE-STRING-EQUAL)
(FUNCTIONS %%STRING-BASE-COMPARE %%STRING-BASE-COMPARE-EQUAL %%STRING-UPCASE
%%STRING-DOWNCASE)
(* ;; "User entry points ")
(FUNCTIONS LISP:MAKE-STRING LISP:NSTRING-CAPITALIZE LISP:NSTRING-DOWNCASE LISP:NSTRING-UPCASE
STRING LISP:STRING-CAPITALIZE LISP:STRING-DOWNCASE STRING-EQUAL LISP:STRING-GREATERP
LISP:STRING-LEFT-TRIM LISP:STRING-LESSP LISP:STRING-NOT-EQUAL LISP:STRING-NOT-GREATERP
LISP:STRING-NOT-LESSP LISP:STRING-RIGHT-TRIM LISP:STRING-TRIM LISP:STRING-UPCASE
LISP:STRING/= LISP:STRING< LISP:STRING<= LISP:STRING= LISP:STRING> LISP:STRING>=)
(OPTIMIZERS LISP:STRING= STRING-EQUAL)
(* ;; "Internal macros ")
(DECLARE%: DONTCOPY DOEVAL@COMPILE (FUNCTIONS WITH-ONE-STRING WITH-ONE-STRING-ONLY
WITH-STRING WITH-TWO-UNPACKED-STRINGS
%%UNPACK-STRING %%ADJUST-FOR-OFFSET %%CHECK-BOUNDS
%%PARSE-STRING-ARGS %%STRING-LENGTH))
(* ;; "Compiler options")
(PROP FILETYPE CMLSTRING)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY (LOCALVARS . T))))
(* ;; "run-time support ")
(LISP:DEFUN LISP::SIMPLE-STRING= (STRING1 STRING2)
[LET ((END1 (%%STRING-LENGTH STRING1))
(END2 (%%STRING-LENGTH STRING2)))
(LISP:IF (EQ END1 END2)
(LET (BASE1 BASE2 OFFSET1 OFFSET2 TYPENUMBER1 TYPENUMBER2)
(%%UNPACK-STRING STRING1 BASE1 OFFSET1 TYPENUMBER1)
(%%UNPACK-STRING STRING2 BASE2 OFFSET2 TYPENUMBER2)
(LISP:IF (NOT (EQ 0 OFFSET1))
(SETQ END1 (+ END1 OFFSET1)))
(LISP:IF (NOT (EQ 0 OFFSET2))
(SETQ END2 (+ END2 OFFSET2)))
(EQ END1 (%%STRING-BASE-COMPARE BASE1 TYPENUMBER1 BASE2 TYPENUMBER2 OFFSET1 END1
OFFSET2 END2))))])
(LISP:DEFUN LISP::SIMPLE-STRING-EQUAL (STRING1 STRING2)
[LET ((END1 (%%STRING-LENGTH STRING1))
(END2 (%%STRING-LENGTH STRING2)))
(LISP:IF (EQ END1 END2)
(LET (BASE1 BASE2 OFFSET1 OFFSET2 TYPENUMBER1 TYPENUMBER2)
(%%UNPACK-STRING STRING1 BASE1 OFFSET1 TYPENUMBER1)
(%%UNPACK-STRING STRING2 BASE2 OFFSET2 TYPENUMBER2)
(LISP:IF (NOT (EQ 0 OFFSET1))
(SETQ END1 (+ END1 OFFSET1)))
(LISP:IF (NOT (EQ 0 OFFSET2))
(SETQ END2 (+ END2 OFFSET2)))
(EQ END1 (%%STRING-BASE-COMPARE-EQUAL BASE1 TYPENUMBER1 BASE2 TYPENUMBER2
OFFSET1 END1 OFFSET2 END2))))])
(LISP:DEFUN %%STRING-BASE-COMPARE (BASE1 TYPENUMBER1 BASE2 TYPENUMBER2 START1 END1 START2 END2)
(* ;; "Return index into base1 of first inequality ")
(* ;; "Can use eq for character comparisons because they are immediate datatypes. Can use eq for numeric equality since Indices are always in the fixnum range")
(LISP:IF (EQ START1 START2)
(LISP:DO ((INDEX START1 (LISP:1+ INDEX))
(ENDINDEX (MIN END1 END2)))
([OR (EQ INDEX ENDINDEX)
(NOT (EQ (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 INDEX]
INDEX))
(LISP:DO [(INDEX1 START1 (LISP:1+ INDEX1))
(INDEX2 START2 (LISP:1+ INDEX2))
(ENDINDEX (MIN END1 (+ START1 (- END2 START2]
([OR (EQ INDEX1 ENDINDEX)
(NOT (EQ (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX1)
(%%ARRAY-READ BASE2 TYPENUMBER2 INDEX2]
INDEX1))))
(LISP:DEFUN %%STRING-BASE-COMPARE-EQUAL (BASE1 TYPENUMBER1 BASE2 TYPENUMBER2 START1 END1 START2
END2)
(* ;; "Return index into base1 of first case insensitive inequality ")
(* ;; "Can use eq for character comparisons because they are immediate datatypes. ")
(* ;; "Char-upcase has been expanded out and simplified below.")
(LISP:IF (EQ START1 START2)
(LISP:DO ((INDEX START1 (LISP:1+ INDEX))
(ENDINDEX (MIN END1 END2)))
([OR (EQ INDEX ENDINDEX)
(NOT (EQ (%%CHAR-UPCASE-CODE (\LOLOC (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)))
(%%CHAR-UPCASE-CODE (\LOLOC (%%ARRAY-READ BASE2 TYPENUMBER2 INDEX]
INDEX))
(LISP:DO [(INDEX1 START1 (LISP:1+ INDEX1))
(INDEX2 START2 (LISP:1+ INDEX2))
(ENDINDEX (MIN END1 (+ START1 (- END2 START2]
([OR (EQ INDEX1 ENDINDEX)
(NOT (EQ (%%CHAR-UPCASE-CODE (\LOLOC (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX1)))
(%%CHAR-UPCASE-CODE (\LOLOC (%%ARRAY-READ BASE2 TYPENUMBER2 INDEX2]
INDEX1))))
(LISP:DEFUN %%STRING-UPCASE (STRING START END)
(* ;; "Assumes string is a string. Start and end define a subsequence. Destructively upcases string and returns it ")
(LET ((BASE (%%ARRAY-BASE STRING))
(OFFSET (%%ARRAY-OFFSET STRING))
(TYPENUMBER (%%ARRAY-TYPE-NUMBER STRING)))
(%%ADJUST-FOR-OFFSET START END OFFSET)
(LISP:DO ((INDEX START (LISP:1+ INDEX)))
((EQ INDEX END)
STRING)
(%%ARRAY-WRITE (LISP:CHAR-UPCASE (%%ARRAY-READ BASE TYPENUMBER INDEX))
BASE TYPENUMBER INDEX))))
(LISP:DEFUN %%STRING-DOWNCASE (STRING START END)
(* ;; "Assumes string is a string. Start and end define a subsequence. Destructively downcases string and returns it ")
(LET ((BASE (%%ARRAY-BASE STRING))
(OFFSET (%%ARRAY-OFFSET STRING))
(TYPENUMBER (%%ARRAY-TYPE-NUMBER STRING)))
(%%ADJUST-FOR-OFFSET START END OFFSET)
(LISP:DO ((INDEX START (LISP:1+ INDEX)))
((EQ INDEX END)
STRING)
(%%ARRAY-WRITE (LISP:CHAR-DOWNCASE (%%ARRAY-READ BASE TYPENUMBER INDEX))
BASE TYPENUMBER INDEX))))
(* ;; "User entry points ")
(LISP:DEFUN LISP:MAKE-STRING (SIZE &KEY (ELEMENT-TYPE 'LISP:CHARACTER)
(INITIAL-ELEMENT NIL INITIAL-ELEMENT-P)
FATP)
"Makes a simple string"
(LET ((STRING (MAKE-VECTOR SIZE :ELEMENT-TYPE ELEMENT-TYPE :FATP FATP)))
(LISP:IF INITIAL-ELEMENT-P (FILL-ARRAY STRING INITIAL-ELEMENT))
STRING))
(LISP:DEFUN LISP:NSTRING-CAPITALIZE (STRING &KEY START END)
"Given a string, returns it with the first letter of every word in uppercase and all other letters in lowercase. A word is defined to be a sequence of alphanumeric characters delimited by non-alphanumeric characters"
[WITH-ONE-STRING-ONLY STRING START END (LISP:DO ((INDEX START (LISP:1+ INDEX))
(ALPHA-P NIL)
(WAS-ALPHA-P NIL ALPHA-P)
CHAR)
((EQ INDEX END)
STRING)
(SETQ CHAR (LISP:CHAR STRING INDEX))
(SETQ ALPHA-P (LISP:ALPHANUMERICP CHAR))
(LISP:SETF (LISP:CHAR STRING INDEX)
(LISP:IF (AND ALPHA-P (NOT WAS-ALPHA-P))
(LISP:CHAR-UPCASE CHAR)
(LISP:CHAR-DOWNCASE CHAR))))])
(LISP:DEFUN LISP:NSTRING-DOWNCASE (STRING &KEY START END)
"Given a string, returns that string with all uppercase alphabetic characters converted to lowercase."
(WITH-ONE-STRING-ONLY STRING START END (%%STRING-DOWNCASE STRING START END)))
(LISP:DEFUN LISP:NSTRING-UPCASE (STRING &KEY START END)
"Given a string, returns that string with all lower case alphabetic characters converted to uppercase."
(WITH-ONE-STRING-ONLY STRING START END (%%STRING-UPCASE STRING START END)))
(LISP:DEFUN STRING (X)
"Coerces X into a string. If X is a string, X is returned. If X is a symbol, X's pname is returned. If X is a character then a one element string containing that character is returned. If X cannot be coerced into a string, an error occurs."
(LISP:TYPECASE X
(STRING X)
(LISP:SYMBOL (LISP:SYMBOL-NAME X))
(LISP:CHARACTER (LISP:MAKE-STRING 1 :INITIAL-ELEMENT X))
(LISP:OTHERWISE (LISP:ERROR "~S cannot be coerced into a string" X))))
(LISP:DEFUN LISP:STRING-CAPITALIZE (STRING &KEY START END)
"Given a string, returns a new string that is a copy of it with the first letter of every word in uppercase and all other letters in lowercase. A word is defined to be a sequence of alphanumeric characters delimited by non-alphanumeric characters"
(WITH-ONE-STRING STRING START END (LET ((NEW-STRING (LISP:MAKE-STRING SLEN)))
(LISP:DOTIMES (INDEX START)
(LISP:SETF (LISP:SCHAR NEW-STRING INDEX)
(LISP:CHAR STRING INDEX)))
(LISP:DO ((INDEX START (LISP:1+ INDEX))
(ALPHA-P NIL)
(WAS-ALPHA-P NIL ALPHA-P)
CHAR)
((EQ INDEX END))
(SETQ CHAR (LISP:CHAR STRING INDEX))
(SETQ ALPHA-P (LISP:ALPHANUMERICP CHAR))
(LISP:SETF (LISP:SCHAR NEW-STRING INDEX)
(LISP:IF (AND ALPHA-P (NOT WAS-ALPHA-P))
(LISP:CHAR-UPCASE CHAR)
(LISP:CHAR-DOWNCASE CHAR))))
(LISP:DO ((INDEX END (LISP:1+ INDEX)))
((EQ INDEX SLEN))
(LISP:SETF (LISP:SCHAR NEW-STRING INDEX)
(LISP:CHAR STRING INDEX)))
NEW-STRING)))
(LISP:DEFUN LISP:STRING-DOWNCASE (STRING &KEY START END)
"Given a string, returns a new string that is a copy of it with all uppercase case alphabetic characters converted to lowercase."
(WITH-ONE-STRING STRING START END (%%STRING-DOWNCASE (COPY-VECTOR STRING (
 LISP:MAKE-STRING
SLEN))
START END)))
(LISP:DEFUN STRING-EQUAL (STRING1 STRING2 &KEY START1 END1 START2 END2)
"Compare two strings for case insensitive equality"
(LISP:IF (OR START1 END1 START2 END2)
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(LISP:IF (EQ SLEN1 SLEN2)
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(EQ END1 (%%STRING-BASE-COMPARE-EQUAL BASE1 TYPENUMBER1 BASE2
TYPENUMBER2 START1 END1 START2 END2))))]
(LISP::SIMPLE-STRING-EQUAL STRING1 STRING2)))
(LISP:DEFUN LISP:STRING-GREATERP (STRING1 STRING2 &KEY START1 END1 START2 END2)
"Case insensitive version of STRING>"
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET* ((INDEX (%%STRING-BASE-COMPARE-EQUAL BASE1 TYPENUMBER1 BASE2 TYPENUMBER2
START1 END1 START2 END2))
(REL-INDEX (- INDEX START1)))
(COND
((EQ REL-INDEX SLEN2)
(LISP:IF (> SLEN1 SLEN2)
(- INDEX OFFSET1)))
((EQ INDEX END1)
NIL)
((LISP:CHAR-GREATERP (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 (+ START2 REL-INDEX)))
(- INDEX OFFSET1])
(LISP:DEFUN LISP:STRING-LEFT-TRIM (CHAR-BAG STRING)
"Trim only on left"
(WITH-STRING STRING (LET [(LEFT-END (LISP:DO ((INDEX 0 (LISP:1+ INDEX)))
((OR (EQ INDEX SLEN)
(NOT (LISP:FIND (LISP:CHAR STRING INDEX)
CHAR-BAG)))
INDEX))]
(LISP:SUBSEQ STRING LEFT-END SLEN))))
(LISP:DEFUN LISP:STRING-LESSP (STRING1 STRING2 &KEY START1 END1 START2 END2)
"Case insensitive version of STRING<"
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET* ((INDEX (%%STRING-BASE-COMPARE-EQUAL BASE1 TYPENUMBER1 BASE2 TYPENUMBER2
START1 END1 START2 END2))
(REL-INDEX (- INDEX START1)))
(COND
((EQ INDEX END1)
(LISP:IF (< SLEN1 SLEN2)
(- INDEX OFFSET1)))
((EQ (- INDEX START1)
SLEN2)
NIL)
((LISP:CHAR-LESSP (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 (+ START2 REL-INDEX)))
(- INDEX OFFSET1])
(LISP:DEFUN LISP:STRING-NOT-EQUAL (STRING1 STRING2 &KEY START1 END1 START2 END2)
"Compare two string for case insensitive equality"
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET ((INDEX (%%STRING-BASE-COMPARE-EQUAL BASE1 TYPENUMBER1 BASE2 TYPENUMBER2
START1 END1 START2 END2)))
(LISP:IF (AND (EQ INDEX END1)
(EQ SLEN1 SLEN2))
NIL
(- INDEX OFFSET1))])
(LISP:DEFUN LISP:STRING-NOT-GREATERP (STRING1 STRING2 &KEY START1 END1 START2 END2)
"Case insensitive version of STRING<="
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET* ((INDEX (%%STRING-BASE-COMPARE-EQUAL BASE1 TYPENUMBER1 BASE2 TYPENUMBER2
START1 END1 START2 END2))
(REL-INDEX (- INDEX START1)))
(COND
((EQ INDEX END1)
(- INDEX OFFSET1))
((EQ (- INDEX START1)
SLEN2)
NIL)
((LISP:CHAR-NOT-GREATERP (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 (+ START2 REL-INDEX)))
(- INDEX OFFSET1])
(LISP:DEFUN LISP:STRING-NOT-LESSP (STRING1 STRING2 &KEY START1 END1 START2 END2)
"Case insensitive version of STRING>="
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET* ((INDEX (%%STRING-BASE-COMPARE-EQUAL BASE1 TYPENUMBER1 BASE2 TYPENUMBER2
START1 END1 START2 END2))
(REL-INDEX (- INDEX START1)))
(COND
((EQ REL-INDEX SLEN2)
(- INDEX OFFSET1))
((EQ INDEX END1)
NIL)
((LISP:CHAR-NOT-LESSP (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 (+ START2 REL-INDEX)))
(- INDEX OFFSET1])
(LISP:DEFUN LISP:STRING-RIGHT-TRIM (CHAR-BAG STRING)
"Trim only on right"
(WITH-STRING STRING (LET [(RIGHT-END (LISP:DO ((INDEX (LISP:1- SLEN)
(LISP:1- INDEX)))
((OR (< INDEX 0)
(NOT (LISP:FIND (LISP:CHAR STRING INDEX)
CHAR-BAG)))
(LISP:1+ INDEX)))]
(LISP:SUBSEQ STRING 0 RIGHT-END))))
(LISP:DEFUN LISP:STRING-TRIM (CHAR-BAG STRING)
(* ;; "Given a set of characters (a list or string) and a string, returns a copy of the string with the characters in the set removed from both ends.")
(WITH-STRING STRING (LET* [(LEFT-END (LISP:DO ((INDEX 0 (LISP:1+ INDEX)))
((OR (EQ INDEX SLEN)
(NOT (LISP:FIND (LISP:CHAR STRING INDEX)
CHAR-BAG)))
INDEX)))
(RIGHT-END (LISP:DO ((INDEX (LISP:1- SLEN)
(LISP:1- INDEX)))
((OR (< INDEX LEFT-END)
(NOT (LISP:FIND (LISP:CHAR STRING INDEX)
CHAR-BAG)))
(LISP:1+ INDEX)))]
(LISP:SUBSEQ STRING LEFT-END RIGHT-END))))
(LISP:DEFUN LISP:STRING-UPCASE (STRING &KEY START END)
"Given a string, returns a new string that is a copy of it with all lower case alphabetic characters converted to uppercase."
(WITH-ONE-STRING STRING START END (%%STRING-UPCASE (COPY-VECTOR STRING (LISP:MAKE-STRING
SLEN))
START END)))
(LISP:DEFUN LISP:STRING/= (STRING1 STRING2 &KEY START1 END1 START2 END2)
"Compare two strings for case sensitive inequality"
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET ((INDEX (%%STRING-BASE-COMPARE BASE1 TYPENUMBER1 BASE2 TYPENUMBER2 START1
END1 START2 END2)))
(LISP:IF (AND (EQ INDEX END1)
(EQ SLEN1 SLEN2))
NIL
(- INDEX OFFSET1))])
(LISP:DEFUN LISP:STRING< (STRING1 STRING2 &KEY START1 END1 START2 END2)
"A string A is less than a string B if in the first position in which they differ the character of A is less than the corresponding character of B according to char< or if string A is a proper prefix of string B (of shorter length and matching in all the characters of A). Returns either NIL or an index into STRING1"
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET* ((INDEX (%%STRING-BASE-COMPARE BASE1 TYPENUMBER1 BASE2 TYPENUMBER2 START1
END1 START2 END2))
(REL-INDEX (- INDEX START1)))
(COND
((EQ INDEX END1)
(LISP:IF (< SLEN1 SLEN2)
(- INDEX OFFSET1)))
((EQ (- INDEX START1)
SLEN2)
NIL)
((LISP:CHAR< (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 (+ START2 REL-INDEX)))
(- INDEX OFFSET1])
(LISP:DEFUN LISP:STRING<= (STRING1 STRING2 &KEY START1 END1 START2 END2)
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET* ((INDEX (%%STRING-BASE-COMPARE BASE1 TYPENUMBER1 BASE2 TYPENUMBER2 START1
END1 START2 END2))
(REL-INDEX (- INDEX START1)))
(COND
((EQ INDEX END1)
(- INDEX OFFSET1))
((EQ (- INDEX START1)
SLEN2)
NIL)
((LISP:CHAR<= (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 (+ START2 REL-INDEX)))
(- INDEX OFFSET1])
(LISP:DEFUN LISP:STRING= (STRING1 STRING2 &KEY START1 END1 START2 END2)
"Compare two strings for case sensitive equality"
(LISP:IF (OR START1 END1 START2 END2)
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(LISP:IF (EQ SLEN1 SLEN2)
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(EQ END1 (%%STRING-BASE-COMPARE BASE1 TYPENUMBER1 BASE2 TYPENUMBER2
START1 END1 START2 END2))))]
(LISP::SIMPLE-STRING= STRING1 STRING2)))
(LISP:DEFUN LISP:STRING> (STRING1 STRING2 &KEY START1 END1 START2 END2)
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET* ((INDEX (%%STRING-BASE-COMPARE BASE1 TYPENUMBER1 BASE2 TYPENUMBER2 START1
END1 START2 END2))
(REL-INDEX (- INDEX START1)))
(COND
((EQ REL-INDEX SLEN2)
(LISP:IF (> SLEN1 SLEN2)
(- INDEX OFFSET1)))
((EQ INDEX END1)
NIL)
((LISP:CHAR> (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 (+ START2 REL-INDEX)))
(- INDEX OFFSET1])
(LISP:DEFUN LISP:STRING>= (STRING1 STRING2 &KEY START1 END1 START2 END2)
[%%PARSE-STRING-ARGS STRING1 STRING2 START1 END1 START2 END2
(WITH-TWO-UNPACKED-STRINGS STRING1 STRING2 START1 END1 START2 END2
(LET* ((INDEX (%%STRING-BASE-COMPARE BASE1 TYPENUMBER1 BASE2 TYPENUMBER2 START1
END1 START2 END2))
(REL-INDEX (- INDEX START1)))
(COND
((EQ REL-INDEX SLEN2)
(- INDEX OFFSET1))
((EQ INDEX END1)
NIL)
((LISP:CHAR>= (%%ARRAY-READ BASE1 TYPENUMBER1 INDEX)
(%%ARRAY-READ BASE2 TYPENUMBER2 (+ START2 REL-INDEX)))
(- INDEX OFFSET1])
(DEFOPTIMIZER LISP:STRING= (STRING1 STRING2 &REST OPTIONS)
(LISP:IF OPTIONS
'COMPILER:PASS
`(LISP::SIMPLE-STRING= ,STRING1 ,STRING2)))
(DEFOPTIMIZER STRING-EQUAL (STRING1 STRING2 &REST OPTIONS)
(LISP:IF OPTIONS
'COMPILER:PASS
`(LISP::SIMPLE-STRING-EQUAL ,STRING1 ,STRING2)))
(* ;; "Internal macros ")
(DECLARE%: DONTCOPY DOEVAL@COMPILE
(DEFMACRO WITH-ONE-STRING (STRING START END &REST FORMS)
"WITH-ONE-STRING is used to set up string operations. The keywords are parsed, and STRING is coerced into a string. SLEN is bound to the string length"
`(LET [(SLEN (VECTOR-LENGTH (SETQ ,STRING (STRING ,STRING]
(%%CHECK-BOUNDS ,START ,END SLEN)
,@FORMS))
(DEFMACRO WITH-ONE-STRING-ONLY (STRING START END &REST FORMS)
(* ;; "Like WITH-ONE-STRING but only strings allowed")
`(PROGN (LISP:IF (NOT (LISP:STRINGP ,STRING))
(LISP:ERROR 'CONDITIONS:SIMPLE-TYPE-ERROR :EXPECTED-TYPE 'STRING :CULPRIT ,STRING))
(LET [(SLEN (VECTOR-LENGTH ,STRING]
(%%CHECK-BOUNDS ,START ,END SLEN)
,@FORMS)))
(DEFMACRO WITH-STRING (STRING &REST FORMS)
(* ;; "WITH-STRING is like WITH-ONE-STRING, but doesn't process keywords")
`(LET [(SLEN (VECTOR-LENGTH (SETQ ,STRING (STRING ,STRING]
,@FORMS))
(DEFMACRO WITH-TWO-UNPACKED-STRINGS (STRING1 STRING2 START1 END1 START2 END2 &REST FORMS)
(* ;; "Used to set up string comparison operations. String1 and string2 are unpacked and start1, end1, start2, end2 are adjusted for non-zero offsets. Base1 and base2, typenumber1, typenumber2 , offset1 and offset2 are bound to the appropriate unpacked quantities")
`(LET (BASE1 BASE2 OFFSET1 OFFSET2 TYPENUMBER1 TYPENUMBER2)
(%%UNPACK-STRING ,STRING1 BASE1 OFFSET1 TYPENUMBER1)
(%%UNPACK-STRING ,STRING2 BASE2 OFFSET2 TYPENUMBER2)
(%%ADJUST-FOR-OFFSET ,START1 ,END1 OFFSET1)
(%%ADJUST-FOR-OFFSET ,START2 ,END2 OFFSET2)
,@FORMS))
(DEFMACRO %%UNPACK-STRING (OBJECT BASE OFFSET TYPENUMBER &OPTIONAL LENGTH)
`[COND
[(LISP:SYMBOLP ,OBJECT)
(SETQ ,BASE (fetch (LITATOM PNAMEBASE) of ,OBJECT))
(SETQ ,OFFSET 1)
(SETQ ,TYPENUMBER (LISP:IF (fetch (LITATOM FATPNAMEP) of ,OBJECT)
%%FAT-CHAR-TYPENUMBER
%%THIN-CHAR-TYPENUMBER))
,@(LISP:IF LENGTH
`[(SETQ ,LENGTH (fetch (LITATOM PNAMELENGTH) of ,OBJECT])]
(T [COND
[(%%ONED-ARRAY-P ,OBJECT)
(SETQ ,BASE (fetch (ARRAY-HEADER BASE) of ,OBJECT))
(SETQ ,OFFSET (fetch (ARRAY-HEADER OFFSET) of ,OBJECT))
(SETQ ,TYPENUMBER (fetch (ARRAY-HEADER TYPE-NUMBER) of ,OBJECT]
(T (SETQ ,BASE (%%ARRAY-BASE ,OBJECT))
(SETQ ,OFFSET (%%ARRAY-OFFSET ,OBJECT))
(SETQ ,TYPENUMBER (%%ARRAY-TYPE-NUMBER ,OBJECT]
,@(LISP:IF LENGTH
`[(SETQ ,LENGTH (fetch (ARRAY-HEADER FILL-POINTER) of ,OBJECT])])
(DEFMACRO %%ADJUST-FOR-OFFSET (START END OFFSET)
`(LISP:WHEN (NOT (EQ 0 ,OFFSET))
(SETQ ,START (+ ,START ,OFFSET))
(SETQ ,END (+ ,END ,OFFSET))))
(DEFMACRO %%CHECK-BOUNDS (START END LENGTH)
`[PROGN [COND
((NULL ,END)
(SETQ ,END ,LENGTH))
((> ,END ,LENGTH)
(LISP:ERROR "End out of bounds: ~S" ,END]
(COND
((NULL ,START)
(SETQ ,START 0))
((NOT (<= 0 ,START ,END))
(LISP:ERROR "Improper substring bounds: ~s ~s" ,START ,END])
(DEFMACRO %%PARSE-STRING-ARGS (STRING1 STRING2 START1 END1 START2 END2 &REST FORMS)
(* ;; "Used to set up string comparison operations. The keywords are defaulted, bounds are checked and Slen1 and Slen1 are bound to substring lengths%"")
`(LET [(SLEN1 (%%STRING-LENGTH ,STRING1))
(SLEN2 (%%STRING-LENGTH ,STRING2]
(%%CHECK-BOUNDS ,START1 ,END1 SLEN1)
(%%CHECK-BOUNDS ,START2 ,END2 SLEN2)
(SETQ SLEN1 (- ,END1 ,START1))
(SETQ SLEN2 (- ,END2 ,START2))
,@FORMS))
(DEFMACRO %%STRING-LENGTH (STRING)
`(COND
((%%STRINGP ,STRING)
(fetch (ARRAY-HEADER FILL-POINTER) of ,STRING))
((LISP:SYMBOLP ,STRING)
(fetch (LITATOM PNAMELENGTH) of ,STRING))
[(LISP:CHARACTERP ,STRING)
(VECTOR-LENGTH (SETQ ,STRING (STRING ,STRING]
(T (LISP:ERROR 'XCL:TYPE-MISMATCH :EXPECTED-TYPE '(OR STRING LISP:SYMBOL LISP:CHARACTER)
:NAME
,STRING :VALUE ,STRING :MESSAGE "a string, symbol or character"))))
)
(* ;; "Compiler options")
(PUTPROPS CMLSTRING FILETYPE LISP:COMPILE-FILE)
(DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY
(DECLARE%: DOEVAL@COMPILE DONTCOPY
(LOCALVARS . T)
)
)
(PUTPROPS CMLSTRING COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1990 1991 1993))
(DECLARE%: DONTCOPY
(FILEMAP (NIL)))
STOP

BIN
CLTL2/CMLSTRING.LCOM Normal file

Binary file not shown.

280
CLTL2/CMLTIME Normal file
View File

@@ -0,0 +1,280 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10)
(FILECREATED "18-Oct-93 15:20:26" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLTIME.;2" 15445
|previous| |date:| " 3-Sep-91 17:50:39" "{Pele:mv:envos}<LispCore>Sources>CLTL2>CMLTIME.;1")
; Copyright (c) 1986, 1987, 1990, 1991, 1993 by Venue & Xerox Corporation. All rights reserved.
(PRETTYCOMPRINT CMLTIMECOMS)
(RPAQQ CMLTIMECOMS
(
(* |;;;| "Common Lisp Time Functions")
(FUNCTIONS %CONVERT-INTERNAL-TIME-TO-CLUT)
(CONSTANTS (LISP:INTERNAL-TIME-UNITS-PER-SECOND 1000))
(FNS LISP:GET-INTERNAL-REAL-TIME LISP:GET-INTERNAL-RUN-TIME LISP:GET-UNIVERSAL-TIME
LISP:GET-DECODED-TIME LISP:DECODE-UNIVERSAL-TIME LISP:ENCODE-UNIVERSAL-TIME LISP:SLEEP)
(PROP FILETYPE CMLTIME)
(DECLARE\: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDVARS (NLAMA)
(NLAML)
(LAMA LISP:SLEEP LISP:ENCODE-UNIVERSAL-TIME LISP:DECODE-UNIVERSAL-TIME
LISP:GET-DECODED-TIME LISP:GET-UNIVERSAL-TIME LISP:GET-INTERNAL-RUN-TIME)
))))
(* |;;;| "Common Lisp Time Functions")
(DEFMACRO %CONVERT-INTERNAL-TIME-TO-CLUT (TIME)
(* |;;| "Converts from Interlisp-D internal time format to Common Lisp Universal Time")
`(+ ,TIME (LISP:* 365 24 60 60)
MAX.FIXP 1))
(DECLARE\: EVAL@COMPILE
(RPAQQ LISP:INTERNAL-TIME-UNITS-PER-SECOND 1000)
(CONSTANTS (LISP:INTERNAL-TIME-UNITS-PER-SECOND 1000))
)
(DEFINEQ
(LISP:GET-INTERNAL-REAL-TIME
(LAMBDA NIL (* |hdj| "18-Jul-86 12:05")
(* |;;;| "The current time is returned as a single integer in Internal Time format. (Internal Time format = time in milliseconds for us.) This time is relative to an arbitrary time base, but the difference between the values of two calls to this function will be the amount of elapsed real time between the two calls, measured in the units defined by INTERNAL-TIME-UNITS-PER-SECOND")
(CLOCK 0)))
(LISP:GET-INTERNAL-RUN-TIME
(LISP:LAMBDA NIL (* |hdj| "18-Jul-86 12:06")
(* |;;;| "The current run time is returned as a single integer in Internal Time format. (Internal Time format = time in milliseconds for us.) The precise meaning of this quantity is implementation-dependent; it may measure real time, run time, CPU cycles, or some other quantity. The intent is that the difference between the values of two calls to this function be the amount of time between the two calls during which the computational effort was expended on behalf of the executing program.")
(CLOCK 2)))
(LISP:GET-UNIVERSAL-TIME
(LISP:LAMBDA NIL (* |hdj| "18-Jul-86 12:02")
(* |;;;| "The current time of day is returned as a single integer in Universal Time format.")
(%CONVERT-INTERNAL-TIME-TO-CLUT (DAYTIME))))
(LISP:GET-DECODED-TIME
(LISP:LAMBDA NIL (* |hdj| "18-Jul-86 12:08")
(* |;;;| "The current time is returned in Decoded Time format. Nine values are returned: SECOND, MINUTE, HOUR, DATE, MONTH, YEAR, DAY-OF-WEEK, DAYLIGHT-SAVING-TIME-P, and TIME-ZONE.")
(LISP:DECODE-UNIVERSAL-TIME (LISP:GET-UNIVERSAL-TIME))))
(LISP:DECODE-UNIVERSAL-TIME
(LISP:LAMBDA (UNIVERSAL-TIME &OPTIONAL (TIME-ZONE |\\TimeZoneComp| TIME-ZONE-SUPPLIEDP))
(* |kbr:| " 7-Aug-86 10:21")
(* |;;;| "The time specified by UNIVERSAL-TIME in Universal Time format is converted to Decoded Time format. Nine values are returned: SECOND, MINUTE, HOUR, DATE, MONTH, YEAR, DAY-OF-WEEK, DAYLIGHT-SAVING-TIME-P, and TIME-ZONE.")
(PROG (CHECKDLS TIME MONTH SEC HR TOTALDAYS DAYS LEAP400 LEAP100 LEAP4 YEAR YDAY WDAY MIN
DLS)
(* |;;| "Page 446 of the silver book: If you don't specify TIME-ZONE it defaults to the current time zone adjusted for daylight savings time. If you provide TIME-ZONE explicitly, no adjustment for daylight savings time is is performed.")
(SETQ CHECKDLS (AND (NOT TIME-ZONE-SUPPLIEDP)
|\\DayLightSavings|))
(LISP:MULTIPLE-VALUE-SETQ (TIME SEC)
(LISP:FLOOR UNIVERSAL-TIME 60))
(LISP:MULTIPLE-VALUE-SETQ (TIME MIN)
(LISP:FLOOR TIME 60))
(LISP:MULTIPLE-VALUE-SETQ (TOTALDAYS HR)
(LISP:FLOOR (- TIME TIME-ZONE)
24))
DTLOOP
(* |;;| "LEAP400 = number of 400 year blocks till Jan 1, 2000 Note: The algorithm still works correctly for dates after Jan 1, 2000 . LEAP400 will be negative but not wrong. (Any Jan 1 a year a multiple of 400 would do nicely. Jan 1, 2000 just happens to be close by.)")
(LISP:MULTIPLE-VALUE-SETQ (LEAP400 DAYS)
(LISP:FLOOR (- 36524 TOTALDAYS)
(+ 36525 (LISP:* 3 36524)))) (* \;
 "LEAP100 = number of 100 year blocks till the 400 year blocks.")
(LISP:MULTIPLE-VALUE-SETQ (LEAP100 DAYS)
(LISP:FLOOR DAYS 36524)) (* \;
 "LEAP4 = number of 4 year blocks till the 100 year blocks.")
(LISP:MULTIPLE-VALUE-SETQ (LEAP4 DAYS)
(LISP:FLOOR DAYS (+ 366 (LISP:* 3 365))))
(* |;;| "Date of answer will be (+ (* 146097 LEAP400) (* 36524 LEAP100) (* 1461 LEAP4) DAYS) days before Jan 1, 2000")
(SETQ YEAR (- 2000 (LISP:* 400 LEAP400)
(LISP:* 100 LEAP100)
(LISP:* 4 LEAP4)
(CDR (\\DTSCAN DAYS '((1096 . 4)
(731 . 3)
(366 . 2)
(1 . 1)
(0 . 0))))))
(* |;;| "YDAY is the ordinal of day as it would appear in a leap year. We thus have Jan 1 = day 0, Feb 29 = day 59, Mar 1 = day 60, and Dec 31 = day 365.")
(SETQ YDAY (- (CDR (\\DTSCAN DAYS (COND
((AND (EQ (LISP:MOD YEAR 100)
0)
(NOT (EQ (LISP:MOD YEAR 400)
0)))
'((1402 . 1460)
(1096 . 1461)
(1037 . 1095)
(731 . 1096)
(672 . 730)
(366 . 731)
(307 . 365)
(1 . 366)
(0 . 0)))
(T '((1096 . 1461)
(1037 . 1095)
(731 . 1096)
(672 . 730)
(366 . 731)
(307 . 365)
(1 . 366)
(0 . 0))))))
DAYS))
(SETQ WDAY (LISP:MOD TOTALDAYS 7))
(COND
((AND CHECKDLS (SETQ DLS (\\ISDST? YDAY HR WDAY)))
(* |;;| "This date is during daylight savings, so add 1 hour. Third arg is day of the week, which we determine by taking days mod 7 plus offset. Monday = zero in this scheme. Jan 1 1900 was a Monday=0 so offset is 0")
(COND
((> (SETQ HR (LISP:1+ HR))
23)
(* |;;| "overflowed into the next day. This case is too hard (we might have overflowed the month, for example), so just go back and recompute")
(SETQ TOTALDAYS (LISP:1+ TOTALDAYS))
(SETQ HR 0)
(SETQ CHECKDLS NIL)
(GO DTLOOP)))))
(SETQ MONTH (\\DTSCAN YDAY '((335 . 12)
(305 . 11)
(274 . 10)
(244 . 9)
(213 . 8)
(182 . 7)
(152 . 6)
(121 . 5)
(91 . 4)
(60 . 3)
(31 . 2)
(0 . 1)))) (* \;
 "Now return (SECOND MINUTE HOUR DAY MONTH YEAR WEEKDAY DAYLIGHT ZONE)")
(RETURN (LISP:VALUES SEC MIN HR (LISP:1+ (- YDAY (CAR MONTH)))
(CDR MONTH)
YEAR WDAY DLS TIME-ZONE)))))
(LISP:ENCODE-UNIVERSAL-TIME
(LISP:LAMBDA (SECOND MINUTE HOUR DATE MONTH YEAR &OPTIONAL TIME-ZONE)
(* \; "Edited 27-Oct-87 19:11 by bvm:")
(* |;;;| "The time specified by the given components of Decoded Time format is encoded into Universal Time format and returned. If you don't specify TIME-ZONE, it defaults to the current time zone adjusted for daylight saving time. If you provide TIME-ZONE explicitly, no adjustment for daylight saving time is performed.")
(PROG (YDAY DAYSSINCEDAY0)
(* |;;| "From pages 444 and 445 of the silver book and Lucid testing, here are three examples of ENCODE-UNIVERSAL-TIME usage known to be correct and which should be rechecked by anyone who edits this function: (ENCODE-UNIVERSAL-TIME 1 0 0 1 1 1900 0) = 1 (ENCODE-UNIVERSAL-TIME 1 0 0 1 1 1976 0) = 2398291201 (ENCODE-UNIVERSAL-TIME 0 0 0 1 1 3000 0) = 34712668800")
(* |;;|
 "If the YEAR is between 0 and 99 we have to figure out what the `obvious' year is.")
(SETQ YEAR (LISP:IF (< YEAR 100)
(LISP:MULTIPLE-VALUE-BIND
(SEC MIN HOUR DAY MONTH NOW-YEAR)
(LISP:GET-DECODED-TIME)
(DECLARE (IGNORE SEC MIN HOUR DAY MONTH))
(LISP:DO ((Y (+ YEAR (LISP:* 100 (LISP:1- (LISP:TRUNCATE NOW-YEAR 100)
)))
(+ Y 100)))
((<= (ABS (- Y NOW-YEAR))
50)
Y)))
YEAR))
(SETQ YDAY (+ (SELECTQ MONTH
(1 0)
(2 31)
(3 59)
(4 90)
(5 120)
(6 151)
(7 181)
(8 212)
(9 243)
(10 273)
(11 304)
(12 334)
NIL)
(SUB1 DATE)))
(SETQ DAYSSINCEDAY0 (+ YDAY (TIMES 365 (SETQ YEAR (IDIFFERENCE YEAR 1900)))
(IQUOTIENT (SUB1 YEAR)
4)))
(|if| (> MONTH 2)
|then| (* \; "After February 28")
(|add| YDAY 1) (* \;
 "Day-of-year is based on 366-day year")
(|if| (AND (EQ 0 (IREMAINDER YEAR 4))
(OR (NOT (EQ (IREMAINDER YEAR 100)
0))
(EQ (IREMAINDER YEAR 400)
0)))
|then| (* \;
 "It is a leap year, so real day count also incremented")
(|add| DAYSSINCEDAY0 1)))
(* |;;| "This is almost right - now correct for 100/400 leap year rule. 1900 is magically handled by above formula, and 2000 is a leap year, so we only need to do this for years after 2100.")
(FOR I FROM 200 TO YEAR BY 100
UNLESS (OR (= I YEAR)
(EQ (IREMAINDER I 400)
100)) DO (LISP:DECF DAYSSINCEDAY0))
(SETQ HOUR (+ HOUR (TIMES 24 DAYSSINCEDAY0)
(COND
(TIME-ZONE TIME-ZONE)
((AND |\\DayLightSavings| (\\ISDST? YDAY HOUR (IREMAINDER
DAYSSINCEDAY0 7)
))
(* |;;| "Subtract one to go from daylight to standard time. Weekday argument (IREMAINDER DAYSSINCEDAY0 7) to \\ISDST? is based on day 0 = Jan 1, 1900, which was a Monday = 0")
(SUB1 |\\TimeZoneComp|))
(T |\\TimeZoneComp|))))
(RETURN (+ SECOND (TIMES 60 (+ MINUTE (TIMES 60 HOUR))))))))
(LISP:SLEEP
(LISP:LAMBDA (LISP::SECONDS) (* \; "Edited 24-Apr-87 15:28 by jrb:")
(* |;;;| "(SLEEP N) causes execution to cease and become dormant for approximately N seconds of real time, whereupon execution is resumed. The argument may be any non-negative non-complex number. SLEEP returns NIL.")
(DISMISS (ROUND (LISP:* LISP::SECONDS 1000)))
NIL))
)
(PUTPROPS CMLTIME FILETYPE LISP:COMPILE-FILE)
(DECLARE\: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS
(ADDTOVAR NLAMA )
(ADDTOVAR NLAML )
(ADDTOVAR LAMA LISP:SLEEP LISP:ENCODE-UNIVERSAL-TIME LISP:DECODE-UNIVERSAL-TIME
LISP:GET-DECODED-TIME LISP:GET-UNIVERSAL-TIME LISP:GET-INTERNAL-RUN-TIME)
)
(PUTPROPS CMLTIME COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1991 1993))
(DECLARE\: DONTCOPY
(FILEMAP (NIL (1558 14987 (LISP:GET-INTERNAL-REAL-TIME 1568 . 2100) (LISP:GET-INTERNAL-RUN-TIME 2102
. 2752) (LISP:GET-UNIVERSAL-TIME 2754 . 3033) (LISP:GET-DECODED-TIME 3035 . 3419) (
LISP:DECODE-UNIVERSAL-TIME 3421 . 9799) (LISP:ENCODE-UNIVERSAL-TIME 9801 . 14566) (LISP:SLEEP 14568 .
14985)))))
STOP

BIN
CLTL2/CMLTIME.LCOM Normal file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More