Release Announcement for v9.2

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 quoted 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.


2 Likes

Links added.

These are what the links are expected to be. I took the links from Racket 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 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 quoted 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.
- 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.

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

1 Like

Thanks @LiberalArtist

- 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.

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

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"?

1 Like

I think it was this commit: Reject non-linear `match` patterns with mismatched ellipsis depth · racket/racket@c42ebbf · GitHub

I think a link will be sufficient

- 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.
  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
  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
  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?
  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.

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 quoted 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.


1 Like

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.

1 Like

Two more nits:

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

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.

made these changes, thanks

1 Like

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.
  • 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, see this pull request.
  • 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 function counts bytes written to ports connected to a terminal, such as stdin and stderr.
  • Cross-phase persistent modules allow more types of quoted 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!

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.
  • 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" foreign interface (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 quoted 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!
  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.

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

  • The 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.
  • 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.
  • The #%foreign-inline 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 function counts bytes written to ports connected to a terminal, such as stdin and stderr.
  • Cross-phase persistent modules allow more types of quoted data.
  • 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!

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.

1 Like

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

1 Like