Skip to content

v0.17.0

Choose a tag to compare

@github-actions github-actions released this 09 Sep 09:31
· 36 commits to main since this release
d74bbd2

Osprey now compiles to iPhones and Android phones, and the boundary that gets it there is held to the same corpus and the same goldens as every other target.

iOS and Android targets

--target=ios, ios-sim, android-arm64 and android-x64 emit a static archive plus a generated C header. The boundary is scalar-only — int64_t, double, C bool, UTF-8 const char *, and void for a Unit return — and anything else is a compile error naming the offending signature, never a link error. osprey_main() runs top-level statements once and caches its status; extern fn declares a host import the final application link must satisfy.

Specs: iOS Target, Android Target, Reactive Mobile Applications.

One Osprey application, two native hosts

examples/mobile/inbox/ is a single Osprey project — model, update rules, GitHub decoding, SQL, Markdown annotation, filtering and the UI tree — compiled unchanged into a SwiftUI host and a Kotlin/JNI host. Two exports carry the whole boundary: osprey_mobile_start() and osprey_mobile_dispatch(model, event), each returning a JSON envelope the host renders natively. No new compiler feature, no UI language, no resumable effects.

The mobile boundary is tested against the whole corpus

Fourteen hand-picked goldens used to be the entire runtime evidence for both platforms, and a set that small cannot notice a boundary that truncates a string or drops a bool's high bits. Every accepted corpus program is now built as a mobile library, linked into a C host, executed on a simulator or device, and held to the byte-exact native golden — 130 goldens plus 18 GPU-lowering comparisons per slice, on ios-sim, android-arm64 and android-x64 alike.

The 79 programs the targets reject are pinned by name and reason in tests/MOBILE_UNPORTABLE.txt, shared by all three slices because they share one boundary implementation. The set is compared exactly in both directions: a new skip, a removed skip or a changed reason all fail the build, and there is no regeneration flag.

Language and compiler

  • Boxed any with shape descriptors, plus structural and tuple patterns (#212).
  • Resumption multiplicity — once, many and replayable declare how many times a request may be answered, enforced by a branch-aware affine pass, a replay check that names the first offending operation, and rejection of mut capture or a fiber boundary inside a many arm. abort, once, many and replayable remain legal identifiers.
  • Staged effects — static effect declarations, stage rows and kernel syntax in both flavors.
  • Owner tags travel with lowered signatures, and a generic function's returned lambda is specialised per call site (#229).
  • Terminal statement breaks, arithmetic effects, and four profiler defects fixed.
  • Codegen and ML lowering hardening (#223), and the no-inferable-annotation rule is now enforced across the tree (#221).
  • The formatter's meaning guard is honest, along with the two defects it was concealing (#222).

Tooling

Six TextMate grammar defects that left real ML and Default source uncoloured are fixed, and the extension now has grammar tests: twelve cases run the same vscode-textmate/oniguruma engine VS Code uses, then sweep all 268 .osp/.ospml files in the tree for split arrows, unscoped booleans, split ?: and always-keywords scoped as identifiers.

Install

brew install nimblesite/tap/osprey        # macOS / Linux
scoop bucket add nimblesite https://github.com/Nimblesite/scoop-bucket && scoop install osprey

The VS Code extension publishes to the Marketplace and Open VSX as nimblesite.osprey, bundling a version-matched compiler.

Full changelog: v0.16.0...v0.17.0