Skip to content

Release Notes

Siddhartha Kasivajhula edited this page Jan 22, 2025 · 8 revisions

Qi 5 (Jan 2025) - DRAFT

Backwards incompatibilities

  • Functional list operations are now matched literally instead of as datum literals, so that simply using (filter f) and (map g) in flows will no longer mean that these operations will be deforested by Qi's compiler. Instead, (require qi/list) is necessary. Without this, filter and map would literally simply match the built-in filter and map from racket/base, and these would be usable simply as host language functions, including via templates and partial application. These will not be deforested. On the other hand, qi/list's map and filter support Qi syntax in higher-order positions, don't support application templates (i.e., fine and blanket templates, which are usable for host functions only), and will be deforested.
  • (△ f) formerly accepted a list followed by any number of additional values that would be passed to each invocation of f along with the input list, to produce the result. Now, this instead accepts any number of lists as input, and corresponding elements of these lists are passed to f to produce each output value (resembling the zip operation common in many functional programming languages).

Qi 4 (Jan 2024)

Racket version compatibility

Qi formerly was supported on Racket 8.3+. It now works on Racket 8.5+.

Backwards incompatibilities

  • Qi syntax matches patterns literally rather than as datums, so Qi forms must be explicitly required and in scope in order to be used. Additionally, identically-named identifiers from other languages would need to be disambiguated in the require form, for instance by using prefix-in.
  • Mixing pure functions and undeclared effects (e.g. a displayln somewhere inside a function) is no longer honored (use an explicit side effect instead)
  • Higher-order functions that return functions to be used as flows now require an explicit esc, where formerly we could omit esc in this special case.
  • Formerly, Qi unintentionally accepted keyword arguments as flow inputs (e.g. (~>> (#:key identity 2 1 3) (sort <))). Keyword arguments are always accepted in partial applications, fine and blanket templates, but they are no longer accepted as runtime inputs (e.g. (~>> (2 1 3) (sort #:key identity <)) is still OK).
Clone this wiki locally