From 8f3d5c26b501a2b5281dc1af5f05314968d05146 Mon Sep 17 00:00:00 2001 From: Herb Jellinek Date: Mon, 13 Apr 2026 14:21:07 -0700 Subject: [PATCH 1/2] As discussed in the 4/13/2026 LispCore meeting: This is a new package that allows you to READ symbols in undefined packages such that they will print as if there had not been an error. --- lispusers/BROKEN-ATOMS | 188 +++++++++++++++++++++++++++++++++++ lispusers/BROKEN-ATOMS.DFASL | Bin 0 -> 11451 bytes lispusers/BROKEN-ATOMS.TEdit | Bin 0 -> 2183 bytes 3 files changed, 188 insertions(+) create mode 100644 lispusers/BROKEN-ATOMS create mode 100644 lispusers/BROKEN-ATOMS.DFASL create mode 100644 lispusers/BROKEN-ATOMS.TEdit diff --git a/lispusers/BROKEN-ATOMS b/lispusers/BROKEN-ATOMS new file mode 100644 index 00000000..fc1779ae --- /dev/null +++ b/lispusers/BROKEN-ATOMS @@ -0,0 +1,188 @@ +(DEFINE-FILE-INFO :PACKAGE "INTERLISP" :READTABLE "INTERLISP" :BASE 10) + +(FILECREATED "13-Apr-2026 10:49:10" {PROJECTS}BROKEN-ATOMS.;9 7385 + + :CHANGES-TO (FUNCTIONS WITHOUT-BROKEN-ATOMS TEST-PRETTY-FILE TEST-DEEP-COMPUTATION + CURE-BROKEN-ATOM) + (VARS BROKEN-ATOMSCOMS) + + :PREVIOUS-DATE "18-Feb-2026 16:08:40" {PROJECTS}BROKEN-ATOMS.;3) + + +(PRETTYCOMPRINT BROKEN-ATOMSCOMS) + +(RPAQQ BROKEN-ATOMSCOMS + ( + (* ;; "the representation of a broken atom") + + (RECORDS BROKEN-ATOM) + (FUNCTIONS CURE-BROKEN-ATOM) + + (* ;; "for DEFPRINT") + + (FNS BROKEN-ATOM-PRINTER) + + (* ;; "special form") + + (FUNCTIONS WITHOUT-BROKEN-ATOMS) + + (* ;; "setup") + + (P (DEFPRINT 'BROKEN-ATOM 'BROKEN-ATOM-PRINTER)) + + (* ;; "Debugging/testing") + + (FUNCTIONS TEST-INTERNAL-BA TEST-EXTERNAL-BA TEST-DEEP-COMPUTATION TEST-PRETTY-FILE))) + + + +(* ;; "the representation of a broken atom") + +(DECLARE%: EVAL@COMPILE + +(DATATYPE BROKEN-ATOM ((PACKAGE POINTER) + (NAME POINTER) + (EXTERNAL FLAG))) +) + +(/DECLAREDATATYPE 'BROKEN-ATOM '(POINTER POINTER FLAG) + '((BROKEN-ATOM 0 POINTER) + (BROKEN-ATOM 2 POINTER) + (BROKEN-ATOM 2 (FLAGBITS . 0))) + '4) + +(CL:DEFUN CURE-BROKEN-ATOM (CONDITION) + "Given an XCL:MISSING-EXTERNAL-SYMBOL condition, return a corresponding BROKEN-ATOM" + (COND + ((TYPEP CONDITION 'XCL:MISSING-PACKAGE) (* ; "no such package ") + (create BROKEN-ATOM + PACKAGE _ (XCL:MISSING-PACKAGE-PACKAGE-NAME CONDITION) + NAME _ (XCL:MISSING-PACKAGE-SYMBOL-NAME CONDITION) + EXTERNAL _ (XCL:MISSING-PACKAGE-EXTERNAL CONDITION))) + ((TYPEP CONDITION 'XCL:MISSING-EXTERNAL-SYMBOL) (* ; + "package exists, no such external symbol") + (create BROKEN-ATOM + PACKAGE _ (CL:PACKAGE-NAME (XCL:MISSING-EXTERNAL-SYMBOL-PACKAGE CONDITION)) + NAME _ (XCL:MISSING-EXTERNAL-SYMBOL-NAME CONDITION) + EXTERNAL _ NIL)) + (T (HELP "Don't know how to cure" CONDITION)))) + + + +(* ;; "for DEFPRINT") + +(DEFINEQ + +(BROKEN-ATOM-PRINTER + [LAMBDA (BROKEN-ATOM STREAM) + (CONS (CONCAT (fetch (BROKEN-ATOM PACKAGE) of BROKEN-ATOM) + (if (fetch (BROKEN-ATOM EXTERNAL) of BROKEN-ATOM) + then ":" + else "::") + (fetch (BROKEN-ATOM NAME) of BROKEN-ATOM]) +) + + + +(* ;; "special form") + + +(DEFMACRO WITHOUT-BROKEN-ATOMS (&BODY FORMS) + "Handle any broken-atom errors by producing a BROKEN-ATOM that prints as if the original atom were intact" + `[HANDLER-BIND [[XCL:MISSING-PACKAGE #'(CL:LAMBDA (C) + (CONDITIONS:INVOKE-RESTART + 'CREATE-MISSING-PACKAGE-BA (CURE-BROKEN-ATOM + C] + (XCL:MISSING-EXTERNAL-SYMBOL #'(CL:LAMBDA (C) + (CONDITIONS:INVOKE-RESTART + 'CREATE-EXTERNAL-BA (CURE-BROKEN-ATOM + C] + (CONDITIONS:RESTART-BIND [(CREATE-MISSING-PACKAGE-BA #'(CL:LAMBDA (V) + (RETFROM + #' + RESOLVE-MISSING-PACKAGE + V) + V)) + (CREATE-EXTERNAL-BA #'(CL:LAMBDA (V) + (RETFROM + #' + RESOLVE-MISSING-EXTERNAL-SYMBOL + V) + V] + (PROGN ,@FORMS]) + + + +(* ;; "setup") + + +(DEFPRINT 'BROKEN-ATOM 'BROKEN-ATOM-PRINTER) + + + +(* ;; "Debugging/testing") + + +(CL:DEFUN TEST-INTERNAL-BA () + [LET ((FILE NIL)) + (CL:WITH-OPEN-STREAM (OUT (OPENSTREAM "{nodircore}" 'OUTPUT)) + (SETQ FILE OUT) + (PRINTOUT OUT "BROKEN::INTERNAL-ATOM" T)) + (CL:WITH-OPEN-STREAM (IN (OPENSTREAM FILE 'INPUT)) + (WITHOUT-BROKEN-ATOMS (RATOM IN]) + +(CL:DEFUN TEST-EXTERNAL-BA () + [LET ((FILE NIL)) + (CL:WITH-OPEN-STREAM (OUT (OPENSTREAM "{nodircore}" 'OUTPUT)) + (SETQ FILE OUT) + (PRINTOUT OUT "BROKEN:EXTERNAL-ATOM" T)) + (CL:WITH-OPEN-STREAM (IN (OPENSTREAM FILE 'INPUT)) + (WITHOUT-BROKEN-ATOMS (RATOM IN]) + +(CL:DEFUN TEST-DEEP-COMPUTATION () + "Test that we can handle internal calls to READ that encounter broken atoms" + + (* ;; "make sure it works when there's no error") + + (LET [(RESULT (WITHOUT-BROKEN-ATOMS (CL:LOOP :FOR X :FROM 0 :TO 9 :COLLECT X] + (PRINTOUT T "No error loop result: " RESULT T)) + + (* ;; "and when reading legit atoms") + + (LET [(RESULT (WITHOUT-BROKEN-ATOMS (CL:LOOP :FOR X :FROM 0 :TO 9 :COLLECT (CL:READ-FROM-STRING + (CONCAT "IL:ATOM" X] + (PRINTOUT T "No error read loop result: " RESULT T)) + + (* ;; "test XCL:MISSING-PACKAGE.") + + (COND + ((CL:FIND-PACKAGE :BROKEN) + (DELETE-PACKAGE :BROKEN))) + (LET [(RESULT (WITHOUT-BROKEN-ATOMS (CL:LOOP :FOR X :FROM 0 :TO 9 :COLLECT (CL:READ-FROM-STRING + (CONCAT "BROKEN:ATOM" + X] + (PRINTOUT T "No such package loop result: " RESULT T)) + + (* ;; "test XCL:MISSING-EXTERNAL-SYMBOL") + + (CL:UNWIND-PROTECT + (PROGN (CL:MAKE-PACKAGE :BROKEN) + (LET [(RESULT (WITHOUT-BROKEN-ATOMS (CL:LOOP :FOR X :FROM 0 :TO 9 :COLLECT + (CL:READ-FROM-STRING (CONCAT "BROKEN:ATOM" X + ] + (PRINTOUT T "Not external symbol loop result: " RESULT T))) + [COND + ((CL:FIND-PACKAGE :BROKEN) + (DELETE-PACKAGE 'BROKEN])) + +(CL:DEFUN TEST-PRETTY-FILE (SOURCE-FILE-NAME OUTPUT-FILE-NAME OUTPUT-TYPE) + "Prettyprint a Lisp source file to an imagestream file" + (CL:WITH-OPEN-STREAM (OUTPUT-STREAM (OPENIMAGESTREAM OUTPUT-FILE-NAME OUTPUT-TYPE)) + (WITHOUT-BROKEN-ATOMS (PRETTYFILEINDEX SOURCE-FILE-NAME NIL OUTPUT-STREAM T)) + (FULLNAME OUTPUT-STREAM))) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (1402 2314 (CURE-BROKEN-ATOM 1402 . 2314)) (2345 2698 (BROKEN-ATOM-PRINTER 2355 . 2696)) + (2730 4575 (WITHOUT-BROKEN-ATOMS 2730 . 4575)) (4681 5009 (TEST-INTERNAL-BA 4681 . 5009)) (5011 5338 +(TEST-EXTERNAL-BA 5011 . 5338)) (5340 7007 (TEST-DEEP-COMPUTATION 5340 . 7007)) (7009 7362 ( +TEST-PRETTY-FILE 7009 . 7362))))) +STOP diff --git a/lispusers/BROKEN-ATOMS.DFASL b/lispusers/BROKEN-ATOMS.DFASL new file mode 100644 index 0000000000000000000000000000000000000000..99aa84e8b24ed50f4870b0f31dce57415bfc3ee0 GIT binary patch literal 11451 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 literal 0 HcmV?d00001 From 93b09dec6640557a845332b8e17aeff444a42d61 Mon Sep 17 00:00:00 2001 From: Herb Jellinek Date: Tue, 14 Apr 2026 12:16:13 -0700 Subject: [PATCH 2/2] My last-minute change from QUOTE to FUNCTION inadvertently invoked CL:FUNCTION instead, and RETFROM doesn't want a function object. Updated to use IL:FUNCTION. --- lispusers/BROKEN-ATOMS | 25 ++++++++++++------------- lispusers/BROKEN-ATOMS.DFASL | Bin 11451 -> 11283 bytes 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/lispusers/BROKEN-ATOMS b/lispusers/BROKEN-ATOMS index fc1779ae..a6f211aa 100644 --- a/lispusers/BROKEN-ATOMS +++ b/lispusers/BROKEN-ATOMS @@ -1,6 +1,6 @@ (DEFINE-FILE-INFO :PACKAGE "INTERLISP" :READTABLE "INTERLISP" :BASE 10) -(FILECREATED "13-Apr-2026 10:49:10" {PROJECTS}BROKEN-ATOMS.;9 7385 +(FILECREATED "14-Apr-2026 12:14:44" {PROJECTS}BROKEN-ATOMS.;10 7207 :CHANGES-TO (FUNCTIONS WITHOUT-BROKEN-ATOMS TEST-PRETTY-FILE TEST-DEEP-COMPUTATION CURE-BROKEN-ATOM) @@ -97,16 +97,15 @@ (CONDITIONS:INVOKE-RESTART 'CREATE-EXTERNAL-BA (CURE-BROKEN-ATOM C] - (CONDITIONS:RESTART-BIND [(CREATE-MISSING-PACKAGE-BA #'(CL:LAMBDA (V) - (RETFROM - #' - RESOLVE-MISSING-PACKAGE - V) - V)) + (CONDITIONS:RESTART-BIND [(CREATE-MISSING-PACKAGE-BA + #'(CL:LAMBDA (V) + (RETFROM (FUNCTION RESOLVE-MISSING-PACKAGE) + V) + V)) (CREATE-EXTERNAL-BA #'(CL:LAMBDA (V) - (RETFROM - #' + (RETFROM (FUNCTION RESOLVE-MISSING-EXTERNAL-SYMBOL + ) V) V] (PROGN ,@FORMS]) @@ -181,8 +180,8 @@ (WITHOUT-BROKEN-ATOMS (PRETTYFILEINDEX SOURCE-FILE-NAME NIL OUTPUT-STREAM T)) (FULLNAME OUTPUT-STREAM))) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1402 2314 (CURE-BROKEN-ATOM 1402 . 2314)) (2345 2698 (BROKEN-ATOM-PRINTER 2355 . 2696)) - (2730 4575 (WITHOUT-BROKEN-ATOMS 2730 . 4575)) (4681 5009 (TEST-INTERNAL-BA 4681 . 5009)) (5011 5338 -(TEST-EXTERNAL-BA 5011 . 5338)) (5340 7007 (TEST-DEEP-COMPUTATION 5340 . 7007)) (7009 7362 ( -TEST-PRETTY-FILE 7009 . 7362))))) + (FILEMAP (NIL (1403 2315 (CURE-BROKEN-ATOM 1403 . 2315)) (2346 2699 (BROKEN-ATOM-PRINTER 2356 . 2697)) + (2731 4397 (WITHOUT-BROKEN-ATOMS 2731 . 4397)) (4503 4831 (TEST-INTERNAL-BA 4503 . 4831)) (4833 5160 +(TEST-EXTERNAL-BA 4833 . 5160)) (5162 6829 (TEST-DEEP-COMPUTATION 5162 . 6829)) (6831 7184 ( +TEST-PRETTY-FILE 6831 . 7184))))) STOP diff --git a/lispusers/BROKEN-ATOMS.DFASL b/lispusers/BROKEN-ATOMS.DFASL index 99aa84e8b24ed50f4870b0f31dce57415bfc3ee0..05926d41fad16645c2dddb975c35d87721f654c8 100644 GIT binary patch delta 2760 zcmd6oUrbw79LLW&m;bPpiNFK`mjN>yRNAiD%BHfWDQuxD&FChz#!xrr5R`>U#&n~h zl9?>&-vZo z`JUhT{q8*{?&H1Fu2;>bqMqT=kyHKZnSr5x_0&jz;O+j?s@ZC^pBph+OqTts*>ccq zJ!rKSb=Z4ce+~1F_Mbl;xY(k{t9tyvkSb>A!_<^d@BXAztRry;{oKgN=$zf(Q@#<|J8s|gX{O$)ABGci59;eIc@OB>`kuq=U zz8tsxm@|O!q911I1kAEiQx1bx4#6b$Yhz|ml9z8cGQ;b9w#-^LuV*TLVS1A0YnP}@ z`wAiM$PFT6${vpypJ{Hd&A1(`1jiLSu@ii{DEPB&hwg5Z(WQLBG*ex z758{tM;%V1rR_i)pDOL8^D`|K{84GFa<&pn%raTTdrx6_pMSaI$6%C6nK?xkJ6%b{ z#1yviGB!)D=+oDT{7m2ia6#Za@NUjB=rlK`P1HZ%XC z+_Toxx|pk?R%wf}eAHo%<-tZ-ZfY!d8f8R|mBN%Ql5za@Grc8oy$nniGS2g>2H~K` z5fSI(Rn5WpfE*kWkvG74&j_0aik7jfK+!Vxj;07R3eSqbbHIeaLExmoGr*+4mx0jq z0-@;!E{8hxh!>@38(a{z0wLO}jR}>#@IY|8=F>g&k>(fXcRX0-!_|#Ju?U@jLo7ny z1&YM!Al9HVFR=!dRS|2@R}d!>r!N7;I#NxlZND05yqiP3V0rr1F% z&%-1RXk!*oGV@s|gsjFM*6gO<%uADcnUvJag(xe2YgHYS&>7ap{*f(y8r!-(f7|fWgdE5)#GvFdVTbmNNbd%a$SRHc+;=(k5ZfOQF znx&cGiLA%CUHFq2(c-AdSPQh=m~2c%Sor?|I(m zyzlp&w`?%(n{`q9oV&`|W;M=@TWu}24s&bE;dcAs)|R4fW58uTGdwzEetvu?@XF9> zbKlEjrvpx6$VeU>*0vtek*Zb#nbE(Ap80 zLY{1v|M8C`0eZuYV9_x2g zb)Gi}afjzg+U5uUycs#Z67d%a+0QC0yV>1FOYK&aL!^+UxsuOqDb^W6$~Gc*W{70( zl?~G<%PIHnU(yIsQa0m?2RyE04yV;-w;f^=<%1&fZu#x%g=(Z(&{WkwdjQMN*%uYx z1S6W_SkzT_HcO9~C0+aL9BnPRQvDr7-jwhb;If2Y0^XAFBf!{MWp+x}HQ@L(2@-M@ zctyJB09Pfv#PthUtxdorHd>8UG5~Y`jjrOpJnmOVUC)sTE~9z50;$$FZB{YWdSsB@ zlhOZCx9?SY(8DU$wW~8r$L(x>mx?|Z-B(qk+ap>&v@dFTun{dcwN__}Xhf~`!jvsi zaqRq_!IGFbwx-G)V_)wXfrB1LM2xxjHU(qDYH>tH&I5~%5^WYxHdMO|C>yH1#&v04 zg=bB|bASm6M*wFeJOh}N@EJgGdI7=d23(!)5fP6oQafBAZ3hHtGoO?!jqrf5l>3B- z{>J^%{DKGTtjlBx$|Up>95M-g9Z(9VBgjFOE}4U>s>mGl6yl_C`ZS=-Lwf!C4 z7a%yB6{nIWI8B7s<0(kZ5Kc|-B-yW~-NAK1ORmEqX-ODR(vo)o@zG3k{UTOtlQ4<% zFf(H?$>(6=O7qG|tX8|ZZUC)43X?d*Cv8BzpNl(38*s_%S zH}^%my+{_P7?JY6pc>#ZtEhP_7*kqf^2#mgGkTp?kKyPwdYqN=ke?tDNB;m2M}Hp> zM-QQ*Fm&i0=LKS326(l(dXIwRN2>yF zjVpazWW6(d+n5lI8~1+J39)x0GUJ4J%j_3-#&_nkn@Zia_U3H2o2Z!9lcrYeNzYJ%@>X(3#sd&+!>K8TfDN=OgAB^sU9eMH-xrhB2-M0ak+0O^sf|*D4zc#5& XnMbwI`@f#ljjXk)AvLYXnm+y=#XdeZ