# Release Announcement for v9.2

**URL:** <https://racket.discourse.group/t/release-announcement-for-v9-2/4217>\
**Category:** Internals\
**Tags:** release-management, release\
**Created:** [May 17, 2026, 11:46pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217 "2026-05-17T23:46:40Z")\
**Posts on this page:** 18\
**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 17, 2026, 11:46pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/1 "2026-05-17T23:46:40Z")

</div>

```
The release announcement sketch that I have so far is below. Please
mail me new items and/or edits.

Please phrase announcements using complete sentences and avoid the
word "now".
----------------------------------------------------------------------

```

* * *

- Racket 9.2 uses Unicode 17.0 for character and string operations.
- Typed Racket has repaired the types of `asin` and `acos`. This may  
cause existing programs not to type check.
- This release includes internal support for a more static "ffi2" FFI  
(to be used in a future package).
- The `terminal-file-position` function counts bytes written to ports  
connected to a terminal, such as `stdin` and `stderr`.
- The `match` form rejects non-linear patterns with mismatched  
ellipsis depth.
- Cross-phase persistent modules allow more types of `quote`d data.
- The `#%foreign-inline` core syntactic form provides unsafe access to  
facilities provided at the linklet layer by a Racket  
implementation.
- The implementations of `member`, `memw`, `when`, `unless`, `let/ec`,  
and `cond` are rewritten to use only racket/kernel syntax
- The `impersonator-property-predicate-procedure?` function identifies  
procedures created by `make-impersonator-property`.
- Polymorphic Struct types are printed using type arguments (e.g., ` (Array Byte)`) rather than exposing an internal representation.
- The stepper's display of numbers better matches the language  
settings.
- Scribble documents that do not use the Racket-manual style get an  
`initial-scale` of 1.0, instead of the manual style's 0.8, but this  
can be configured using the `initial-scale` property.
- By default, margin notes appear inline for narrow displays in all  
styles, not just in the Racket-manual style.
- Big-bang programs distributed as .dmg files correctly handle the  
`close-on-stop` feature.
- There are many other repairs and documentation improvements!

The following people contributed to this release:

Alexander Shopov, Alexis King, Asilo, Bert De Ketelaere, Bob Burger,  
Bogdan Popa, Chung-chieh Shan, François-René Rideau, Gustavo  
Massaccesi, Ilya Klyuchnikov, Jade Sailor, Jamie Taylor, John  
Clements, Jonathan Simpson, LS\_Hower, Matthew Flatt, Matthias  
Felleisen, Mike Sperber, Pavel Panchekha, Philippe Meunier, RMOlive,  
Robby Findler, Roman Klochkov, Sam Tobin-Hochstadt, Shu-Hung You,  
Tejas Sanap, Vincent Lee, and Wing Hei Chan.

* * *

---

<div class="post-metadata">

**Author:** ![spdegabrielle](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/spdegabrielle/32/95_2.png) [@spdegabrielle](https://racket.discourse.group/u/spdegabrielle)\
**Post date:** [May 18, 2026, 11:41pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/2 "2026-05-18T23:41:35Z")

</div>

Links added.

These are what the links are expected to be. I took the links from [Racket](https://pre-release.racket-lang.org/doc/index.html) changing `pre-release` to `docs` and removing `doc/` to get what I believe will be the correct address when the upgrade is published.

* * *

- Racket 9.2 uses Unicode 17.0 for character and string operations.
- Typed Racket has repaired the types of `asin` and `acos`. This may  
cause existing programs not to type check.
- This release includes internal support for a more static "ffi2" FFI  
(to be used in a future package).
- The [`terminal-file-position`](https://docs.racket-lang.org/reference/port-buffers.html#%28def._%28%28quote._~23~25kernel%29._terminal-file-position%29%29) function counts bytes written to ports  
connected to a terminal, such as `stdin` and `stderr`.
- The [`match`](https://docs.racket-lang.org/reference/match.html#%28form._%28%28lib._racket%2Fmatch..rkt%29._match%29%29) form rejects non-linear patterns with mismatched  
ellipsis depth.
- Cross-phase persistent modules allow more types of `quote`d data.
- The [`#%foreign-inline`](https://docs.racket-lang.org/reference/foreign-inline.html#%28form._%28%28quote._~23~25kernel%29._~23~25foreign-inline%29%29) core syntactic form provides unsafe access to  
facilities provided at the linklet layer by a Racket  
implementation.
- The implementations of `member`, `memw`, `when`, `unless`, `let/ec`,  
and `cond` are rewritten to use only [racket/kernel](https://docs.racket-lang.org/reference/Kernel_Forms_and_Functions.html) syntax
- The [`impersonator-property-predicate-procedure?`](https://docs.racket-lang.org/reference/chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property-predicate-procedure~3f%29%29) function identifies  
procedures created by `make-impersonator-property`.
- Polymorphic Struct types are printed using type arguments (e.g., ` (Array Byte)`) rather than exposing an internal representation.
- [The Stepper](https://docs.racket-lang.org/stepper/index.html)'s display of numbers better matches the language  
settings.
- [Scribble](https://docs.racket-lang.org/scribble/index.html) documents that do not use the Racket-manual style get an  
`initial-scale` of 1.0, instead of the manual style's 0.8, but this  
can be configured using the `initial-scale` property.
- By default, margin notes appear inline for narrow displays in all  
styles, not just in the Racket-manual style.
- [Big-bang](https://docs.racket-lang.org/teachpack/2htdpuniverse.html) programs distributed as .dmg files correctly handle the  
`close-on-stop` feature.

```scheme
- Racket 9.2 uses Unicode 17.0 for character and string operations.
- Typed Racket has repaired the types of `asin` and `acos`. This may
  cause existing programs not to type check.
- This release includes internal support for a more static "ffi2" FFI
  (to be used in a future package).
- The [`terminal-file-position`](https://docs.racket-lang.org/reference/port-buffers.html#%28def._%28%28quote._~23~25kernel%29._terminal-file-position%29%29) function counts bytes written to ports
  connected to a terminal, such as `stdin` and `stderr`.
- The [`match`](https://docs.racket-lang.org/reference/match.html#%28form._%28%28lib._racket%2Fmatch..rkt%29._match%29%29) form rejects non-linear patterns with mismatched
  ellipsis depth.
- Cross-phase persistent modules allow more types of `quote`d data.
- The [`#%foreign-inline`](https://docs.racket-lang.org/reference/foreign-inline.html#%28form._%28%28quote._~23~25kernel%29._~23~25foreign-inline%29%29) core syntactic form provides unsafe access to
  facilities provided at the linklet layer by a Racket
  implementation.
- The implementations of `member`, `memw`, `when`, `unless`, `let/ec`,
  and `cond` are rewritten to use only [racket/kernel](https://docs.racket-lang.org/reference/Kernel_Forms_and_Functions.html) syntax
- The [`impersonator-property-predicate-procedure?`](https://docs.racket-lang.org/reference/chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property-predicate-procedure~3f%29%29) function identifies
  procedures created by `make-impersonator-property`.
- Polymorphic Struct types are printed using type arguments (e.g., `
  (Array Byte)`) rather than exposing an internal representation.
- [The Stepper](https://docs.racket-lang.org/stepper/index.html)'s display of numbers better matches the language
  settings.
- [Scribble](https://docs.racket-lang.org/scribble/index.html) documents that do not use the Racket-manual style get an
  `initial-scale` of 1.0, instead of the manual style's 0.8, but this
  can be configured using the `initial-scale` property.
- By default, margin notes appear inline for narrow displays in all
  styles, not just in the Racket-manual style.
- [Big-bang](https://docs.racket-lang.org/teachpack/2htdpuniverse.html) programs distributed as .dmg files correctly handle the
  `close-on-stop` feature.

```

---

<div class="post-metadata">

**Author:** ![LiberalArtist](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/liberalartist/32/151_2.png) [@LiberalArtist](https://racket.discourse.group/u/LiberalArtist)\
**Post date:** [May 19, 2026, 1:50am UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/3 "2026-05-19T01:50:19Z")

</div>

> [@spdegabrielle](#):
>
> Polymorphic Struct types are printed using type arguments (e.g., ` (Array Byte)`) rather than exposing an internal representation.

This might be better as: “In Typed Racket, polymorphic `Struct` types are printed …”

---

<div class="post-metadata">

**Author:** ![spdegabrielle](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/spdegabrielle/32/95_2.png) [@spdegabrielle](https://racket.discourse.group/u/spdegabrielle)\
**Post date:** [May 19, 2026, 11:58am UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/4 "2026-05-19T11:58:11Z")

</div>

Thanks @LiberalArtist

```scheme
- Racket 9.2 uses Unicode 17.0 for character and string operations.
- Typed Racket has repaired the types of `asin` and `acos`. This may
  cause existing programs not to type check.
- This release includes internal support for a more static "ffi2" FFI
  (to be used in a future package).
- The [`terminal-file-position`](https://docs.racket-lang.org/reference/port-buffers.html#%28def._%28%28quote._~23~25kernel%29._terminal-file-position%29%29) function counts bytes written to ports
  connected to a terminal, such as `stdin` and `stderr`.
- The [`match`](https://docs.racket-lang.org/reference/match.html#%28form._%28%28lib._racket%2Fmatch..rkt%29._match%29%29) form rejects non-linear patterns with mismatched
  ellipsis depth.
- Cross-phase persistent modules allow more types of `quote`d data.
- The [`#%foreign-inline`](https://docs.racket-lang.org/reference/foreign-inline.html#%28form._%28%28quote._~23~25kernel%29._~23~25foreign-inline%29%29) core syntactic form provides unsafe access to
  facilities provided at the linklet layer by a Racket
  implementation.
- The implementations of `member`, `memw`, `when`, `unless`, `let/ec`,
  and `cond` are rewritten to use only [racket/kernel](https://docs.racket-lang.org/reference/Kernel_Forms_and_Functions.html) syntax
- The [`impersonator-property-predicate-procedure?`](https://docs.racket-lang.org/reference/chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property-predicate-procedure~3f%29%29) function identifies
  procedures created by `make-impersonator-property`.
- In Typed Racket, polymorphic `Struct` types are printed using type arguments (e.g., `
  (Array Byte)`) rather than exposing an internal representation.
- [The Stepper](https://docs.racket-lang.org/stepper/index.html)'s display of numbers better matches the language
  settings.
- [Scribble](https://docs.racket-lang.org/scribble/index.html) documents that do not use the Racket-manual style get an
  `initial-scale` of 1.0, instead of the manual style's 0.8, but this
  can be configured using the `initial-scale` property.
- By default, margin notes appear inline for narrow displays in all
  styles, not just in the Racket-manual style.
- [Big-bang](https://docs.racket-lang.org/teachpack/2htdpuniverse.html) programs distributed as .dmg files correctly handle the
  `close-on-stop` feature.

```

---

<div class="post-metadata">

**Author:** ![robby](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/robby/32/7_2.png) [@robby](https://racket.discourse.group/u/robby)\
**Post date:** [May 19, 2026, 2:59pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/5 "2026-05-19T14:59:46Z")

</div>

@samth can we add a few words of justification of the `acos` `asin` change? Was it a soundness issue, perhaps?

---

<div class="post-metadata">

**Author:** ![robby](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/robby/32/7_2.png) [@robby](https://racket.discourse.group/u/robby)\
**Post date:** [May 19, 2026, 3:01pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/6 "2026-05-19T15:01:36Z")

</div>

Perhaps also for the `match` change say something? (Not sure what on this one but perhaps a link to the issue? Something like "A potentially backwards-incompatible change, see [link] for details"?

---

<div class="post-metadata">

**Author:** ![spdegabrielle](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/spdegabrielle/32/95_2.png) [@spdegabrielle](https://racket.discourse.group/u/spdegabrielle)\
**Post date:** [May 19, 2026, 5:09pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/7 "2026-05-19T17:09:42Z")

</div>

I think it was this commit: [Reject non-linear `match` patterns with mismatched ellipsis depth · racket/racket@c42ebbf · GitHub](https://github.com/racket/racket/commit/c42ebbf7bd761e843de77a8311dc3c3b4faa5bdd)

I think a link will be sufficient

```scheme
- The [`match`](https://docs.racket-lang.org/reference/match.html#%28form._%28%28lib._racket%2Fmatch..rkt%29._match%29%29) form rejects non-linear patterns with mismatched
  ellipsis depth. A potentially backwards-incompatible change, see [commit c42ebbf](https://github.com/racket/racket/commit/c42ebbf7bd761e843de77a8311dc3c3b4faa5bdd) for details.

```

---

<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 19, 2026, 8:31pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/8 "2026-05-19T20:31:41Z")

</div>

1. Better to link to the Pull Request, here: [Reject non-linear `match` patterns with mismatched ellipsis depth by samth · Pull Request #5467 · racket/racket · GitHub](https://github.com/racket/racket/pull/5467)
2. For the changes to asin/acos, the PR is here: [Fix types of `asin` and `acos`. by samth · Pull Request #1428 · racket/typed-racket · GitHub](https://github.com/racket/typed-racket/pull/1428)
3. The changes to `asin` and `acos` are indeed soundness issues; you can read about the problem here: [Acos behaves differently on #s \> 1.0 in TR?](https://racket.discourse.group/t/acos-behaves-differently-on-s-1-0-in-tr/3453)
4. Here are some suggested bullet points:

- `match` actually checks that when non-linear patterns (patterns where the same variable is used multiple times) are used with `...`, the two parts of the matched value actually are equal. Additionally, `match` rejects non-linear patterns where one use of the variable is used with `...` and another is not.
- Typed Racket's types for the `asin` and `acos` procedures correctly handle situations where the function produces a complex number, avoid unsound result that were previously possible.

---

<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 20, 2026, 4:06pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/9 "2026-05-20T16:06:06Z")

</div>

I've incorporated changes from @samth and @LiberalArtist , but taken certain liberties. Specifically, I lifted and tagged the two bullets that could potentially break existing code. @spdegabrielle , I have not yet incorporated your links, my apologies, I'll get to this. (Alternately, if you feel like navigating my oh-my-Lord-yet-another-custom-language format for release-notes.rkt, you're welcome to add them there.... )

* * *

- Typed Racket's types for the `asin` and `acos` procedures correctly  
handle situations where the function produces a complex number,  
avoiding unsound results that were previously possible. This repair  
could cause existing code to fail.
- The updated `match` form checks that when non-linear patterns  
(patterns where the same variable is used multiple times) are used  
with `...`, the two parts of the matched value actually are equal.  
Additionally, match rejects non-linear patterns where one use of the  
variable is used with `...` and another is not. This repair could  
cause existing code to fail.
- Racket 9.2 uses Unicode 17.0 for character and string operations.
- This release includes internal support for a more static "ffi2" FFI  
(to be used in a future package).
- The `terminal-file-position` function counts bytes written to ports  
connected to a terminal, such as `stdin` and `stderr`.
- Cross-phase persistent modules allow more types of `quote`d data.
- The `#%foreign-inline` core syntactic form provides unsafe access to  
facilities provided at the linklet layer by a Racket  
implementation.
- The implementations of `member`, `memw`, `when`, `unless`, `let/ec`,  
and `cond` are rewritten to use only racket/kernel syntax
- The `impersonator-property-predicate-procedure?` function identifies  
procedures created by `make-impersonator-property`.
- In Typed Racket, polymorphic struct types are printed using type  
arguments (e.g., `(Array Byte)`) rather than exposing an internal  
representation.
- The stepper's display of numbers better matches the language  
settings.
- Scribble documents that do not use the Racket-manual style get an  
`initial-scale` of 1.0, instead of the manual style's 0.8, but this  
can be configured using the `initial-scale` property.
- By default, margin notes appear inline for narrow displays in all  
styles, not just in the Racket-manual style.
- Big-bang programs distributed as .dmg files correctly handle the  
`close-on-stop` feature.
- There are many other repairs and documentation improvements!

The following people contributed to this release:

Alexander Shopov, Alexis King, Asilo, Bert De Ketelaere, Bob Burger,  
Bogdan Popa, Chung-chieh Shan, François-René Rideau, Gustavo  
Massaccesi, Ilya Klyuchnikov, Jade Sailor, Jamie Taylor, John  
Clements, Jonathan Simpson, LS\_Hower, Matthew Flatt, Matthias  
Felleisen, Mike Sperber, Pavel Panchekha, Philippe Meunier, RMOlive,  
Robby Findler, Roman Klochkov, Sam Tobin-Hochstadt, Shu-Hung You,  
Tejas Sanap, 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 20, 2026, 4:22pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/10 "2026-05-20T16:22:56Z")

</div>

Importantly, the Typed Racket changes can cause existing code to fail at compile time but not a runtime, and the `match` changes can cause both compile-time and run-time failures.

---

<div class="post-metadata">

**Author:** ![LiberalArtist](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/liberalartist/32/151_2.png) [@LiberalArtist](https://racket.discourse.group/u/LiberalArtist)\
**Post date:** [May 21, 2026, 2:20am UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/11 "2026-05-21T02:20:19Z")

</div>

Two more nits:

> [@jbclements](#):
>
> This release includes internal support for a more static "ffi2" FFI  
> (to be used in a future package).

To avoid the abbreviation twice in a row, would “for a more static "ffi2" foreign interface” make sense?

> [@jbclements](#):
>
> The implementations of `member`, `memw`, `when`, `unless`, `let/ec`,  
> and `cond` are rewritten to use only racket/kernel syntax

I would mark up `racket/kernel` as code, especially as it’s not an extremely well-known module, and reading the “/” as something like “only racket or kernel syntax” seems plausible.

---

<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 22, 2026, 4:30am UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/12 "2026-05-22T04:30:12Z")

</div>

made these changes, thanks

---

<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 26, 2026, 8:41pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/13 "2026-05-26T20:41:23Z")

</div>

Okay, @samth took your suggestions for links as well, here's what I have now, planning to run with this:

- Typed Racket's types for the `asin` and `acos` procedures correctly handle situations where the function produces a complex number, avoiding unsound results that were previously possible. This repair could cause existing code to fail at compile time, see [this pull request](https://github.com/racket/typed-racket/pull/1428).
- The updated [`match`](https://docs.racket-lang.org/reference/match.html#%28form._%28%28lib._racket%2Fmatch..rkt%29._match%29%29) form checks that when non-linear patterns (patterns where the same variable is used multiple times) are used with `...`, the two parts of the matched value actually are equal. Additionally, match rejects non-linear patterns where one use of the variable is used with `...` and another is not. This repair could cause existing code to fail, see [this pull request](https://github.com/racket/racket/pull/5467).
- Racket 9.2 uses Unicode 17.0 for character and string operations.
- This release includes internal support for a more static "ffi2" foreign interface (to be used in a future package).
- The [`terminal-file-position`](https://docs.racket-lang.org/reference/port-buffers.html#%28def._%28%28quote._~23~25kernel%29._terminal-file-position%29%29) function counts bytes written to ports connected to a terminal, such as `stdin` and `stderr`.
- Cross-phase persistent modules allow more types of `quote`d data.
- The [`#%foreign-inline`](https://docs.racket-lang.org/reference/foreign-inline.html#%28form._%28%28quote._~23~25kernel%29._~23~25foreign-inline%29%29) core syntactic form provides unsafe access to facilities provided at the linklet layer by a Racket implementation.
- The implementations of `member`, `memw`, `when`, `unless`, `let/ec`, and `cond` are rewritten to use only [`racket/kernel`](https://docs.racket-lang.org/reference/Kernel_Forms_and_Functions.html) syntax
- The [`impersonator-property-predicate-procedure?`](https://docs.racket-lang.org/reference/chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property-predicate-procedure~3f%29%29) function identifies procedures created by `make-impersonator-property`.
- In Typed Racket, polymorphic struct types are printed using type arguments (e.g., `(Array Byte)`) rather than exposing an internal representation.
- The stepper's display of numbers better matches the language settings.
- Scribble documents that do not use the Racket-manual style get an [`initial-scale`](https://docs.racket-lang.org/scribble/core.html#%28def._%28%28lib._scribble%2Fhtml-properties..rkt%29._initial-scale%29%29) of 1.0, instead of the manual style's 0.8, but this can be configured using the `initial-scale` property.
- By default, margin notes appear inline for narrow displays in all styles, not just in the Racket-manual style.
- Big-bang programs distributed as .dmg files correctly handle the `close-on-stop` feature.
- There are many other repairs and documentation improvements!

---

<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 26, 2026, 9:13pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/14 "2026-05-26T21:13:09Z")

</div>

Sorry, minor reformatting; I wanted text that made sense with no links, for inclusion in the .txt version of the release notes. Here's what I've got now:

- Typed Racket's types for the `asin` and `acos` procedures correctly handle situations where the function produces a complex number, avoiding unsound results that were previously possible. [This repair could cause existing code to fail at compile time](https://github.com/racket/typed-racket/pull/1428).
- The updated [`match`](https://docs.racket-lang.org/reference/match.html#%28form._%28%28lib._racket%2Fmatch..rkt%29._match%29%29) form checks that when non-linear patterns (patterns where the same variable is used multiple times) are used with `...`, the two parts of the matched value actually are equal. Additionally, match rejects non-linear patterns where one use of the variable is used with `...` and another is not. [This repair could cause existing code to fail](https://github.com/racket/racket/pull/5467).
- Racket 9.2 uses Unicode 17.0 for character and string operations.
- This release includes internal support for a more static "ffi2" foreign interface (to be used in a future package).
- The [`terminal-file-position`](https://docs.racket-lang.org/reference/port-buffers.html#%28def._%28%28quote._~23~25kernel%29._terminal-file-position%29%29) function counts bytes written to ports connected to a terminal, such as `stdin` and `stderr`.
- Cross-phase persistent modules allow more types of `quote`d data.
- The [`#%foreign-inline`](https://docs.racket-lang.org/reference/foreign-inline.html#%28form._%28%28quote._~23~25kernel%29._~23~25foreign-inline%29%29) core syntactic form provides unsafe access to facilities provided at the linklet layer by a Racket implementation.
- The implementations of `member`, `memw`, `when`, `unless`, `let/ec`, and `cond` are rewritten to use only [`racket/kernel`](https://docs.racket-lang.org/reference/Kernel_Forms_and_Functions.html) syntax
- The [`impersonator-property-predicate-procedure?`](https://docs.racket-lang.org/reference/chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property-predicate-procedure~3f%29%29) function identifies procedures created by `make-impersonator-property`.
- In Typed Racket, polymorphic struct types are printed using type arguments (e.g., `(Array Byte)`) rather than exposing an internal representation.
- The stepper's display of numbers better matches the language settings.
- Scribble documents that do not use the Racket-manual style get an [`initial-scale`](https://docs.racket-lang.org/scribble/core.html#%28def._%28%28lib._scribble%2Fhtml-properties..rkt%29._initial-scale%29%29) of 1.0, instead of the manual style's 0.8, but this can be configured using the `initial-scale` property.
- By default, margin notes appear inline for narrow displays in all styles, not just in the Racket-manual style.
- Big-bang programs distributed as .dmg files correctly handle the `close-on-stop` feature.
- There are many other repairs and documentation improvements!

---

<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 26, 2026, 9:17pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/15 "2026-05-26T21:17:26Z")

</div>

1. I think the match bullet point should be first.
2. I would omit the word "updated" in the discussion of match.
3. I think the discussion about #%foreign-inline should be moved to the third bullet and mention that code that handles all possible fully expanded forms will need to be updated to accommodate this new possibility.

---

<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 27, 2026, 5:37am UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/16 "2026-05-27T05:37:22Z")

</div>

These changes make sense to me. Here's what I have now:

- The [`match`](https://docs.racket-lang.org/reference/match.html#%28form._%28%28lib._racket%2Fmatch..rkt%29._match%29%29) form checks that when non-linear patterns (patterns where the same variable is used multiple times) are used with `...`, the two parts of the matched value actually are equal. Additionally, match rejects non-linear patterns where one use of the variable is used with `...` and another is not. [This repair could cause existing code to fail](https://github.com/racket/racket/pull/5467).
- Typed Racket's types for the `asin` and `acos` procedures correctly handle situations where the function produces a complex number, avoiding unsound results that were previously possible. [This repair could cause existing code to fail at compile time](https://github.com/racket/typed-racket/pull/1428).
- The [`#%foreign-inline`](https://docs.racket-lang.org/reference/foreign-inline.html#%28form._%28%28quote._~23~25kernel%29._~23~25foreign-inline%29%29) core syntactic form provides unsafe access to facilities provided at the linklet layer by a Racket implementation. This means that any code that handles all core forms by enumeration will need to be updated.
- Racket 9.2 uses Unicode 17.0 for character and string operations.
- This release includes internal support for a more static "ffi2" foreign interface (to be used in a future package).
- The [`terminal-file-position`](https://docs.racket-lang.org/reference/port-buffers.html#%28def._%28%28quote._~23~25kernel%29._terminal-file-position%29%29) function counts bytes written to ports connected to a terminal, such as `stdin` and `stderr`.
- Cross-phase persistent modules allow more types of `quote`d data.
- The implementations of `member`, `memw`, `when`, `unless`, `let/ec`, and `cond` are rewritten to use only [`racket/kernel`](https://docs.racket-lang.org/reference/Kernel_Forms_and_Functions.html) syntax
- The [`impersonator-property-predicate-procedure?`](https://docs.racket-lang.org/reference/chaperones.html#%28def._%28%28quote._~23~25kernel%29._impersonator-property-predicate-procedure~3f%29%29) function identifies procedures created by `make-impersonator-property`.
- In Typed Racket, polymorphic struct types are printed using type arguments (e.g., `(Array Byte)`) rather than exposing an internal representation.
- The stepper's display of numbers better matches the language settings.
- Scribble documents that do not use the Racket-manual style get an [`initial-scale`](https://docs.racket-lang.org/scribble/core.html#%28def._%28%28lib._scribble%2Fhtml-properties..rkt%29._initial-scale%29%29) of 1.0, instead of the manual style's 0.8, but this can be configured using the `initial-scale` property.
- By default, margin notes appear inline for narrow displays in all styles, not just in the Racket-manual style.
- Big-bang programs distributed as .dmg files correctly handle the `close-on-stop` feature.
- There are many other repairs and documentation improvements!

---

<div class="post-metadata">

**Author:** ![encomer](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/encomer/32/280_2.png) [@encomer](https://racket.discourse.group/u/encomer)\
**Post date:** [May 27, 2026, 10:07pm UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/17 "2026-05-27T22:07:40Z")

</div>

A possible **minor change** _for your consideration_ is to write:

`Unicode 17.0 is used for character and string operations`.

(Instead of the current: `Racket 9.2 uses Unicode 17.0 ...`)

Thank you very much for all the care and knowledge, that you apply for each release of a new Racket version.  
_Kind regards._

---

<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 28, 2026, 4:46am UTC](https://racket.discourse.group/t/release-announcement-for-v9-2/4217/18 "2026-05-28T04:46:51Z")

</div>

Just under the wire! Sure, looks good to me. Many thanks!
