|
| 1 | +#lang at-exp racket |
| 2 | + |
| 3 | +;; this file represents the release notes, and generates both |
| 4 | +;; the txt file format used for the announcement.txt file and |
| 5 | +;; the markdown used for the blog post. |
| 6 | + |
| 7 | +(require "render-release-notes.rkt" |
| 8 | + "check-links.rkt") |
| 9 | + |
| 10 | +(define major-v 8) |
| 11 | +(define minor-v 17) |
| 12 | + |
| 13 | +(define version (~a "v"major-v"."minor-v)) |
| 14 | + |
| 15 | +;; call (go) to generate the release-notes files; this overwrites several paths in |
| 16 | +;; /tmp |
| 17 | + |
| 18 | +(define blog-post-url |
| 19 | + (match* (major-v minor-v) |
| 20 | + [(8 16) "https://blog.racket-lang.org/2025/01/racket-v8-16.html"] |
| 21 | + [(8 17) "https://blog.racket-lang.org/2025/05/racket-v8-17.html"])) |
| 22 | + |
| 23 | + |
| 24 | + |
| 25 | + |
| 26 | +;; inferred url abstraction... |
| 27 | + |
| 28 | +(define (dur str) |
| 29 | + (string-append "https://docs.racket-lang.org/" str)) |
| 30 | +(define (rur str) |
| 31 | + (dur (string-append "reference/" str))) |
| 32 | + |
| 33 | +(define dr-core-url |
| 34 | + "https://github.com/racket/drracket/commit/ae16d6bc6e00a9498313cff035537ac98ef71194") |
| 35 | + |
| 36 | +(define bfs-url |
| 37 | + (rur "generic-numbers.html#%28def._%28%28quote._~23~25kernel%29._bitwise-first-bit-set%29%29")) |
| 38 | + |
| 39 | + |
| 40 | +(define bullets |
| 41 | + (list |
| 42 | + |
| 43 | +@bullet{The new @link[dr-core-url]{`drracket-core`} package provides a version of drracket with |
| 44 | + a smaller set of dependencies.} |
| 45 | + |
| 46 | +@bullet{Typed Racket has support for @link[(rur "treelist.html")]{treelists}.} |
| 47 | + |
| 48 | +@bullet{The package manager computes checksums for packages when required, |
| 49 | + allowing the use and automatic upgrade of packages without them.} |
| 50 | + |
| 51 | +@bullet{The @link[bfs-url]{`bitwise-first-bit-set`} function returns the smallest bit that is |
| 52 | + set in the twos-complement representation of the given number.} |
| 53 | + |
| 54 | +@bullet{The updated `dynamic-require` function makes it easier to use |
| 55 | + syntax bindings by allowing a syntax-thunk (or 'eval) to be used for them.} |
| 56 | + |
| 57 | +@bullet{The `error-module-path->string-handler` parameter allows the customization |
| 58 | + of the display of module-paths in error messages.} |
| 59 | + |
| 60 | +@bullet{Precision of certain numeric functions (`sin`, `cos`, and others) is |
| 61 | + improved on Windows platforms by using the MSVCRT/UCRT libraries.} |
| 62 | + |
| 63 | +@bullet{The `string-append` function has improved performance and reduced memory |
| 64 | + use for long lists of strings in the Racket CS implementation. |
| 65 | + Differences are clearly noticeable for lists of length 1 million.} |
| 66 | + |
| 67 | +@bullet{TCP ports use `SO_KEEPALIVE`, instructing the kernel to send periodic |
| 68 | + messages while waiting for data to check whether the connection |
| 69 | + is still responsive} |
| 70 | + |
| 71 | +@bullet{Racket code using a terminal in Windows can receive mouse events as |
| 72 | + virtual terminal characters after using SetConsoleMode. (This is also |
| 73 | + already possible on macOS and Linux.) See the |
| 74 | + @link["https://docs.racket-lang.org/tui-term/index.html"]{tui-term} package |
| 75 | + for related example code.} |
| 76 | + |
| 77 | +@bullet{The `#:replace-malformed-surrogate?` keyword can be used to specify |
| 78 | + a replacement for malformed unicode surrogates in JSON input} |
| 79 | + |
| 80 | +@bullet{The http-client module no longer sends "Content-Length: 0" for |
| 81 | + requests without a body.} |
| 82 | + |
| 83 | +@bullet{The demodularizer (`compiler/demod`) can prune more unused assignments} |
| 84 | + |
| 85 | +@bullet{Several judgment rendering forms in Redex are replaced by functions, allowing |
| 86 | + more convenient abstraction.} |
| 87 | + |
| 88 | +@bullet{When a distribution includes no teaching languages, DrRacket’s language-dialog |
| 89 | + configuration moves into the preferences dialog and the “Language” menu disappears.} |
| 90 | + |
| 91 | +@bullet{The math library has better support for block-diagonal matrices, including |
| 92 | + both Racket and Typed Racket.} |
| 93 | + |
| 94 | +@bullet{The math library contains improved implementations of acos and |
| 95 | + matrix-(cos-)angle.} |
| 96 | + |
| 97 | +@bullet{The stepper again works for `big-bang` programs.} |
| 98 | + |
| 99 | +@bullet{There are many other repairs and documentation imprevements! |
| 100 | +} |
| 101 | + |
| 102 | + |
| 103 | + |
| 104 | +@;{ @sub-bullet{@link[(rur "treelist.html#%28part._.Mutable_.Treelists%29")]{Mutable treelists} are @link[(rur "serialization.html")]{serializable}.}} |
| 105 | + |
| 106 | + |
| 107 | + |
| 108 | + |
| 109 | + |
| 110 | + )) |
| 111 | + |
| 112 | +(define contributors |
| 113 | + (list "Alexander Shopov" "Andrei Dorian Duma" "Bert De Ketelaere" "Bob Burger" "Bogdan Popa" |
| 114 | + "Bogdana Vereha" "Cameron Moy" "Chung-chieh Shan" "Cutie Deng" "D. Ben Knoble" "Dario Hamidi" |
| 115 | + "Dominik Pantůček" "Gustavo Massaccesi" "halfminami" "Jacqueline Firth" "Jason Hemann" |
| 116 | + "Jens Axel Søgaard" "Joel Dueck" "John Clements" "Jordan Harman" "Marc Nieper-Wißkirchen" |
| 117 | + "Matthew Flatt" "Matthias Felleisen" "Mike Sperber" "Noah Ma" "owaddell-ib" "Philippe Meunier" |
| 118 | + "Robby Findler" "Ryan Culpepper" "Ryan Ficklin" "Sam Phillips" "Sam Tobin-Hochstadt" "Shu-Hung You" |
| 119 | + "sogaiu" "Sorawee Porncharoenwase" "Stephen De Gabrielle" "Vincent Lee" "Wing Hei Chan")) |
| 120 | + |
| 121 | +(define (go) |
| 122 | + ;; abstraction between these two OBVIOUSLY possible, waiting on this until the first time |
| 123 | + ;; we need to change them... |
| 124 | + (with-output-to-file "/tmp/release-notes.txt" |
| 125 | + #:exists 'truncate |
| 126 | + (λ ()(displayln horizontal-bar) |
| 127 | + (newline) |
| 128 | + (for-each display-lines (map txt-render-bullet bullets)) |
| 129 | + (newline) |
| 130 | + (displayln "The following people contributed to this release:") |
| 131 | + (newline) |
| 132 | + (for-each displayln (render-contributors contributors)) |
| 133 | + (newline) |
| 134 | + (displayln horizontal-bar))) |
| 135 | + (with-output-to-file "/tmp/release-notes.md" |
| 136 | + #:exists 'truncate |
| 137 | + (λ ()(displayln horizontal-bar) |
| 138 | + (display-lines |
| 139 | + (list |
| 140 | + "" |
| 141 | + (~a "We are pleased to announce Racket "version" is now available from [https://download.racket-lang.org/](https://download.racket-lang.org).") |
| 142 | + "" |
| 143 | + "## As of this release:" |
| 144 | + "")) |
| 145 | + (for-each display-lines (map md-render-bullet bullets)) |
| 146 | + (newline) |
| 147 | + (displayln "## Thank you") |
| 148 | + (newline) |
| 149 | + (displayln "The following people contributed to this release:") |
| 150 | + (newline) |
| 151 | + (for-each displayln (render-contributors contributors)) |
| 152 | + (newline) |
| 153 | + (displayln markdown-closing-block) |
| 154 | + (map displayln share-block)))) |
| 155 | + |
| 156 | +(define markdown-closing-block |
| 157 | + #<<| |
| 158 | +_Racket is a community developed open source project and we welcome new |
| 159 | +contributors. See |
| 160 | +[racket/README.md](https://github.com/racket/racket/blob/master/README.md#contributing) |
| 161 | +to learn how you can be a part of this amazing project._ |
| 162 | + |
| 163 | +## Feedback Welcome |
| 164 | + |
| 165 | +Questions and discussion welcome at the Racket community |
| 166 | +[Discourse](https://racket.discourse.group/invites/VxkBcXY7yL) or |
| 167 | +[Discord](https://discord.gg/6Zq8sH5) |
| 168 | + |
| 169 | +## Please share |
| 170 | + |
| 171 | +If you can - please help get the word out to users and platform specific repo packagers |
| 172 | +| |
| 173 | +) |
| 174 | + |
| 175 | +(define no-v-version (~a major-v"."minor-v)) |
| 176 | +(define blog-post-url-line |
| 177 | + (~a "Racket - the Language-Oriented Programming Language - version "no-v-version" is now available from https://download.racket-lang.org")) |
| 178 | + |
| 179 | +(define blog-post-reference-line |
| 180 | + (~a "See "blog-post-url" for the release announcement and highlights.")) |
| 181 | + |
| 182 | + |
| 183 | +(define share-block |
| 184 | + (list |
| 185 | + "```" |
| 186 | + blog-post-url-line |
| 187 | + "" |
| 188 | + blog-post-reference-line |
| 189 | + "```")) |
| 190 | + |
| 191 | +;; ensure that all links contained in the release bullets are "live", in |
| 192 | +;; the sense that a head request returns a 200 okay response from the |
| 193 | +;; corresponting server |
| 194 | +(define (check-links) |
| 195 | + (define links |
| 196 | + (apply append |
| 197 | + (map bullet-links bullets))) |
| 198 | + (for ([l links]) |
| 199 | + (define response (url-str-response l)) |
| 200 | + (when (not (equal? response 'okay)) |
| 201 | + (eprintf "fail:\n ~v\n ~v\n\n" |
| 202 | + response l)))) |
| 203 | + |
| 204 | + |
0 commit comments