Version Compatibility
Which features are available in which Wyn version.
v1.21.0 (Current)
The Soundness Release - 88 fixes and 7 features, most of them in the gap between "wyn check says no errors" and a program that actually works. Http.accept no longer returns "" for a connection that sends no request, which used to kill any HTTP server via .to_int() on an empty string - one packet, no authentication, and routinely triggered by health checks and port scans. HashMap's four typed setters (set_int, set_string, set_bool, set_float) passed a WynHashMap* to a function that wrote through it as a WynJson*: a set/get pair silently disagreed, and AddressSanitizer reported a heap-buffer-overflow. Concurrent mutation of a HashMap/HashSet now panics with a named fix instead of corrupting buckets, matching what arrays and scalar globals already did (writer-vs-writer only). A variable whose first assignment was an interpolated string inside an if/else printed its pointer address. input() and input_float() were rewritten: a non-numeric line panics instead of returning 0, empty stdin no longer hangs forever, 12abc is rejected, the trailing newline is consumed, and 64-bit values survive (WYN_LENIENT=1 restores the old behaviour). Ok/Err/Some/None work as your own enum variant names again. spawn works on handlers named send/read/write/connect/accept. Integer overflow is now defined - Wyn ints wrap, two's complement, guaranteed (-fwrapv), where the optimiser was previously entitled to assume it could not happen. New: wyn build --app, wyn design, function-typed struct fields, and a -dev suffix on non-release builds. No breaking changes - drop-in upgrade from v1.20.x.
v1.20.0
The Concurrency & Correctness Release. Fire-and-forget spawn dispatches 1M tasks in ~0.67s; awaited spawn/await_all/parallel overlap cooperatively by default on the coroutine scheduler - no thread pool to size, no async coloring - and a channel-backpressure livelock is fixed. Task.try_recv now returns a proper int? (Some(v)/none). Richer recursive and nested data (recursive enums, linked lists, Result<Struct, string>). Experimental, opt-in GPU dispatch for [float].map via [gpu] in wyn.toml (Metal/OpenCL, float32, CPU fallback). A memory-safety sweep (string use-after-free, str.repeat() heap overflow, a run-queue data race) verified under AddressSanitizer and ThreadSanitizer; the test suite grew 210 → 237. No breaking changes - drop-in upgrade from v1.19.x.
v1.19.1
Identity and polish patch - no language changes, a drop-in upgrade from v1.19.0. wyn, wyn version, and wyn --help print a single script-friendly line instead of ASCII art (the visual identity - the wyvern-W emblem - lives at wynlang.com), and the installed binary resolves its runtime from the real executable path so wyn run works through PATH, not just as ./wyn.
v1.19.0
The DX Release - a real test runner (wyn test, where failing assertions now fail the run), working project templates (wyn new --template cli|api|web|lib), supply-chain auditing (wyn pkg audit), the first official web package, and string-parameter lambdas end to end (words.map((s) => s.upper())). Two hardening passes fixed every known silent-wrong-answer bug: == on structs, typed channels, mismatched collection stores as check-time errors, memoized await, nested Options, correct select dispatch, and println of structs/options. Every commit now runs under AddressSanitizer and ThreadSanitizer plus an install-layout canary. Curated C recipes grew 12 → 31. No breaking changes.
v1.18.0
The Correctness Release - a focused hardening pass found by dogfooding the whole corpus (all 48 sample-apps build): a heap-use-after-free fixed in codegen's string-var scope tracking (ASan-verified), .sort()/.reverse() as chainable expressions, match on a Result/Option inside a loop, and better struct/array element typing. C FFI reliability: wyn bind handles export-macro'd headers (unlocking lz4/zstd), and wyn add records pkg-config -L dirs so off-path libraries link. New wyn fix migrator for removed syntax. Drop-in upgrade from v1.17.
v1.17.0
The Ecosystem Release - a real package ecosystem. A git-URL package manager with no central registry: a dependency is just a git repo, wyn add args expands a bare name to github.com/wynlang/args, any repo/host/tag works, and publishing is git push + git tag. A C FFI that generates bindings from a header (wyn bind) and pulls nine curated C libraries (m, z, curl, sqlite3, crypto, ssl, curses, readline, xml2) end to end with wyn add - proven against SQLite via Ptr cells for C out-parameters. Concurrency now runs on a coroutine scheduler by default (cooperative I/O everywhere) with cooperative task cancellation, and print() is properly Python-style. Breaking changes: the |> pipe operator, the &&/||/! operators, and try/catch/throw are gone (use and/or/not and Result); import m now requires qualified calls (m.foo()); and the pkg.wynlang.com registry and its wyn pkg register/login/publish commands are removed in favour of git URLs. Migration is mechanical.
v1.16.0
The Batteries Release - a working C FFI: extern fn with correct int/float/bool/string/void type mapping, and C-library linking via a new [ffi] section in wyn.toml (libs/lib_dirs/include_dirs). Plus Pythonic sugar: range(a, b) / range(a, b, step) as a for-loop iterator (descending on a negative step), and if let <pattern> = <expr> { … } else { … } conditional binding on any Option/Result. Backward compatible - no source changes required. See What's New in v1.16.
v1.15.0
The Payloads Release - float? / bool? and Result<float, _> / Result<bool, _> now compile in every position (return, Some/None/Ok/Err, statement- and expression-position match, and the .is_some() / .unwrap() / .unwrap_or() methods); previously only int and string payloads worked. Function names can now shadow C standard-library symbols like connect, read, write, and socket. Backward compatible - no source changes required. See What's New in v1.15.
v1.14.0
The Polish Release - clean optional and result return types (-> int?, -> string?, -> Result<int, string> instead of the old mangled names), match as an expression on any Option/Result (var msg = match r { Ok(v) => …, Err(e) => … }), type-inferred default arguments (fn greet(who = "world")), println(array), negative string indexing (s[-1]), and if/else where all branches return no longer needs a trailing return. Backward compatible - no source changes required. See What's New in v1.14.
v1.13.0
The Pythonic Release - in / not in membership (arrays, strings, maps), negative indexing (a[-1]), open-ended slices (a[:2], a[2:], a[:]), map iteration (for k, v in map), tuple unpacking and swap (var a, b = 1, 2, a, b = b, a), and Some/None/Ok/Err for any payload type in any context. Backward compatible - no source changes required. See What's New in v1.13.
v1.12.0
The Hardening Release - memory-safety fixes (string use-after-free, print/println double-free, Db.query/Json.keys heap overflow, 512-byte interpolation truncation), cooperative Time.sleep for fire-and-forget spawn, and a warning-clean build. All memory fixes verified under AddressSanitizer. Drop-in upgrade - no source changes required. See What's New in v1.12.
v1.11.0
The Developer Experience Release - enum.to_string(), for i, v in arr, int? optionals, "ha" * 3 string repeat, wyn test cross-platform, wyn fmt, typed arrays, better error messages.
v1.10.0
The Quality Release - zero memory leaks, much faster string append (StringBuilder: 1M appends in 14ms), a working .sort() (it was a no-op in v1.9), and 50KB --release binaries. Switched to real OS threads (replacing v1.8 green threads).
v1.9.0
- Coroutine-based concurrency (
spawn/await) - Channels (
Task.send/Task.recv/Task.select_2) - I/O event loop (kqueue/epoll)
wyn benchwith statisticswyn doc --htmlwyn fmtcode formatterwyn testtest runnerwyn replinteractive modewyn watchauto-rebuild- Online playground
- Package lockfile (
wyn.lock) - WebSocket and JWT packages
- Source maps (
#linedirectives) Math.checked_add/sub/mulToml.parse/getBcrypt.hash/verifyLog.info/warn/error/debugBase64.encode/decodeRegex_match/replaceArgs.get/hasUuid.v4()--mem-statsflag- PGO support (
--pgo)
v1.7.0
- Generic functions (monomorphization)
- Pattern matching (
match) - Data enums with associated values
- Pipe operator (
|>) - String interpolation (
${expr}) - Package system (
wyn.toml) - 36 official packages
- VS Code extension
- Neovim plugin
- Extension methods on structs
v1.6.0
- Module system (
import) - Visibility (
pub) - Namespace imports
- Multi-file compilation
v1.5.0
- HTTP server (
Http.listen/Http.accept) - SQLite (
Db.open/Db.query) - JSON parsing
- File I/O
- Networking (TCP sockets)
- HashMap and HashSet
v1.4.0
- Structs with methods
- Enums (simple)
- For-in loops
- Array methods (push, pop, map, filter)
v1.3.0
- Float support
- String methods (upper, lower, trim, split, replace)
- Math module
- Error handling (Result type)
v1.2.0
- Functions with return types
- If/else expressions
- While loops
- Constants (
const)
v1.1.0
- Basic types (int, string, bool)
- Variables (
var) - Print/println
- Basic arithmetic
See Also
- What's New in v1.16 - the Batteries Release
- What's New in v1.15 - the Payloads Release
- What's New in v1.14 - the Polish Release
- What's New in v1.13
- What's New in v1.12
- What's New in v1.11
- Known Limitations - current limitations