FunctionalScriptCLIPRsReleasesPlaygroundGitHub ↗

root / changelog / 0.56.0

← Previous: 0.55.0 · Next: 0.57.0 →
  • compiler: reads a one-variable loop, let x = init; then while (c) { … } holding consts and assignments to x, lowered to a self-call; break, continue, a nested loop and any other let are refused. (#2854)
  • compiler/serializer, edag/rust: a function of the loop's shape, r => c ? self(n) : r, is written as a while or a Rust loop and runs in constant stack; edag/loop exports loopOf, keepsRecursion and reaches. (#2854, #2857, #2867, #2870)
  • edag/memo, edag/amnesia: a call in tail position is made in the invocation's place, so any chain of tail calls runs in constant host stack; edag/value/call adds prepare, settle and invoker. (#2879)
  • compiler: destructuring in const and in fixed parameters, object and array patterns nested freely; rest elements, defaults and computed keys other than a literal are refused. (#2861, #2878)
  • compiler: admits computed property keys, { [k]: v }, with any value in the brackets; AstMember's key is an AstConst, and the serializer writes a non-string key in brackets. (#2828)
  • compiler: admits the static functions Object.is, Number.isInteger, Number.isSafeInteger, Number.isNaN and Number.isFinite, as values in every spelling and through const { is } = Object; Object is a reserved word. (#2914, #2932, #2936)
  • compiler/parser/syntax: Member is ConstantMember | ComputedMember, a parameter list is { fixed, rest }, a const or a fixed parameter binds a BindingTarget, and a block statement may be a let or a while. (#2828, #2854, #2861, #2878)
  • js/prototype: toLowerCase and toUpperCase are allowed calls with JavaScript's meaning at Unicode 17.0.0, the version the pinned Rust's standard library carries; NaNVM answers both. (#2864)
  • js/runtime: new; the built-ins' bodies written once in FunctionalScript, member.String.startsWith and, under static, Object.is and the four Number predicates; js/static lists the admitted static paths. (#2880, #2886, #2887, #2914, #2932, #2936)
  • compiler, compiler/transpiler: interpret, transpile, outputText and compileFile take a RuntimeLoad first, packageRuntime(root) or noRuntime; ParseContext is removed. effects/node's NodeProgramOptions requires packageRoot. (#2880, #2909)
  • edag: the is operation node is removed; a static function is a value node of its name, ['Object.is'], listed in staticIds. nanvm-lib drops vm::unstable::object_is. (#2851, #2914, #2932)
  • types/number: is_integer and is_safe_integer are removed; call Number.isInteger and Number.isSafeInteger, which FunctionalScript now admits. Add min, max and isNegativeZero; types/bigint/from_number adds bigint. (#2836, #2851, #2858, #2936)
  • nanvm/member, website/style, website/prs/load: module.f.mjs becomes module.f.js, and emergent_testing/example.f.mjs becomes example.f.js; update direct imports. (#2825, #2856, #2882)
  • path: add parent, basename and ancestors; path/import's decode and resolve answer null for a specifier rooted at //. (#2908, #2947)
  • web: an absolute-form target whose authority the Host grammar refuses, such as an unclosed bracket, a bad or second port or a lone ., answers 400 malformed request URL. (#2900)
  • media: add jsonDialect, the kit revision, lock and note share; validate refuses NaN and ±Infinity, encodeText asserts on a leaf JSON cannot spell, and revision refuses a -0 generation. (#2945)
  • git/config: exports values, every assignment of a key in file order, and Git's last-wins readers lastValue, lastInt and lastBool; tryOidBytes moves to git/store and takes the parsed entries. (#2910)
  • git/refstore: nameText, nameForMessage and refsPrefix move to git/refstore/name, and dirOf to git/refstore/scope; the store no longer exports them. (#2907)
  • effects/node: Overrun and Underrun move from virtual/types.ts to effects/node/types.ts; add pumpCell, writeChunks(path, chunks) and writeFiles(files). effects/node/virtual adds virtualAt(root). (#2803, #2901, #2911, #2912)
  • types/bit_vec: add padLastBlockMsb and unpadMsb; basen/cbase32 encodes the largest bit vector on every runtime, and its demo accepts text up to maxLengthBytes. (#2939)
  • text/utf16: add isWellFormed and floorCodePointBoundary; js/string_escape adds stringLiteral, the one writer of double-quoted literals. (#2892, #2902)
  • media/json: the standard codec adds marked, its text as marked chunks; media/json/parser exports tagged, Tagged and textAt. (#2842, #2913)
  • types/array, ebnf/lib/js, ebnf/ast, effects, edag/analysis: add occurrences, isTrivia, variant and items, commandsOf, and scopeHolds. (#2889, #2891, #2897, #2898, #2918)
  • compiler/ast: add unaryTags, isUnary, AstUnary and UnaryTag; rtti/common adds containerRead, constContainerRead, restContainerRead and noAccumulate. (#2905, #2906)
  • cli: exports helpMeta, helpReference and the CommandReference, DocumentedCommand and DocumentedCommands types, from which the website's new /cli/ reference is generated. (#2834)
  • nanvm/methods, nanvm/values, nanvm/commands: the directory exports are removed; each path names its generated file whole. (#2934)
  • crypto/sign: the demo is an Alice, Eve and Bob exchange, and its state carries intercepted and received snapshots in place of editable r and s; the signing and verification APIs are unchanged. (#2830)
  • website/demo: textField and textDemo take an optional highlight; website/demo/highlight adds codeOutput, website/demo/railroad adds grammarDemo, and compiler/stage_demo is new. (#2840, #2893, #2921)
  • website: a CLI reference at /cli/, an elliptic curve playground on crypto/secp, VDF timings, coloured compiler sources and JSON output, and Loop, Destructuring and Static functions compiler examples. (#2834, #2840, #2842, #2861, #2866, #2868, #2874, #2932)
  • website: the Rust crates' rustdoc is published under /cargo.doc/ with the site's header, footer and favicon; the Cloudflare build installs the pinned Rust through a generated gen.cloudflare/build.sh. (#2803, #2843, #2846, #2848)
  • nanvm-lib: IVm requires From<Unpacked<Self>> in place of one From per value kind and gains runtime_method and runtime_static; vm::runtime_object and vm::static_binding bind the compiled js/runtime. (#2880, #2887, #2914, #2946)
  • nanvm-lib: add From<Primitive<A>> for Any<A>, TryFrom<Array<A>> for [Any<A>; N], Any::defined, Unpacked::is_undefined and Number::decompose; Primitive and Numeric compare and print for every VM. (#2896, #2904, #2926, #2940, #2942)
  • package.json, ci: Nixpkgs moves to 240fddad, bringing Node 26.11.1, and Bun to 1.4.3; engines.node is exactly 26.11.1, and .node-version and the lockfile match. (#2849)
  • Tested toolset: Node 26.11.1, Deno 2.8.3, Bun 1.4.3, Rust 1.99.0, TypeScript (typescript-go) 7.0.2, Wasmtime 45.0.2, Wasmer 7.1.0. (#2849)
Support FunctionalScript: GitHub Sponsors ↗ · Open Collective ↗ · Patreon ↗