2026-10-12: Fuzion October Update
Last month brought a couple of big news: The first release of the Feeze
Scheduler Tracer tool and some huge changes to Fuzion like changing the default
integer type to i64 and adding fearless concurrency that separates
synchronization means from code using it via mutate effect type polymorphism.
- General
-
A new website for the Feeze Scheduler Tracer tool went online. Documentation and releases can be found there.
-
- Fuzion language
change default integer type from
i32toi64(#7571)
- Base library
-
New library features
-
add
concur.atomic_mutate(#7645)We can now create a function that provides a thread-safe counter as follows
counter(M type : mutate) is cnt := M.var 0 increment => c.update +1and then call it using a local instance derived fromconcur.atomic_mutateas followsmymut : atomic_mutate is mymut ! ()-> c := counter mymut concur.Threads.env.spawn ()-> ... c.increment ... ...This will use an atomiccompare-and-swapoperation to ensure atomicity.However, if this counter is used locally in a single thread, we do not need any synchronization and we can avoid the cost of using
compare-and-swapby using a local mutate:mymut : mutate is mymut ! ()-> c := counter mymut ... c.increment ...Then, it will be ensured that all accesses are thread-local.In case there is synchronizing between threads anyway, we can as well use a blocking mutate:
mymut : blocking_mutate is mymut ! ()-> c := counter mymut concur.Threads.env.spawn ()-> ... c.increment ... ...which will ensure that the increment operation is protected by a mutex.Essentially, we can develop library code that is thread-safe without specifying how this thread-safety will be achieved.
-
add
memoize.constto memoize the result of nullary functions (#7785)With this, we can use turn an expensive nullary function like this approximation for pi
pi => (4.0 :: (-)).zip (1.0 :: +2) (/) # 4/1, -4/3, 4/5, -4/7, ... .take 10000 .suminto a function whose result will be calculated on the first call and reused during repeated calls:pi : memoize => const ()-> (4.0 :: (-)).zip (1.0 :: +2) (/) # 4/1, -4/3, 4/5, -4/7, ... .take 10000 .sum -
memoize globally, not only thread-locally (#7806)
The API to memoize a function like this
fib(n) => if n <= 1 then 1 else fib n-1 + fib n-2has not changed: inherit frommemoizeand usekeepto map inputs to stored results:fib(n) : memoize => keep n _-> if n <= 1 then 1 else fib n-1 + fib n-2however, now the results are stored globally and locally such that even in multi-threaded uses of the memoized function, the value will be calculated only once but synchronization is required at most once per thread to get a local copy of the pre-calculated result. added helpers to
codepoint(#7685) to handle invalid codepoints and replace them by "�"implementation of
f64.fits_in_i64no longer accepts2^63(#7852)implement
encodings.html.decode(#7644)implement
orderable,hashablefornil(#7718)implement
orderableinstead ofequatableand related comments/changes (#7664)
-
-
Changed library features
better implementation for
Set.type.equality, nowpanics for infinite sets (#7740)changed logic in
buffered.read_string(#7696)changed impl of
switch.type.equality/lteqsuch thatoption = nilis valid even if the option's value is notequatable(#7810)changed
outcome/error.as_stringto display--error: msg--in case of an error (#7662)changed return type of
signfromi32toi64(#7788)cleanup in
switchfeatures (#7701)cleanup
Mapcreation (#7714)codepoint, cache
latin_alphabet(#7770)don't panic in
interval.size_option(#7818)don't produce an empty string for leading matches in
String.split_if(#7816)effect.type.instateusecompile_time_panicinstead ofpanic(#7811)enhancements of
container.Doubly_Linked_List(#7713)made
numeric.from_u32tail recursive (#7797)made
Mutable_Tree_Mapa ref type (#7854)marked
buffered.read_features as type features (#7683)read_fully,read_lines,read_delimiter_fullreturnoutcome(#7608)refine result type of
Read.env.next(#7796)rename
mutate.newasmutate.var(#7730)rename
time.precisiontotime.units(#7681)simply use
or_panicfor operations that are expected to never fail (#7716)split up
equals.fzinto three differentoperators_*files (#7813)switch, implement generic versions of
type.equality,type.lteq,type.hash_code(#7690)io.dir.traverse, fix usage example, missing a backslash (#7795)use actual name of outer feature in error message (#7679)
use full
error.as_stringnot justmsgwhen causingfault(#7838)Writer.flushsimplify implementation add NYI comment (#7833)interval: add note about naming in the mathematical sense (#7686)
interval: fix
contains, add O(1)nth,index_of,size_option,equality(#7673)update to unicode 18 (#7786)
-
Removed library features
remove
container.set_of,set_of_hashable(#7757)-
remove some
is_*feature, replace by=or!=(#7805)The rationale is that for a value
vof aswitchtype likeoption, testing if the contained value is a unit-type value likenilcan be done done usingv = nil, there is no need for a dedicated featurev.is_nil. remove atomic field in value effect pipe (#7698)
-
- Other library modules
- Parser
- Front end
fix#7415: adjust type of constraints in a call when inferring type pars (#7657)
fix crash due to empty contract not defining args supplier (#7739)
warn for unused fields that get placed in internal features by syntax sugar (#7693)
in error
incompatible type parameter, add positive list of typesactualis assignable to (#7654)fix crash in
Function.propagateTypeAndInferResult(#7748)add workaround in
AbstractType.compareTo(#7717)change logic of
isEffectFeature(#7768)consider type features as partially applicable alternatives (#7790)
do
initial value from callonly if urgent (#7762)fix null pointer exception in
choiceGenerics(#7660)fix require condition in
Expr.unwrap(#7802)fix require-condition in
isLambdaTarget(#7672)minor refactoring in Call (#7799)
raise error when effect feature is called directly not via
env(#7667)robuster code for #7747 when inferring type pars and their count is wrong (#7749)
added two conditions to the filter (#7756)
try remove explicit
resolveTypesOfActualsinloadCalledFeatureUnlessTargetVoid(#7761)
- Middle end
- Runtime System
- Backends
- Windows
- Tests
fix interval test to use
i64instead ofi32(#7704)decrease test sizes in priority queue test (#7764)
don't skip lsp test, compile instead (#7775)
extend negative test for multi-line strings (#7695)
fuzion_runtime_stackoverflow do not rely on
concat_list(#7804)test choice type containing another choice type (#7729)
use
i64instead ofi32inlru_cacheandpriority_queuetests (#7691)In
check_simple_example, ignore lambda namesfun22vs.fun27. (#7814)use
i64instead ofi32inlru_cacheandpriority_queuetests (#7691)fix interval test to use
i64instead ofi32(#7704)decrease test sizes in priority queue test (#7764)
don't skip lsp test, compile instead (#7775)
extend negative test for multi-line strings (#7695)
fuzion_runtime_stackoverflow do not rely on
concat_list(#7804)In
check_simple_example, ignore lambda namesfun22vs.fun27. (#7814)test choice type containing another choice type (#7729)
- Build Infrastructure
actions: CodeQL: bump github/codeql-action from 4.37.5 to 4.37.9 (#7680)
add editorconfig (#7677)
Dockerfile: bump DFA max iterations to fix fzweb benchmarks (#7733)
extra tests: split up windows/macOS (#7848)
ci/release: build src and binaries for linux, macOS and windows on amd64/arm64 (#7793)
ci/release: smoke test (#7842)
- Fuzion Webserver
src/global: evict sessions in one permanently running thread (#469)
vibe coded documentation for
from_type_string(#476)src/Session: use blocking_mutate for last_accessed (#465)
fix
blocking_mutatenot instated in benchmarks (#467)src/runner: replace use of atomic by blocking mutate (#477)
src/runner: swap instation of blocking mutate and thread pool (#480)
src/Session: replace atomic with blocking mutate for connection (#484)
- Feeze
The first public release of Feeze was made!
doc: single installation guide in doc/Manual.md (#148)
gui: add keyboard shortcut
F11to toggle full screen (#147, #150)-
Build Infrastructure
change name and tag (#158)
remove platform from release file and version (#159)
set version and release notes for V0.001 (#156)
start dev phase for v0.002 (#160)
vagrant: relative release path (#163)
vagrant: tests linux (#115)
move Jenkinsfile and Dockerfile to web/ subdirectory (#157)
packaging: node migration (#164)
-
Website
Cheers,
--The Fuzion Team.