# Racket v8.17 draft Release Notes

**URL:** <https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735>\
**Category:** Internals\
**Tags:** release-management\
**Created:** [May 8, 2025, 9:36pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735 "2025-05-08T21:36:00Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![jbclements](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/jbclements/32/11_2.png) [@jbclements](https://racket.discourse.group/u/jbclements)\
**Post date:** [May 8, 2025, 9:36pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/1 "2025-05-08T21:36:00Z")

</div>

Here are the current draft release notes, let me know about things that are incorrect or missing!

* * *

- The package manager computes checksums for packages when required,  
allowing the use and automatic upgrade of packages without them.
- The `bitwise-first-bit-set` function returns the smallest bit that  
is set in the twos-complement representation of the given number.
- Dynamic-require makes it easier to use syntax bindings by allowing a  
syntax-thunk (or 'eval) to be used for them.
- The `error-module-path->string-handler` parameter allows the  
customization of the display of module-paths in error messages.
- Precision of certain numeric functions (`sin`, `cos`, and others) is  
improved on Windows platforms by using the MSVCRT/UCRT libraries.  
The `string-append` function has improved performance and reduced  
memory use for long lists of strings in the Racket CS  
implementation. Differences are clearly noticeable for lists of  
length 1 million.
- TCP ports use SO\_KEEPALIVE, instructing the kernel to send periodic  
messages while waiting for data to check whether the connection is  
still responsive
- Racket code using a windows terminal can receive mouse events as  
virtual terminal characters after using SetConsoleMode.
- The `#:replace-malformed-surrogate?` keyword can be used to specify  
a replacement for malformed unicode surrogates in JSON input
- The http-client module no longer sends "Content-Length: 0" for  
requests without a body.
- The demodularizer (`compiler/demod`) can prune more unused  
assignments
- Several judgment rendering forms in `Redex` are replaced by  
functions, allowing more convenient abstraction.
- The new `drracket-core` package provides a version of drracket with  
a smaller set of dependencies.
- The language menu, including the configuration sub-pane, have  
improved for installations that have no user-facing languages  
installed.
- Typed Racket has support for treelists.
- Racket and Typed Racket have better support for block-diagonal  
matrices.
- The math library contains improved implementations of acos and  
matrix-(cos-)angle.
- The stepper again works for big-bang programs.
- There are many other repairs and documentation imprevements!

The following people contributed to this release:

Alexander Shopov, Andrei Dorian Duma, Bert De Ketelaere, Bob Burger,  
Bogdan Popa, Bogdana Vereha, Cameron Moy, Chung-chieh Shan, Cutie  
Deng, D. Ben Knoble, Dario Hamidi, Dominik Pantůček, Gustavo  
Massaccesi, halfminami, Jacqueline Firth, Jason Hemann, Jens Axel  
Søgaard, Joel Dueck, John Clements, Jordan Harman, Marc  
Nieper-Wißkirchen, Matthew Flatt, Matthias Felleisen, Mike Sperber,  
Noah Ma, owaddell-ib, Philippe Meunier, Robby Findler, Ryan  
Culpepper, Ryan Ficklin, Sam Phillips, Sam Tobin-Hochstadt, Shu-Hung  
You, sogaiu, Sorawee Porncharoenwase, Stephen De Gabrielle, Vincent  
Lee, and Wing Hei Chan.

* * *

---

<div class="post-metadata">

**Author:** ![soegaard](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/soegaard/32/19_2.png) [@soegaard](https://racket.discourse.group/u/soegaard)\
**Post date:** [May 8, 2025, 9:39pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/2 "2025-05-08T21:39:51Z")

</div>

> [@jbclements](#):
>
> Racket code using a windows terminal can receive mouse events as  
> virtual terminal characters after using SetConsoleMode.

Is it possible somehow to mention that this already works on macOS and Linux?

---

<div class="post-metadata">

**Author:** ![jbclements](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/jbclements/32/11_2.png) [@jbclements](https://racket.discourse.group/u/jbclements)\
**Post date:** [May 8, 2025, 9:41pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/3 "2025-05-08T21:41:30Z")

</div>

It does? I spent a while looking for a chunk of example code, I definitely felt like I was stumbling around in the dark. If I just use read-char/special on macOS, do I get mouse movement messages?

---

<div class="post-metadata">

**Author:** ![samth](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/samth/32/3_2.png) [@samth](https://racket.discourse.group/u/samth)\
**Post date:** [May 8, 2025, 9:53pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/4 "2025-05-08T21:53:58Z")

</div>

> Dynamic-require makes it easier to use syntax bindings by allowing a

`dynamic-require` should be referecend as a function.

> The `string-append` function

This should be a new bullet.

> TCP ports use SO\_KEEPALIVE

`SO_KEEPALIVE` should be in tt font.

> Several judgment rendering forms in `Redex`

Redex does not have a capital letter in any of the actual identifiers in Racket.

> The stepper again works for big-bang programs.

`big-bang` is an identifier

> Racket and Typed Racket have better support for block-diagonal

Isn't this actually about the `math` library?

> The language menu, including the configuration sub-pane, have  
> improved for installations that have no user-facing languages  
> installed.

What "user facing languages" are should be explained better.

---

<div class="post-metadata">

**Author:** ![soegaard](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/soegaard/32/19_2.png) [@soegaard](https://racket.discourse.group/u/soegaard)\
**Post date:** [May 8, 2025, 10:08pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/5 "2025-05-08T22:08:52Z")

</div>

@dominik.pantucek You are the best to answer this one.

---

<div class="post-metadata">

**Author:** ![jbclements](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/jbclements/32/11_2.png) [@jbclements](https://racket.discourse.group/u/jbclements)\
**Post date:** [May 8, 2025, 10:11pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/6 "2025-05-08T22:11:46Z")

</div>

First, and clearly most important... how did you manage to intersperse responses to bullets like that? Did you have to quote each one you were responding to separately ? Email was nicer here, sigh.

> [@samth](#):
>
> > Dynamic-require makes it easier to use syntax bindings by allowing a
> 
> `dynamic-require` should be referecend as a function.

Done

> [@samth](#):
>
> > The `string-append` function
> 
> This should be a new bullet.

Done

> [@samth](#):
>
> > TCP ports use SO\_KEEPALIVE
> 
> `SO_KEEPALIVE` should be in tt font.

Okay, this actually raises a question. What I'm using here is scribble that generates text and also markdown, so the real question I have for you is what specific textual and markdown elements you'd like to see here. Would backticks be sufficient? Would you prefer a `<code>` tag in markdown?

> [@samth](#):
>
> > Several judgment rendering forms in `Redex`
> 
> Redex does not have a capital letter in any of the actual identifiers in Racket.

Removed the backticks

> [@samth](#):
>
> > The stepper again works for big-bang programs.
> 
> `big-bang` is an identifier

Backticked

> [@samth](#):
>
> > Racket and Typed Racket have better support for block-diagonal
> 
> Isn't this actually about the `math` library?

reworded

> [@samth](#):
>
> > The language menu, including the configuration sub-pane, have  
> > improved for installations that have no user-facing languages  
> > installed.
> 
> What "user facing languages" are should be explained better.

Yeah, actually I already wrote to Robby to see if he could help me with the wording on this. I agree that this is not acceptable yet.

Here's my revised copy.

* * *

- The package manager computes checksums for packages when required,  
allowing the use and automatic upgrade of packages without them.
- The `bitwise-first-bit-set` function returns the smallest bit that  
is set in the twos-complement representation of the given number.
- The `dynamic-require` form makes it easier to use syntax bindings by  
allowing a syntax-thunk (or 'eval) to be used for them.
- The `error-module-path->string-handler` parameter allows the  
customization of the display of module-paths in error messages.
- Precision of certain numeric functions (`sin`, `cos`, and others) is  
improved on Windows platforms by using the MSVCRT/UCRT libraries.
- The `string-append` function has improved performance and reduced  
memory use for long lists of strings in the Racket CS  
implementation. Differences are clearly noticeable for lists of  
length 1 million.
- TCP ports use SO\_KEEPALIVE, instructing the kernel to send periodic  
messages while waiting for data to check whether the connection is  
still responsive
- Racket code using a windows terminal can receive mouse events as  
virtual terminal characters after using SetConsoleMode.
- The `#:replace-malformed-surrogate?` keyword can be used to specify  
a replacement for malformed unicode surrogates in JSON input
- The http-client module no longer sends "Content-Length: 0" for  
requests without a body.
- The demodularizer (`compiler/demod`) can prune more unused  
assignments
- Several judgment rendering forms in Redex are replaced by functions,  
allowing more convenient abstraction.
- The new `drracket-core` package provides a version of drracket with  
a smaller set of dependencies.
- The language menu, including the configuration sub-pane, have  
improved for installations that have no user-facing languages  
installed.
- Typed Racket has support for treelists.
- The math library has better support for block-diagonal matrices,  
including both Racket and Typed Racket.
- The math library contains improved implementations of acos and  
matrix-(cos-)angle.
- The stepper again works for `big-bang` programs.
- There are many other repairs and documentation imprevements!

The following people contributed to this release:

Alexander Shopov, Andrei Dorian Duma, Bert De Ketelaere, Bob Burger,  
Bogdan Popa, Bogdana Vereha, Cameron Moy, Chung-chieh Shan, Cutie  
Deng, D. Ben Knoble, Dario Hamidi, Dominik Pantůček, Gustavo  
Massaccesi, halfminami, Jacqueline Firth, Jason Hemann, Jens Axel  
Søgaard, Joel Dueck, John Clements, Jordan Harman, Marc  
Nieper-Wißkirchen, Matthew Flatt, Matthias Felleisen, Mike Sperber,  
Noah Ma, owaddell-ib, Philippe Meunier, Robby Findler, Ryan  
Culpepper, Ryan Ficklin, Sam Phillips, Sam Tobin-Hochstadt, Shu-Hung  
You, sogaiu, Sorawee Porncharoenwase, Stephen De Gabrielle, Vincent  
Lee, and Wing Hei Chan.

* * *

---

<div class="post-metadata">

**Author:** ![samth](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/samth/32/3_2.png) [@samth](https://racket.discourse.group/u/samth)\
**Post date:** [May 8, 2025, 10:56pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/7 "2025-05-08T22:56:18Z")

</div>

> [@jbclements](#):
>
> First, and clearly most important... how did you manage to intersperse responses to bullets like that? Did you have to quote each one you were responding to separately ? Email was nicer here, sigh.

If you select text in the web interface there's a quote button.

> [@jbclements](#):
>
> > [@samth](#):
> >
> > > TCP ports use SO\_KEEPALIVE
> > 
> > `SO_KEEPALIVE` should be in tt font.
> 
> Okay, this actually raises a question. What I'm using here is scribble that generates text and also markdown, so the real question I have for you is what specific textual and markdown elements you'd like to see here. Would backticks be sufficient? Would you prefer a `<code>` tag in markdown?

Yes backticks are fine.

For prioritization, I think the most significant ones are: drracket-core, treelists in TR, package manager checksums.

---

<div class="post-metadata">

**Author:** ![jbclements](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/jbclements/32/11_2.png) [@jbclements](https://racket.discourse.group/u/jbclements)\
**Post date:** [May 8, 2025, 11:19pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/8 "2025-05-08T23:19:33Z")

</div>

> [@samth](#):
>
> > [@jbclements](#):
> >
> > First, and clearly most important... how did you manage to intersperse responses to bullets like that? Did you have to quote each one you were responding to separately ? Email was nicer here, sigh.
> 
> If you select text in the web interface there's a quote button.

Yes, but when you do that you get a separate quote block for each piece; you can see the person's name at the top of each block. I see that for your most recent message, but not for your first one in this thread, suggesting you did something different there. Perhaps you manually inserted not-quote quote pairs? Not sure. Not important.

> [@samth](#):
>
> > [@jbclements](#):
> >
> > > [@samth](#):
> > >
> > > > TCP ports use SO\_KEEPALIVE
> > > 
> > > `SO_KEEPALIVE` should be in tt font.
> > 
> > Okay, this actually raises a question. What I'm using here is scribble that generates text and also markdown, so the real question I have for you is what specific textual and markdown elements you'd like to see here. Would backticks be sufficient? Would you prefer a `<code>` tag in markdown?
> 
> Yes backticks are fine.

Done

> [@samth](#):
>
> For prioritization, I think the most significant ones are: drracket-core, treelists in TR, package manager checksums.

Agreed, updated. New version:

* * *

- The new `drracket-core` package provides a version of drracket with  
a smaller set of dependencies.
- Typed Racket has support for treelists.
- The package manager computes checksums for packages when required,  
allowing the use and automatic upgrade of packages without them.
- The `bitwise-first-bit-set` function returns the smallest bit that  
is set in the twos-complement representation of the given number.
- The `dynamic-require` form makes it easier to use syntax bindings by  
allowing a syntax-thunk (or 'eval) to be used for them.
- The `error-module-path->string-handler` parameter allows the  
customization of the display of module-paths in error messages.
- Precision of certain numeric functions (`sin`, `cos`, and others) is  
improved on Windows platforms by using the MSVCRT/UCRT libraries.
- The `string-append` function has improved performance and reduced  
memory use for long lists of strings in the Racket CS  
implementation. Differences are clearly noticeable for lists of  
length 1 million.
- TCP ports use `SO_KEEPALIVE`, instructing the kernel to send  
periodic messages while waiting for data to check whether the  
connection is still responsive
- Racket code using a windows terminal can receive mouse events as  
virtual terminal characters after using SetConsoleMode.
- The `#:replace-malformed-surrogate?` keyword can be used to specify  
a replacement for malformed unicode surrogates in JSON input
- The http-client module no longer sends "Content-Length: 0" for  
requests without a body.
- The demodularizer (`compiler/demod`) can prune more unused  
assignments
- Several judgment rendering forms in Redex are replaced by functions,  
allowing more convenient abstraction.
- The language menu, including the configuration sub-pane, have  
improved for installations that have no user-facing languages  
installed.
- The math library has better support for block-diagonal matrices,  
including both Racket and Typed Racket.
- The math library contains improved implementations of acos and  
matrix-(cos-)angle.
- The stepper again works for `big-bang` programs.
- There are many other repairs and documentation imprevements!

The following people contributed to this release:

Alexander Shopov, Andrei Dorian Duma, Bert De Ketelaere, Bob Burger,  
Bogdan Popa, Bogdana Vereha, Cameron Moy, Chung-chieh Shan, Cutie  
Deng, D. Ben Knoble, Dario Hamidi, Dominik Pantůček, Gustavo  
Massaccesi, halfminami, Jacqueline Firth, Jason Hemann, Jens Axel  
Søgaard, Joel Dueck, John Clements, Jordan Harman, Marc  
Nieper-Wißkirchen, Matthew Flatt, Matthias Felleisen, Mike Sperber,  
Noah Ma, owaddell-ib, Philippe Meunier, Robby Findler, Ryan  
Culpepper, Ryan Ficklin, Sam Phillips, Sam Tobin-Hochstadt, Shu-Hung  
You, sogaiu, Sorawee Porncharoenwase, Stephen De Gabrielle, Vincent  
Lee, and Wing Hei Chan.

* * *

---

<div class="post-metadata">

**Author:** ![samth](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/samth/32/3_2.png) [@samth](https://racket.discourse.group/u/samth)\
**Post date:** [May 9, 2025, 1:00am UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/9 "2025-05-09T01:00:57Z")

</div>

For most of those I copied and pasted manually.

One last note: dynamic-require is a procedure not a syntactic form.

---

<div class="post-metadata">

**Author:** ![dominik.pantucek](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/dominik.pantucek/32/144_2.png) [@dominik.pantucek](https://racket.discourse.group/u/dominik.pantucek)\
**Post date:** [May 9, 2025, 6:14am UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/10 "2025-05-09T06:14:06Z")

</div>

> [@soegaard](#):
>
> @dominik.pantucek You are the best to answer this one.

Hehe, I'll try my best 😉

> [@soegaard](#):
>
> > [@jbclements](#):
> >
> > Racket code using a windows terminal can receive mouse events as  
> > virtual terminal characters after using SetConsoleMode.
> 
> Is it possible somehow to mention that this already works on macOS and Linux?

> [@jbclements](#):
>
> It does? I spent a while looking for a chunk of example code, I definitely felt like I was stumbling around in the dark. If I just use read-char/special on macOS, do I get mouse movement messages?

Yes, it does - if you enable that. In `tui-term`[1], there's a procedure just for that: `term-enable-mouse`[2]. On Linux and/or a Mac, it just sends SET\_ANY\_EVENT\_MOUSE and SET\_SGR\_EXT\_MODE\_MOUSE VT/ANSI/ECMA sequences. See the source[3].

The Windows Console support gets "injected" into the whole layered support in [4] using a "platform hook". Windows is the only platform, where this operates on a completely different layer than one would expect. The actual hook is then passed along as the last field of the `tterm` struct as [5].

Yup, jumping hoops thru loops only to:

- either send `"\x1b[?1003h\x1b[?1006h"` to the standard output, or
- update ConsoleMode on hStdin with bits `#x290` set to one and cleared bit `#x40`

I plan to provide some example code in the `tui-term` package, however this is pretty low-level and I think only TUI toolkit authors would even want to use it. Ok, perhaps cursor positioning in expeditor using mouse is another cool feature someone might implement, but that's about it 🙂

[1] [TUI Terminal Support](https://docs.racket-lang.org/tui-term/index.html)  
[2] [2&nbsp;Virtual Terminal](https://docs.racket-lang.org/tui-term/Virtual_Terminal.html#%28def._%28%28lib._tui%2Fterm%2Fvt-output-port..rkt%29._term-enable-mouse%29%29)  
[3] [term/vt-output-port.rkt · master · Dominik Joe Pantůček / tui-term · GitLab](https://gitlab.com/racketeer/tui-term/-/blob/master/term/vt-output-port.rkt?ref_type=heads#L23)  
[4] [term/tty-input-port.rkt · master · Dominik Joe Pantůček / tui-term · GitLab](https://gitlab.com/racketeer/tui-term/-/blob/master/term/tty-input-port.rkt?ref_type=heads#L53)  
[5] [term/tty.rkt · master · Dominik Joe Pantůček / tui-term · GitLab](https://gitlab.com/racketeer/tui-term/-/blob/master/term/tty.rkt?ref_type=heads#L13)

---

<div class="post-metadata">

**Author:** ![jbclements](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/jbclements/32/11_2.png) [@jbclements](https://racket.discourse.group/u/jbclements)\
**Post date:** [May 15, 2025, 1:58pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/11 "2025-05-15T13:58:44Z")

</div>

Well, I think a link to your code and a parenthetical comment is maybe the way to go, here. Here's what I've got now:

* * *

- The new `drracket-core` package provides a version of drracket with  
a smaller set of dependencies.
- Typed Racket has support for treelists.
- The package manager computes checksums for packages when required,  
allowing the use and automatic upgrade of packages without them.
- The `bitwise-first-bit-set` function returns the smallest bit that  
is set in the twos-complement representation of the given number.
- The updated `dynamic-require` function makes it easier to use syntax  
bindings by allowing a syntax-thunk (or 'eval) to be used for them.
- The `error-module-path->string-handler` parameter allows the  
customization of the display of module-paths in error messages.
- Precision of certain numeric functions (`sin`, `cos`, and others) is  
improved on Windows platforms by using the MSVCRT/UCRT libraries.
- The `string-append` function has improved performance and reduced  
memory use for long lists of strings in the Racket CS  
implementation. Differences are clearly noticeable for lists of  
length 1 million.
- TCP ports use `SO_KEEPALIVE`, instructing the kernel to send  
periodic messages while waiting for data to check whether the  
connection is still responsive
- Racket code using a terminal in Windows can receive mouse events as  
virtual terminal characters after using SetConsoleMode. (This is  
also already possible on macOS and Linux.) See the tui-term  
package for related example code.
- The `#:replace-malformed-surrogate?` keyword can be used to specify  
a replacement for malformed unicode surrogates in JSON input
- The http-client module no longer sends "Content-Length: 0" for  
requests without a body.
- The demodularizer (`compiler/demod`) can prune more unused  
assignments
- Several judgment rendering forms in Redex are replaced by functions,  
allowing more convenient abstraction.
- When a distribution includes no teaching languages, DrRacket’s  
language-dialog configuration moves into the preferences dialog and  
the “Language” menu disappears.
- The math library has better support for block-diagonal matrices,  
including both Racket and Typed Racket.
- The math library contains improved implementations of acos and  
matrix-(cos-)angle.
- The stepper again works for `big-bang` programs.
- There are many other repairs and documentation imprevements!

The following people contributed to this release:

Alexander Shopov, Andrei Dorian Duma, Bert De Ketelaere, Bob Burger,  
Bogdan Popa, Bogdana Vereha, Cameron Moy, Chung-chieh Shan, Cutie  
Deng, D. Ben Knoble, Dario Hamidi, Dominik Pantůček, Gustavo  
Massaccesi, halfminami, Jacqueline Firth, Jason Hemann, Jens Axel  
Søgaard, Joel Dueck, John Clements, Jordan Harman, Marc  
Nieper-Wißkirchen, Matthew Flatt, Matthias Felleisen, Mike Sperber,  
Noah Ma, owaddell-ib, Philippe Meunier, Robby Findler, Ryan  
Culpepper, Ryan Ficklin, Sam Phillips, Sam Tobin-Hochstadt, Shu-Hung  
You, sogaiu, Sorawee Porncharoenwase, Stephen De Gabrielle, Vincent  
Lee, and Wing Hei Chan.

* * *

---

<div class="post-metadata">

**Author:** ![jbclements](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/jbclements/32/11_2.png) [@jbclements](https://racket.discourse.group/u/jbclements)\
**Post date:** [May 15, 2025, 1:58pm UTC](https://racket.discourse.group/t/racket-v8-17-draft-release-notes/3735/12 "2025-05-15T13:58:58Z")

</div>

Got it, many thanks.
