fuzion-lang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

2026-10-12: Fuzion October Update

Last month brought a couple of big news: The first release of the Feeze Scheduler Tracer tool and some huge changes to Fuzion like changing the default integer type to i64 and adding fearless concurrency that separates synchronization means from code using it via mutate effect type polymorphism.

  • General
    • A new website for the Feeze Scheduler Tracer tool went online. Documentation and releases can be found there.

  • Fuzion language
    • change default integer type from i32 to i64 (#7571)

  • Base library
    • New library features

      • add concur.atomic_mutate (#7645)

        We can now create a function that provides a thread-safe counter as follows

          counter(M type : mutate) is
            cnt := M.var 0
        
            increment =>
              c.update +1
                       
        and then call it using a local instance derived from concur.atomic_mutate as follows
          mymut : atomic_mutate is
          mymut ! ()->
            c := counter mymut
            concur.Threads.env.spawn ()->
              ...
              c.increment
              ...
            ...
                      
        This will use an atomic compare-and-swap operation to ensure atomicity.

        However, if this counter is used locally in a single thread, we do not need any synchronization and we can avoid the cost of using compare-and-swap by using a local mutate:

          mymut : mutate is
          mymut ! ()->
            c := counter mymut
            ...
            c.increment
            ...
                      
        Then, it will be ensured that all accesses are thread-local.

        In case there is synchronizing between threads anyway, we can as well use a blocking mutate:

          mymut : blocking_mutate is
          mymut ! ()->
            c := counter mymut
            concur.Threads.env.spawn ()->
              ...
              c.increment
              ...
            ...
                      
        which will ensure that the increment operation is protected by a mutex.

        Essentially, we can develop library code that is thread-safe without specifying how this thread-safety will be achieved.

      • add memoize.const to memoize the result of nullary functions (#7785)

        With this, we can use turn an expensive nullary function like this approximation for pi

          pi =>
            (4.0 :: (-)).zip (1.0 :: +2) (/)   # 4/1, -4/3, 4/5, -4/7, ...
                        .take 10000
                        .sum
                      
        into a function whose result will be calculated on the first call and reused during repeated calls:
          pi : memoize =>
            const ()->
              (4.0 :: (-)).zip (1.0 :: +2) (/)   # 4/1, -4/3, 4/5, -4/7, ...
                          .take 10000
                          .sum
                    
      • memoize globally, not only thread-locally (#7806)

        The API to memoize a function like this

          fib(n) =>
            if n <= 1 then 1 else fib n-1 + fib n-2
                      
        has not changed: inherit from memoize and use keep to map inputs to stored results:
          fib(n) : memoize => keep n _->
            if n <= 1 then 1 else fib n-1 + fib n-2
                      
        however, now the results are stored globally and locally such that even in multi-threaded uses of the memoized function, the value will be calculated only once but synchronization is required at most once per thread to get a local copy of the pre-calculated result.

      • added helpers to codepoint (#7685) to handle invalid codepoints and replace them by "�"

      • implementation of f64.fits_in_i64 no longer accepts 2^63 (#7852)

      • implement encodings.html.decode (#7644)

      • implement orderable, hashable for nil (#7718)

      • implement orderable instead of equatable and related comments/changes (#7664)

    • Changed library features

      • better implementation for Set.type.equality, now panics for infinite sets (#7740)

      • changed logic in buffered.read_string (#7696)

      • changed impl of switch.type.equality/lteq such that option = nil is valid even if the option's value is not equatable (#7810)

      • changed outcome/error.as_string to display --error: msg-- in case of an error (#7662)

      • changed return type of sign from i32 to i64 (#7788)

      • cleanup in switch features (#7701)

      • cleanup Map creation (#7714)

      • codepoint, cache latin_alphabet (#7770)

      • don't panic in interval.size_option (#7818)

      • don't produce an empty string for leading matches in String.split_if (#7816)

      • effect.type.instate use compile_time_panic instead of panic (#7811)

      • enhancements of container.Doubly_Linked_List (#7713)

      • made numeric.from_u32 tail recursive (#7797)

      • made Mutable_Tree_Map a ref type (#7854)

      • marked buffered.read_ features as type features (#7683)

      • read_fully, read_lines, read_delimiter_full return outcome (#7608)

      • refine result type of Read.env.next (#7796)

      • rename mutate.new as mutate.var (#7730)

      • rename time.precision to time.units (#7681)

      • simply use or_panic for operations that are expected to never fail (#7716)

      • split up equals.fz into three different operators_* files (#7813)

      • switch, implement generic versions of type.equality, type.lteq, type.hash_code (#7690)

      • io.dir.traverse, fix usage example, missing a backslash (#7795)

      • use actual name of outer feature in error message (#7679)

      • use full error.as_string not just msg when causing fault (#7838)

      • Writer.flush simplify implementation add NYI comment (#7833)

      • interval: add note about naming in the mathematical sense (#7686)

      • interval: add O(1) first and last (#7423) (#7600)

      • interval: fix contains, add O(1) nth, index_of, size_option, equality (#7673)

      • update to unicode 18 (#7786)

    • Removed library features

      • remove container.set_of, set_of_hashable (#7757)

      • remove some is_* feature, replace by = or != (#7805)

        The rationale is that for a value v of a switch type like option, testing if the contained value is a unit-type value like nil can be done done using v = nil, there is no need for a dedicated feature v.is_nil.

      • remove atomic field in value effect pipe (#7698)

  • Other library modules
    • concur module

      • task_pool: fix effect annotations (#7772)

    • wolfssl module

      • provide default wolfssl_lm (#7849)

  • Parser
    • allow multi-line strings to start with one or more empty lines (#7642)

    • fix parsing of effect annotations in feature signatures (#7700)

  • Front end
    • fix#7415: adjust type of constraints in a call when inferring type pars (#7657)

    • fix crash due to empty contract not defining args supplier (#7739)

    • warn for unused fields that get placed in internal features by syntax sugar (#7693)

    • in error incompatible type parameter, add positive list of types actual is assignable to (#7654)

    • fix crash in Function.propagateTypeAndInferResult (#7748)

    • add workaround in AbstractType.compareTo (#7717)

    • change logic of isEffectFeature (#7768)

    • cleanup old NYI referencing #478 (#7855)

    • consider type features as partially applicable alternatives (#7790)

    • do initial value from call only if urgent (#7762)

    • fix null pointer exception in choiceGenerics (#7660)

    • fix require condition in Expr.unwrap (#7802)

    • fix require-condition in isLambdaTarget (#7672)

    • minor refactoring in Call (#7799)

    • raise error when effect feature is called directly not via env (#7667)

    • robuster code for #7747 when inferring type pars and their count is wrong (#7749)

    • added two conditions to the filter (#7756)

    • try remove explicit resolveTypesOfActuals in loadCalledFeatureUnlessTargetVoid (#7761)

  • Middle end
    • fuir: callIsTailCall ensure that it returns true for all internal code (#7819)

    • fuir/be: simplify callIsTailCall (#7766)

    • fuir: refine isConst (#7827)

    • ir: fix boxing if ref to be boxed to is in nested choice (#7737)

  • Runtime System
    • assert success of some fundamental calls (#7773)

    • fzE_file_write, fix logical error in result comparison (#7648)

    • retry system calls on EINTR (#7656)

    • simplify fzE_file_read by using read instead of fread (#7539)

    • disable Java preview features (#7750)

  • Backends
    • C backend

      • add -DNDEBUG for none debug builds (#7778)

    • JVM backend

      • int/jvm: fix boxing (#7724)

      • minor improvements for stacktrace readability (#7767)

  • Windows
    • assert non zero truncation (#7847)

    • cleanup fzE_get_peer_address (#7697)

    • fzE_lstat, CloseHandle only if not INVALID_HANDLE_VALUE (#7850)

    • retry downloading gc tar ball on checksum failure (#7844)

    • support exit code 259 in fzE_process_poll (#7843)

    • support for TERM and KILL signal (#7687)

  • Tests
    • fix interval test to use i64 instead of i32 (#7704)

    • add more examples from #7720 (#7738)

    • add reg test for #2749 (#7661)

    • add reg test for #7184 (#7744)

    • decrease test sizes in priority queue test (#7764)

    • don't skip lsp test, compile instead (#7775)

    • extend negative test for multi-line strings (#7695)

    • fuzion_runtime_stackoverflow do not rely on concat_list (#7804)

    • test choice type containing another choice type (#7729)

    • use i64 instead of i32 in lru_cache and priority_queue tests (#7691)

    • In check_simple_example, ignore lambda names fun22 vs. fun27. (#7814)

    • use i64 instead of i32 in lru_cache and priority_queue tests (#7691)

    • fix interval test to use i64 instead of i32 (#7704)

    • add more examples from #7720 (#7738)

    • add reg test for #2749 (#7661)

    • add reg test for #7184 (#7744)

    • decrease test sizes in priority queue test (#7764)

    • don't skip lsp test, compile instead (#7775)

    • extend negative test for multi-line strings (#7695)

    • fuzion_runtime_stackoverflow do not rely on concat_list (#7804)

    • In check_simple_example, ignore lambda names fun22 vs. fun27. (#7814)

    • test choice type containing another choice type (#7729)

  • Build Infrastructure
    • actions: CodeQL: bump github/codeql-action from 4.37.5 to 4.37.9 (#7680)

    • add editorconfig (#7677)

    • Dockerfile: bump DFA max iterations to fix fzweb benchmarks (#7733)

    • extra tests: split up windows/macOS (#7848)

    • ci/release: build src and binaries for linux, macOS and windows on amd64/arm64 (#7793)

    • ci/release: smoke test (#7842)

  • Fuzion Webserver
    • src/global: evict sessions in one permanently running thread (#469)

    • vibe coded documentation for from_type_string (#476)

    • src/Session: use blocking_mutate for last_accessed (#465)

    • fix blocking_mutate not instated in benchmarks (#467)

    • src/runner: replace use of atomic by blocking mutate (#477)

    • src/runner: swap instation of blocking mutate and thread pool (#480)

    • src/Session: replace atomic with blocking mutate for connection (#484)

  • Feeze

    The first public release of Feeze was made!

    • doc: single installation guide in doc/Manual.md (#148)

    • gui: add keyboard shortcut F11 to toggle full screen (#147, #150)

    • Build Infrastructure

      • change name and tag (#158)

      • remove platform from release file and version (#159)

      • set version and release notes for V0.001 (#156)

      • start dev phase for v0.002 (#160)

      • vagrant: relative release path (#163)

      • vagrant: tests linux (#115)

      • move Jenkinsfile and Dockerfile to web/ subdirectory (#157)

      • packaging: node migration (#164)

    • Website

      • add better preview image (#154)

      • Add metadata for mastodon/bluesky/etc. (#152)

      • fix and improve CSS (#171)

      • no longer under construction (#155)

      • regenerate readme.html and manual.html (#153)

      • remove empty list item in doc/index (#151)

Cheers,

--The Fuzion Team.

last changed: 2026-10-29