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

2026-04-14: Fuzion April Update

A focus of the current work is stabilizing the code base, removing engineering debt and fixing bugs while preparing for the development of real-time APIs through tool and API support.

  • General
    • The Fuzion presentation given at Embedded World Conference in Nuremberg last month is available online.

    • We are happy to welcome Yann Glady from France who joins our team for an internship until August. Yann will be working on real-time and CPU resource related APIs for Fuzion.

  • Fuzion language
    • support generic arguments as lambda targets (#6811)

      This enables type parameters for the types of lambda expressions like F in the following code

        apply(f F : i32->i32) => f 42
      
        _ := apply *2
                
      compared to using a plain lambda as in
        apply(f i32->i32) => f 42
      
        _ := apply *2
                
      this avoids passing of a reference to apply but it specializes the code of apply for each lambda it is used with avoiding the overhead of passing a value for f, avoiding heap allocation of this value and avoiding dynamic binding overhead when calling f.

  • Base library
    • New library features

      • add Cons.finite for better handling of infinite lists (#6343)

      • add enhanced effect composition means (#6775)

        To instate effects e1, e2, and e3 to run code, it used to be required to instate each effect individually as in

          e1 ! ()->
            e2 ! ()->
              e3 ! code
                  
        now, this can be done in one step using a tuple
          (e1, e2, e3) ! code
                  
        reducing the boilerplate for effects.

      • add envir.vars.map_of(_ Sequence String) (#6753)

      • For int, implement missing fits_int... to permit conversion to smaller integer types (#6800)

      • make String.to_valid_utf8 public (#6737)

    • Changed library features

      • fix lstats (#6755)

      • make ps_map inherit from Persistent_Map (#6779)

      • do not use check for operational errors (#6791)

      • processes, close pipes on exhaustion (#6739)

      • rename Typed_Value.applyTo as Typed_Value.apply_to (#6784)

      • replaced switch.val/.get by or_panic since this clearly states the possible error this may cause (#6774)

      • stat meta_data, include path (#6767)

      • traverse, do not descend into dirs that are symlinks (#6751)

      • remove unused type pars from internal helper features tuple_zip_equals/tuple_zip_lteq (#6802)

      • Sieve_Cache, attempt to fix memory leak in fzweb by zeroing references from removed elements (#6797)

    • Removed library features

      • removed idx to use integer directly as a general index type(#6771)

  • Parser
    • fix handling of multiple successive operators (#6793)

    • Permit `f.this` types to be used in preconditions by fixing bug in isFeaturePrefix (#6763)

  • Front end
    • better error message in case of indentation problem, include ebnf rule name (#6683)

    • fix bug where type inference of a type params from a .this-type led to crash (#6777)

    • major cleanup untangling inheritance from type parameter application: Remove handling of inheritance from AbstractType.applyTypePars, this is now done exclusively by AbstractFeature.handDown (#6570)

    • AbstractType, remove special case concerning choices in constraintAssignableFrom (#6825)

    • add error for wrong usages of fixed modifier (#6794)

    • Call, fix crash due to wrong detection of erroneous call target (#6790)

    • check types in source code order and enhance suppressing of subsequent errors (#6841)

    • Fix front-end crash by not applying t_UNDEFINED in Call.applyToActualsAndFormalTypes (#6816)

    • fix constraint assignability checking, now enforces that type parameter on type constraint are not relaxed in redefintions (#6834)

    • fix resolving fully qualified this-types (#6837)

    • fix showing correct error, “Main feature must not be…” (#6826)

    • fix stack overflow in isAssignableFrom (#6813)

    • match, support for type constrained subject types (#6815)

    • replace type parameters in result field of postcondition feature (#6788)

    • show error on non-exhaustive destructuring (#6821) such as

        a,b := (1,2,3)
                
      which now reports Non-exhaustive destructuring is forbidden [..] Expected 3 variable names but found 2.

    • show error when choice inherits feature with contract (#6833)

    • show error when using this-type of feature we are fixed to (#6781)

    • support calling type parameter from inside type features (#6831)

    • support constraints with .this-type (#6757)

    • support for fields as target of inheritance calls (#6818)

    • support type inference from type parameter used as outer type (#6810)

  • DFA
    • mark fields of result values of native features as initialized/written (#6729)

  • FUIR
    • Fix crash in directParents due to this-type not replaced (#6786). Simplification of Clazz.directParents() (#6812, #6819)

  • Back ends
    • be/c: use a newly started thread to run code instead of the main thread to be able to control stack size and thread parameters (#6760)

    • fix indentation in generated C code (#6746)

    • win: fix fzE_file_open, align to posix API (#6744)

    • intrinsics: remove unnecessary floating point constant intrinsics (#6768)

  • Tools
    • bin/run_tests/chec_simple_example/record_simple_example: move shared process handling code to tokiwa module (#6778)

    • fix names of failed tests so that the start does not get cut off (#6750)

    • fzextract
      • add asserts ensuring size fits assumption (#6749)

      • add callback/function pointer extraction (#6730)

      • add mutate type parameter to c (#6799)

      • comment cases that differ among lin/win/macOS (#6752)

      • refine extraction heuristic (#6725)

      • slight modifications (#6742)

      • update keywords (#6809)

    • tools: add makefile target rerecord_expected_err (#6805)

    • util/Terminal: add environment variable to force ANSI output (#6747)

  • Tests
  • Documentation
    • add annotation for unit types in API docs (#6769)

    • if comment of a feature is empty and this feature redefines another feature, use the redefined feature's comment. Otherwise show a warning. (#6715)

    • show pre- and postconditions in the API docs (#6776)

  • Fuzion Webserver
    • add health check to docker container (#400)

    • benchmark sending change bucket (#402)

    • Jenkinsfile.bench also check out flang_dev (#403)

    • move local mutates closer to their usage (#392)

    • move login_status from util to root dir (#381)

    • move some code from util to webserver or universe (#382)

    • remove webserver.log (#383)

    • return error when password hashing fails (#380)

    • send benchmarks to influxdb (#401)

    • data sent to influx, prefix benchmark names with type (#404)

    • sort API sources alphabetically (#388)

    • src/read_file: follow symlinks when calling stat (#397)

    • src/runner: read stdout and stderr in a thread pool (#391)

    • src/session_document: drop mutability when reading TOC (#393)

    • src/session_document: implement pretty printing of Fuzion code (#385)

    • src/session_document: pretty printing: read from process before it exits (#389)

    • src/webserver: log requests that take longer than 750 ms to process (#396)

  • Feeze
    • A number of improvements in the displayed data of feeze

      • CPU activity bards

      • Threads are grouped by users and processes

      • Threads may be folded per user

      • Width of thread names and scala rulers may now be adjusted.

      Here is a current screenshot:

      feeze data window screenshot showing 16 CPUs and the threads of a Java VM.

    • Feeze now can be controlled via a GUI (#17)

      feeze control window screenshot

Cheers,

--The Fuzion Team.

last changed: 2026-04-16