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

2026-05-19: Fuzion May Update

April brought a solution a major remaining problem related to effects: Where do default effect handlers come from and how could they be instated automatically? This has now been solved by adding an effect big bang singularity at system start. All used effect types that are not set explicitly may provide a default instance that will be created and instated at this point.

Also, implementation of support for real-time thread scheduling and priorities has started.

  • Base library
    • New library features

      • Added mutable.array3 for three-dimensional mutable arrays (#6985)

      • Add priority queue interface with a binary heap-based implementation (#6873)

      • provide wormholes to teleport effects between threads (#6905, #6971)

        This enables passing effects to new threads as follows

          effect_type.instate effect_instance ()->
            ...
            effect_type.env.some_operation
            ...
            t := concur.threads.env.spawn ()->
              ...
                effect_type.env.another_operation
              ...
            ...
            t.join
                      
        The underlying mechanism that is used by spawn can also be used explicitly as follows
          ...
          wh := effect_wormhole            # (1) create wormhole for effects at this point
          ...
          wh.teleport ()->
            ...                            # execute code with effect environment from (1)
        
                      
        Furthermore, the instation of effects at startup is now done at the big_bang_singularity that occurs before user code is executed. All effect types that are used in the application and that provide an implementation of effect_type.default_value will get instated at this point.

        This enabled cleanup of effect initialization, there is no need for helper features to instate a default effect value, effects can just be used as in io.dir.make.env.make_dir path, the default instance will be set at the effect big bang singularity (#6970, #7001)

      • concur: implement pinning a thread to a specific CPU core (#6952, #6962) and allow setting scheduling policy like SCHED_FIFO and priority of a thread (#6909, #6960).

      • http: implement chunked Transfer-Encoding (#7000)

      • http: handle extensions for chunked transfer encoding (#7018)

    • Changed library features

      • Added support for addition/subtraction of time to dates (#6927)

      • The documentation for universe now explains this as the outer space of all features (#6853)

      • Added type parameters for some features with lambda args (#6923). Here is an example from Sequence:

          first_index_of(F type: T->bool, cond F) i32
          =>
            for i:=0..
                el in Sequence.this
            while !cond el
            else
              i
                        
        Compared to Function arguments, which are references using dynamic binding, parametric typed lambdas will result in code that is specialized for each actual lambda, avoiding the overhead of boxing, heap allocation, and dynamic binding, and enabling inlining.

      • improve performance of Mutable_Hash_Map when many succeeding hashes have conflicts (#5954)

      • Add post conditions to features in Sequence (#6041)

      • byte_length/codepoint_length as byte_count/codepoint_count (#6943)

      • http/Message: cause error for unknown Transfer-Encoding (#7015)

      • http/Message: treat transfer encodings case-insensitively (#7012)

      • io/Read_Handler: allow empty returns from read (#6995)

  • Parser
    • allow defining extension features on universe. e.g., universe.io.say_hi => say "hi" (#6869)

    • fix parsing _ := id (Sequence i32) [ ] (#7005)

    • fix precedence table, revert #6793 (#6929)

  • Front end
    • add error for adding precondition when implicit pre true is inherited (#5177)

    • Avoid crash during type inference of defunc call (#6854)

    • Avoid subsequent Incompatible types when passing argument error in #6849 (#6856)

    • better human readable names for lambdas (#6864)

        x(f F : i32->i32)
        =>
          say F.name}
      
        x i->i+1
        x i->123+2*i"
                      
      now produces
        (λi->i+1)
        (λi->123+2*i)
                      
      instead of
        λ
        λ
                      

    • Better type inference for lambdas passed to argument whose type is a type parameter, fix #6849 (#6860)

    • Fix error message in case a lambda is used with wrong number of arguments (#6900)

    • remove wrong check condition (#6890)

    • type inference independent of order of branches (#6872)

    • Check outer type for type parameters to fix soundness issue in constraintAssignableFrom (#7026)

    • better error for lambda types where outer has (unknown) arguments (#6918)

    • do not try to infer type args that were given by user (#6912)

    • don't adjust calls to potential lambda args in loop (#6878)

    • fix bug in type inference for array elements (#6908)

    • fix confusing error message in open type param arg (#6879)

    • fix crash in type inference due to free types (#6910)

    • fix crash when trying to determine type of lambda assigned to field (#6913)

    • fix index var of outer loop not found in inner loop (#6901)

    • fix InlineArray.syntaxSugar2, target of array call (#6963)

    • fix internal name in error message (#6907)

    • fix type inference, involving field (#6835)

    • mark lambda wrapper ValueType instead of RefType (#6922)

    • refine logic in tryResolveTypeCall, fixing #5697 (#6932)

    • show error when lambda types outer(s) contain generic argument (#6919)

    • show special error if loop results in two incompatible types (#6931)

    • support this-types in lambda targets (#6916)

  • DFA
    • for native result clazzes, mark all arg fields as read (#7010)

  • Middle End
    • add check on Clazz.init() that _type.outer() matches _outer._type (#6987)

    • attempt to simplify handDown (#7007)

    • change clazzInstantiatedHeirs to return empty array for value clazzes (#6996)

    • Clazz.init, add check that outerRef().resultClazz() equals _outer (#6994)

    • don't turn calls to features with contracts into consts for now (#6759)

    • fix handdown when child is field and unboxed ref (#6843)

    • fix replace this-type in box-type. (#7006)

    • pass inheritance call list when creating parents (#6844)

    • LibraryFuir: fix inconsistency with GeneratingFUIR (#6887)

  • Back ends
    • runtime: include/posix: handle different SCHED_ magic constants on macOS (#6939)

    • runtime: include/posix: remove static assert for ENOSYS (#6940)

    • c: Intrinsics: let Java compiler infer List argument type (#6976)

    • c: use global lock for intrinsic exit to ensure thread safety (#6968)

    • jvm: fix fatal fault caused by local mutate in thread , fix #6882 (#6889)

    • jvm/int: On fatal errors in different threads, report error stats only once (#6884)

  • Tools
    • Makefile: use shell's realpath instead of the make one (#6967)

  • Windows
    • win: fix fzE_cwd to return posix style paths (#6965)

  • Tests
  • Documentation
    • Reference Manual: added section for type system (#5130)

  • Fuzion Webserver
    • src/mime_type: add application/pdf to mime types for PDF files (#412)

    • tests: add Jenkinsfile for running test regularly (#406)

  • Feeze Tool
    • Now supports tool tips to display thread state, running time, etc. (8e93715)

Cheers,

--The Fuzion Team.

last changed: 2026-05-22