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
-
The web server running fuzion-lang.dev is now fzweb written in Fuzion and available freely (MIT license) on github
-
- Fuzion language
-
allow type tails for this-types (#6606)
This permits the use of types like
mutate.this.arraythat permitted changes in the base lib that avoids redundant type parameters. In particular, this results in the possibility to writelm.array u8 .emptywhen creating a mutable array for a local mutate type. Originally, this required a redundant lmargument as followslm.array u8 .empty lm -
Disallow unbalanced infix operators such as
3 +xorx- 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 inc := (a) + b d := a + b e := (a) + b f := (a) + b g := a + (b)or no white space on either sidec := (a)+b d := a+b e := (a)+b f := (a)+b g := a+(b)Still allowed are prefix operators in call arguments such ash := f +bwhich are not parsed as infix operators.
-
- Base library
-
New library features
-
A new feature
container.Finger_Treeprovides 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.concatandcontainer.exapnding_array.concatand 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_Treein single (#6636)buffered.read_bytes, useFinger_Treeto 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
pathfeature 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_hzto convert to Hertz (#6688)base: implement all features
fits_in_..inuint(#6726)add module
tokiwa(#6661)
-
-
Changed library features
make
idxa template feature (#6652), which permits the definition of arbitrary features that can be used as indices.array_slicemakelengtha field to improve performance (#6584)bench return
time.frequencyinstead off64(#6684)buffered.writer.writeacceptStringsas well asSequence(#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.writeappends to file (#6645)improve perf of
String.join(elems Sequence String, sep String)(#6629)in
listalways useconcat_list, notSequence.concat(#6721)io/mmap: add precondition to ensure size > 0 (#6723)
mark
circular_bufferasref(#6658)Optimize performance of
encodings.percent(#6619)panicchange arg type toString|error(#6710)random, change API of time_seeded/simple_random (#6712)
Read_Handler.fromuseas_array_backedinstead ofas_array(#6637)remove mutate type argument, that is no longer necessary (#6646)
split0returnSequenceinstead oflist(#6615)use
idxfor 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.emptyasfixed(#6573)
-
- Other library modules
- Documentation
- Front end
AbstractFeature, mergeisConstructor/isRefintoKind(#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
isUnitTypeheuristic (#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
-O3only 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
- 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_dataa 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: changeStringtopath(#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_dirchange result type toSequenceinstead ofarray(#330)use debug=0 for profiling (#340)
- Feeze
use pkexec for privilege escalation if available (#15)
Cheers,
--The Fuzion Team.