From c011ceea027a9caa9433b6867b6ab5ee28c2da4f Mon Sep 17 00:00:00 2001 From: Jade Sailor Date: Fri, 6 Mar 2026 09:50:33 -0500 Subject: [PATCH 1/2] mzscheme: use relative paths for package-local requires (easy) So that editing the files uses the versions of the files next to the files being edited instead of the ones from the running Racket --- compatibility-lib/mzscheme/main.rkt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compatibility-lib/mzscheme/main.rkt b/compatibility-lib/mzscheme/main.rkt index 868c5d2..43872bc 100644 --- a/compatibility-lib/mzscheme/main.rkt +++ b/compatibility-lib/mzscheme/main.rkt @@ -230,11 +230,11 @@ old-case old-cond) - mzscheme/private/stxmz-body - mzscheme/private/old-ds - mzscheme/private/old-rp - mzscheme/private/old-if - mzscheme/private/old-procs + "private/stxmz-body.rkt" + "private/old-ds.rkt" + "private/old-rp.rkt" + "private/old-if.rkt" + "private/old-procs.rkt" (only '#%builtin)) ; so it's attached From 4d40f6c308cd35e678d789d0e03df53f8a8235fc Mon Sep 17 00:00:00 2001 From: Jade Sailor Date: Fri, 6 Mar 2026 10:20:31 -0500 Subject: [PATCH 2/2] mzscheme: define our own `define`, `define-syntax`, `define-for-syntax` Previously, we imported the non-keyword versions of those macros from `racket/private/define.rkt` in the main repo (via a bridge module.) This isn't ideal, though, because it means `racket/private/define.rkt` attempts to serve two purposes: being a user-suitable define and being low-level enough to finish implementing racket/base before the final (keyword) defines are supported. These purposes are in tension. Being user-suitable means it wants excellent error messages which means it wants to continue using the full machinery of `normalize-definition`, a good chunk of which is dedicated to producing the best error messages. Being low-level means it wants to be implemented using more low-level techniques, ideally in pure `#%kernel` which means it does not want to replicate that machinery, and, in practice, internal chunks of the racket/base implementation don't need perfect error messages. (For example, it's perfectly fine if duplicate argument names are reported in terms of the underling lambda form, or if defines with multiple errors don't report the leftmost one.) By splitting those two purposes into a full-featured define with great error messages that can be implemented using complex features like normalize-definition, and a full-featured define which has poorer error messages but a simple pure-`#%kernel` implementation, we can serve both those purposes better. And, since the former is only used here, it should be defined here and not in racket/private. Testing: ran DrRacket for a few days. Also code review, in particular noting that the implementation added here is a direct copy-paste from https://github.com/racket/racket/blob/a1dd05117d2abe8a9cc24fed82f8cd4f5b835d8d/racket/collects/racket/private/define.rkt with the only changes being using racket/base instead of "kernel plus various intermediate syntaxes" and the public export of normalize-definition https://github.com/racket/racket/blob/a1dd05117d2abe8a9cc24fed82f8cd4f5b835d8d/racket/collects/syntax/define.rkt instead of the private one. This is a backwards-compatible change. --- compatibility-lib/mzscheme/main.rkt | 4 +--- compatibility-lib/mzscheme/private/old-def.rkt | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 compatibility-lib/mzscheme/private/old-def.rkt diff --git a/compatibility-lib/mzscheme/main.rkt b/compatibility-lib/mzscheme/main.rkt index 43872bc..e700060 100644 --- a/compatibility-lib/mzscheme/main.rkt +++ b/compatibility-lib/mzscheme/main.rkt @@ -223,14 +223,12 @@ promise?) (only racket/private/for-compatibility-lib - define - define-for-syntax - define-syntax fluid-let old-case old-cond) "private/stxmz-body.rkt" + "private/old-def.rkt" "private/old-ds.rkt" "private/old-rp.rkt" "private/old-if.rkt" diff --git a/compatibility-lib/mzscheme/private/old-def.rkt b/compatibility-lib/mzscheme/private/old-def.rkt new file mode 100644 index 0000000..bb79865 --- /dev/null +++ b/compatibility-lib/mzscheme/private/old-def.rkt @@ -0,0 +1,16 @@ +#lang racket/base + +(require (for-syntax racket/base syntax/define)) + +(provide define define-syntax define-for-syntax) + +(define-syntaxes (define define-syntax define-for-syntax) + (let ([go + (lambda (define-values-stx stx) + (let-values ([(id rhs) + (normalize-definition stx #'lambda #t #f)]) + (quasisyntax/loc stx + (#,define-values-stx (#,id) #,rhs))))]) + (values (lambda (stx) (go #'define-values stx)) + (lambda (stx) (go #'define-syntaxes stx)) + (lambda (stx) (go #'define-values-for-syntax stx)))))