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

2026-03-18: Fuzion March Update

The biggest news this month is that fzweb, the web-server written in Fuzion, has gone finally gone online, serving the page that presents these news!

  • General
  • Fuzion language
    • allow type tails for this-types (#6606)

      This permits the use of types like mutate.this.array that permitted changes in the base lib that avoids redundant type parameters. In particular, this results in the possibility to write

                  lm.array u8 .empty
                
      when creating a mutable array for a local mutate type . Originally, this required a redundant lm argument as follows
                  lm.array u8 .empty lm
                

    • Disallow unbalanced infix operators such as 3 +x or x- 1 (#6714)

      The following code is forbidden now since the infix operator is `unbalanced` and could be confused with a prefix or postfix operator:

        c := (a) +b    # *** causes error!
        d := a+ b      # *** causes error!
        e := (a)+ b    # *** causes error!
        f := (a) +b    # *** causes error!
        g := a+ (b)    # *** causes error!
                
      instead, we need white space either on both sides as in
        c := (a) + b
        d := a + b
        e := (a) + b
        f := (a) + b
        g := a + (b)
                
      or no white space on either side
        c := (a)+b
        d := a+b
        e := (a)+b
        f := (a)+b
        g := a+(b)
                
      Still allowed are prefix operators in call arguments such as
        h := f +b
                
      which are not parsed as infix operators.

  • Base library
    • New library features

      • A new feature container.Finger_Tree provides a functional representation of persistent sequences supporting access to the ends in amortized constant time, and concatenation and splitting in time logarithmic in the size of the smaller piece.

        This data structure is now used by String.type.concat, Sequence.concat and container.exapnding_array.concat and significantly improved the performance. Support for splitting is still missing.

        This change consists of the following pull requests:

        • Finger tree (#6493)

        • don't wrap Finger_Tree in single (#6636)

        • buffered.read_bytes, use Finger_Tree to concat the read bytes (#6617)

        • Finger_Tree redef as_array (#6628)

        • Finger_Tree, slight performance improvements (#6638)

        • Concat use finger tree instead of list (#6553)

        • finger tree implement merging (#6575)

      • Improvements and usage of path feature
        • add more path operations (#6599)

        • use path instead of String as argument type of files/directories (#6644)

        • add path.as_platform_string and use it in file operations (#6727)

        • dir.read, return path instead of String (#6657)

        • path remove as_array call (#6641)

      • base: implement os.platform(#6651)

      • base: add Function.of, lambda helper (#6665)

      • base: add io.copy (#6663)

      • base: add io.dir.traverse (#6699)

      • base: add short-hand, html.encode str (#6719)

      • base: add time.frequency.as_hz to convert to Hertz (#6688)

      • base: implement all features fits_in_.. in uint (#6726)

      • add module tokiwa (#6661)

    • Changed library features

      • make idx a template feature (#6652), which permits the definition of arbitrary features that can be used as indices.

      • array_slice make length a field to improve performance (#6584)

      • bench return time.frequency instead of f64 (#6684)

      • buffered.writer.write accept Strings as well as Sequence (#6703)

      • dir.traverse, don't fail on symlinks for now (#6711)

      • file.use, do not instate writer on file_mode read (#6700)

      • fix check condition failure when writing large Strings (#6690)

      • fix file.write appends to file (#6645)

      • improve perf of String.join(elems Sequence String, sep String) (#6629)

      • in list always use concat_list, not Sequence.concat (#6721)

      • io/mmap: add precondition to ensure size > 0 (#6723)

      • mark circular_buffer as ref (#6658)

      • Optimize performance of encodings.percent (#6619)

      • panic change arg type to String|error (#6710)

      • random, change API of time_seeded/simple_random (#6712)

      • Read_Handler.from use as_array_backed instead of as_array (#6637)

      • remove mutate type argument, that is no longer necessary (#6646)

      • split0 return Sequence instead of list (#6615)

      • use idx for drop/take/slice (#6695)

      • io/buffered/reader: don't call count on outcome directly (#6620)

      • Revert “base/error: do not allow line breaks at the end of the message” (#6692)

      • mark some type.empty as fixed (#6573)

  • Other library modules
    • http: change version parsing code (#6630)

    • mail: add option to send blind carbon copy (#6698)

    • mail: use \0 shortcut for null character (#6653)

    • mail: use base64 as Content-Transfer-Encoding (#6655)

  • Documentation
    • fix docs generation (#6598)

    • fix side navigation to only show features of same module (#6626)

    • Readme: badges, add interpreter (#6694)

  • Front end
    • AbstractFeature, merge isConstructor/isRef into Kind (#6585)

    • add isArtificialType() (#6621)

    • cache isGenericArgument (#6576)

    • change visibility of internal open types feature (#6627)

    • Loop: set a source position for empty success blocks (#6569)

    • refine heuristic of legal native value types (#6724)

    • remove asActuals (#6610)

    • report all fields of a choice in error message (#6601)

    • ResolvedNormalType, reduce multiple constructors to one (#6705)

    • cleanup, remove loadDependsOn (#6594)

    • make unit orderable (#6648)

    • remove unused method LibraryCall.globalIndex (#6595)

    • feature: add isUnitType heuristic (#6582)

    • LibraryOut: let jdk pick secure random algo (#6607)

  • DFA
    • add from call when creating value const (#6590)

    • enable site-sensitivity for constructors like its instance is handled (#6537)

    • _fields.put() only on changed value (#6578)

    • fix creation and calc of num consts (#6571)

    • newInstance, return Value.UNIT when clazzIsUnitType (#6602)

    • optimize hot path Analyze.match (#6577)

    • remove call groups quick (#6589)

    • remove currently unused _calledClazzesDuringPrePhase (#6568)

    • remove redundant assignment to outer ref and args (#6561)

    • remove unused recording of accesses (#6567)

    • remove unused _usedIntrinsics (#6588)

    • test removing _mayHaveEffects (#6580)

  • FUIR
    • add assertion that loops are always detected to be tail calls (#5950)

    • Clazz, cache asRef (#6704)

    • cleanup FeatureAndActuals (#6668)

    • don't serialize show (#6596)

    • fix fzweb compilation (#6720)

    • remove special case in boxValueAndResultClazz (#6609)

    • serialization, call codeAt,clazzKind only once (#6597)

    • don't add type_as_value calls (#6612)

    • cleanup fuir serialization (#6587)

    • mir: remove unused method MirModule.data (#6593)

  • Back ends
    • jvm: fix catching stack overflow (#6707)

    • c: comment some clang options that do not work on macOS/win currently (#6635)

    • c: remove unused method isLocalVar (#6592)

    • c: use -O3 only if debug=0 (#6666)

    • rt: fzE_file_read cleanup result values (#6696)

    • rt: win, use initialize critical section ex instead of initialize critical section (#6701)

  • Tests
    • add test, testing dfa calc lteq eval feature (#6572)

    • add unit to tuple comparison test (#6660)

    • reg_issue 6160, modify code to test truncation (#6702)

    • split up and fix dfa_calc_lteq (#6574)

  • Benchmarks
    • benchmarks: add benchmarks directory (#6624)

  • Build process and tools
    • bin: run_test.fz: do not panic but produce proper error if process start failed (#6632)

    • compile: run_tests/check/record_example with debug=0 (#6679)

    • Dockerfile: add FUZION_HOME (#6717)

    • makefile: show_development_env_vars (#6647)

    • make: use absolute path for $(FZ) (#6728)

    • fzextract: started work to extract structs (#6128)

    • Improve test makefiles (#6664)

    • update lsp4j (#6608)

  • Fuzion Webserver
    • benchmarks: add idioms/index (#346)

    • change result type from array to Sequence in some places (#332)

    • cleanup parse_multipart_form_data a little (#371)

    • disable PRE/POSTC. for profiling (#348)

    • Dockerfile: add link from content to API sources (#354)

    • Dockerfile: patch run script to exit on OOM errors (#361)

    • Dockerfile: remove unused modules (#334)

    • Dockerfile: set debug=0 (#335)

    • Feed: catch faults instead of contract_fault (#375)

    • fix endless loop in generate_title_bar (#336)

    • fix result type of user.type.list_dir: change String to path (#343)

    • fix StackOverflow when accessing page (#374)

    • fix title bar (navtitle) on the library modules page (#344)

    • html_response: remove premature optimization as_array (#331)

    • Jenkinsfile: check out flang_dev submodules (#337)

    • read file only if it exists (#369)

    • remove non working code thread_id (#370)

    • rename is_browsable (#353)

    • response.bytes, remove redundant as_array (#328)

    • src: attempt to fix userdata directory listing (#367)

    • src/content: add .g4 to list of known preformatted suffixes (#355)

    • src/content: remove last remaining global mutate (#319)

    • src/content: remove use of mutable result (#318)

    • src/document: fix off-by-one error in tag parsing (#356)

    • src/email_service: send blind carbon copy (#362)

    • src/Feeds: only request commit feed if token is provided (#329)

    • src/hash_password: stop logging hashes (#327)

    • src: implement listing of userdata directory (#350)

    • src/session_document: catch faults in get_content (#352)

    • src/session_document: fix runcode handling when file does not exist (#378)

    • src/session_document: make browse_tag return a directory listing (#347)

    • src/session_document: return correct link to file in browse view (#357)

    • src: use path abstraction for all path accesses (#338)

    • src/user: check for legal characters in username (#320)

    • src/user: delete newly created user if mail fails to send (#322)

    • src/user: do not fail user creation when directory already exists (#323)

    • src/user: handle faults when attempting to send registration email (#326)

    • src/util/read_file: handle case of empty file (#379)

    • src/util/url_encoded: use tolerant decoding (#342)

    • type.list_dir change result type to Sequence instead of array (#330)

    • use debug=0 for profiling (#340)

  • Feeze
    • use pkexec for privilege escalation if available (#15)

Cheers,

--The Fuzion Team.

last changed: 2026-03-19