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

2025-11-13: Fuzion November Update

The work on fzweb, the web server to be used for fuzion-lang.dev, results in significant progress in our standard libraries adding required functionality (http, email, etc.) and improving usability and performance.

Furthermore, support for open type parameters was extended to permit efficient type-safe and efficient variadic functions.

  • General
    • A talk Fuzion — A Language Designed for Safety-Critical Embedded Systems was accepted for next March's Embedded World conference.

    • The dev rooms for FOSDEM have been announced, we hope to present our progress there!

  • Fuzion language
    • generalizing lambda handling (#6005): Lambdas can now be used for type parameters as well.

      E.g., a variadic function to concatenate all of its arguments as a String can now be written as follows:

        as_one_string(A type ..., a A...)
        =>
          a.typed_foldf "" _,s,v->
            s+v
              

      In this example, the lambda _,s,v->s+v has three arguments: a type parameter _ that is ignored, a String s and a value v whose type is defined by the type parameter given as the first argument.

    • more systematic handling of type inference in calls with open type parameters (#6025). This patch turned out to be a major cleanup in the handling of calls, the splitting of arguments into type parameters and value arguments and documentation of the behavior. There are basically three kinds of calls:

      • non variadic: No open type parameter as a formal type, so this must be called giving actual type parameter and actual arguments or just the actual arguments if the type parameters can be inferred. Ex. option String "" and option "" (where the type is inferred as String from "").

      • variadic value args: the variadic type parameter must be inferred, it can be a _ placeholder. Ex. tuple _ 42 true and tuple 42 true (in both cases, the types are inferred.

      • variadic type parameters: Type parameters must be provided, _ can be used for non open type parameters that can be inferred from actual value arguments. Ex: Function bool f64 i32.

    • lexer: allow \0 in string literals for the null character (#6069)

  • Base library
    • New library features

      • bool: add all_of and any_of (#6072). This permits code like this:

          is_magic := any_of x=4711 x=32168 x=13
                    
      • add feature path (#6179) to represent paths in the file system.

      • add io.Out.blackhole/io.Err.blackhole (#6181).

        This allows suppression output, e.g., as follows:

          io.Out.instate _ io.Out.blackhole ()->
            say "hello"   # -- output sill be suppressed
                    
      • add String.truncate(max_codepoints) (#6121) to shorten a string to a maximum number of codepoints.

      • add String.quoted, putting String in double quotes (#6102).

      • implement date_time.from_seconds (#6000)

      • mod crypto: wrapping libsodium (#6110)

      • mod mail: send mails from fuzion (#6062)

      • mod, web: add post requests (#6098)

      • modules/web: post: ensure data is array-backed (#6148)

      • modules/web: post: set Content-Length header (#6147)

      • modules: add module web, web.fetch to fetch URL (#6050)

    • Changed library features

      • base: make container.type_applicator.apply a lambda_target (#6169). This permits using a lambda when calling T.types_foldf on an open type parameter T:

          show_types(O type...) =>
            O.type_foldf unit T,e->
              say T
          show_types i32 (unit | bool) (option void)
                    
      • base: make option orderable and hashable (#6036)

      • base: make Sequence, list and array equatable, orderable and hashable (#6037)

      • base: make switch inherit from Sequence (#6034). This makes all the features of Sequence available to children of switch like option,

      • abstract_array, redefine drop_while/take_while (#6124) for better performance.

      • change result type of mutate.array.new (#6111) to be more suitable to pass to native features.

      • change visibility of atomic to private:public (#6116) to forbid inheritance from atomic in other modules.

      • make incr/decr concur.atomic return new value (#6103).

      • date_time.as_string allow specifying precision (#6113)

      • extend io.file.stat with more infos (#6053)

      • fix slice of slice allows to extend slice (#6101)

      • once, implement auto_unwrap (#6178)

      • Sequence, add post conditions to take_while/drop_while/empty (#6143)

      • mod http: add content-length to http-message (#6137)

      • mod, web: extract port from URL (#6107)

      • nom: fix atrocious performance, prevent O(n^2) in map_to_list (#6170)

      • fzE_mmap, simplify code, add error code on failure (#6158)

      • cleanup argtype of baseX.encode (#6150)

      • remove switch.get (1 argument), we have or_else instead (#6141)

      • refactor code in http.Message to drop constant -5555 (#6139)

      • align args of array, mutate.array (#6117)

      • base: change visibility of handles, add detailed comment how to clean this up (#6056)

      • add io.Read_Handler.type.from_array_u8 (#6106)

  • Documentation
    • Readme.md: add section on tests (#6081)

  • Front end
    • bug fix: Accept _ as a type place holder only if no targets and no arguments given (#6035)

    • bug: Fix a complex case of type inference involving lambdas: use typeForInference() instead of type() to fix #6057 (#6058)

    • ast: ParsedType, add two convenience constructors (#6119)

  • Monomorphization/DFA
    • add option to detect too many iterations (#6048)

    • mark dependent calls as hot (again) once call is detected to return (#6018)

    • setField, trigger wasChanged only if field was ever read (#6004)

  • FUIR
    • remove lookup_array_... methods (#6115)

    • cleanup, define NO_CLAZZ as CLAZZ_BASE-1 (#6099)

  • JVM back end
    • be/jvm: better UnsatisfiedLinkError error message (#6136)

    • be/jvm/int: clone effect value when getting from env (#6054)

  • C back end
    • be/c: add option -g to do a debug build (#6082)

    • be/c: remove mem_zero for fzCur (#6153)

    • runtime: fzE_process_wait, remove assert (#6138)

    • be/c: remove ifdef FUZION_ENABLE_THREADS (#6052)

  • Fuzion tools
    • remove option unsafeIntrinsics (#6168)

  • Build
    • actions, linux: compile lsp to detect problems early (#6177)

    • add workaround for libLLVM overriding jvm signal handlers (#6129)

    • replace macOS by linux as default PR runner (#6144)

    • Makefile: print + libfuzion_rt.so after build (#6174)

    • cleanup: split Makefile into smaller parts (#6149)

    • fzextract: various improvements (#6108)

    • native/fzextract: support mutate.array (#6109)

  • Windows
    • win: document magic conversion from win time to unix time (#6145)

    • win: fix fzE_connect definition (#6088)

    • win: fix Wunknown-escape-sequence (#6140)

  • LSP
    • fix lsp compilation (#6175)

Cheers,

--The Fuzion Team.

last changed: 2025-11-13