Repository navigation
v0.17.0
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
anywith shape descriptors, plus structural and tuple patterns (#212). - Resumption multiplicity —
once,manyandreplayabledeclare 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 ofmutcapture or a fiber boundary inside amanyarm.abort,once,manyandreplayableremain legal identifiers. - Staged effects —
staticeffect 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 ospreyThe 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