Skip to content

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 bench with statistics
  • wyn doc --html
  • wyn fmt code formatter
  • wyn test test runner
  • wyn repl interactive mode
  • wyn watch auto-rebuild
  • Online playground
  • Package lockfile (wyn.lock)
  • WebSocket and JWT packages
  • Source maps (#line directives)
  • Math.checked_add/sub/mul
  • Toml.parse/get
  • Bcrypt.hash/verify
  • Log.info/warn/error/debug
  • Base64.encode/decode
  • Regex_match/replace
  • Args.get/has
  • Uuid.v4()
  • --mem-stats flag
  • 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

MIT License - v1.21.0