Changelog

User-visible changes: language behavior, the command line, tooling, and documentation. Each release entry says what changed for a reader first and links to the page that covers it.

0.2.0

In development. Published as weekly 0.2.0.devYYYYMMDD snapshots.

The binding forms are realigned. Source written for 0.1.0 needs migrating. Most old spellings raise errors; two change meaning, because both shapes are valid under the new forms: (define [x] value) is now a function x of no formals returning the value, where 0.1.0 bound x to the value, and (class NAME SUPERS body ...) as an expression now binds NAME and evaluates to None, where 0.1.0 built the class as a value.

  • var binds a value and def a function, in the scope the form appears in; var over a bracket pattern unpacks. See var and def.

  • class defines and binds a class; build-class builds one without binding it. define-class and define-dataclass are removed: write @dataclass above class. See class.

  • global is a prefix over var, def, class and syntax that binds the form at the module; global var x is the idiomatic spelling of define-global x, which remains as the primitive. In block form the word after global decides how the block reads, so global class NAME: may omit the superclass list. local is removed. See global.

  • define takes Scheme’s shape, (define [f x] body...) for a function and (define x value) for a value; the old (define f [x] body...) no longer matches. A return type bundles with the name as a typed formal does, (define [(f :: int) x] body...); the inline [f :: int x] of 0.1.0 is rejected. See define and Bindings and refs.

  • syntax defines a transformer, scoped to the rest of a body when written inside one. extend-syntax extends the module’s transformer from inside a body too, with the new arms present once the form has run. See extend-syntax.

  • A decorator line over a declaration, var x with no value, is a compile error; a typed value, var x :: int 0, is decorated with its annotation kept. See decorate.

  • define-demanding and define-coroutine are removed: write @demand or @coroutine-fn above def.

  • The import-from block layout is removed. A long member list wraps in the parenthesised form, with the continuation lines indented inside the parens; an import-from M: block now reads through the default block layout and does not import. See import-from.

  • (vars) with no operand is the current namespace and replaces (locals); koskari-vars is its runtime counterpart, and namespaces print their members. See vars and koskari-vars.

0.1.0

Published as weekly 0.1.0.devYYYYMMDD snapshots; no final 0.1.0 was released.

  • S-expressions and an indentation layout that reads to the same forms: a line with more than one element is a call, and a line ending in a colon opens a block.

  • A stackless bytecode evaluator with tail calls, generators, delimited and full continuations, dynamic wind, and ambient await.

  • Special forms, bootstrap macros, define-syntax with template and procedural transformers, and hygiene.

  • Python interoperability in both directions: .ki modules import through the standard import system, and every value is a Python object.

  • Runtime match patterns, by-reference parameters, decorators with graft and call-time forms, fenced foreign literals, and module pragmas.

  • The koskari command, .kio compilation, a language server, and editor support for Emacs, Helix, and TextMate.

  • Documentation: a quickstart, the Little Koskari and From Python tutorials, the guide, and the reference.