0.6.0 10-01-2026
This release brings a lot of useful tools to write buzz code (LSP, formatter and DAP support) along with Windows support.
TIP
This release builds with zig 0.17.0. We will only use tagged version of zig from now on.
Added
- Windows support (#74)
- First working version of a LSP thanks to lsp-kit (#16)
- First working version of the debugger that implements the Debugger Adapter Protocol thanks to buzz-language/dap-kit (#88)
- Code formatter (
buzz format) (#96) - Package manager (#85)
- Package manifests with
manifest.buzzand the newbuzz:manifeststd lib definitions - Package scaffolding with
buzz init - Dependency fetching with
buzz fetch, supporting git repositories, archives and local directories manifest.lock.buzzlock files with resolved refs and dependency content hashes
- Package manifests with
matchstatement/expression for value matching with type-specific condition semantics (#80)- Enum name can be omitted if it can be inferred (
final list: [Locale] = [ .fr, .it, .en ]) (#360) - Object initialization name can be omitted if it can be inferred (
final payload: Payload = .{ data "..." };) (#373) - When function call as one anonymous object literal argument, the parentheses can be omitted (
callMe(.{ data = "..." })becomescallMe .{ data = "..." }) (#372) - File polling API:
File.getPoller,FilePoller(see example https://github.com/buzz-language/buzz/blob/main/tests/manual/007-fd-poller.buzz) - Shortcut operators:
+=,-=,*=, etc. (#78) rg.containsmap.hasKey- REPL highlights input as it's being written and format it once submitted
- Added C header file for the buzz API (#309)
as!operator to force a cast and raise a runtime error when it fails
Changed
- buzz binary now uses subcommands for tools and direct paths for execution
buzz <script.buzz>runs a standalone scriptbuzz -t <script.buzz>becomesbuzz test <script.buzz>buzz -f <script.buzz>becomesbuzz format <script.buzz>buzz <directory>runssrc/main.buzzfrom a buzz package directorybuzz initandbuzz fetchmanage package scaffolding and dependenciesbuzzwill start the REPL
- Extern libraries now must expose only one function which will be called by the compiler to lookup the functions of the library
intare nowi48instead ofi32(#306. )If you're wondering why, it's because all buzz values live in a NaN boxed f64 and the maximum bits available for an integer in there is 48. However, C ABI does not understandi48so we're still stuck withi32in FFI for now.mainsignature can omitargsargument- Maximum number of enum cases is now 16 777 215 instead of 255
pattern.matchAgainstreturns now a list ofobj{ start: int, end: int, capture: str }andmatchAllAgainsta list of those lists- Tuples no longer require free form identifier to access their properties:
tuple.@"0"can now betuple.0 as?now warns when the cast target is already optional, andas!warns when used with an optional target- Removed
map.next
Imports
- Import don't rely on searchers any more, instead the import path provides a deterministic way of finding the imported script
buzz:<name>will look for a buzz's standard library<name>pkg:<name>/path/to/<script.buzz>will look for the script undervendors/<name>/src/path/to/<script.buzz>
- Selective import erases the imported namespace:
import print from "buzz:std"; ... print("hello world"); - Common part of imported namespace gets erased: if imported file as namespace
a\b\cand importing script has namespacea\b, onlyc\remains
Internal
- JIT compiler works in a separate thread
- Better JIT thresholds based of functions/hotspots complexity scores
- The standard librairies are now statically loaded which gives a small speed boost
- Build option
-Dshow_perfnow shows detailed rundown of the time spent in each component of buzz
0.5.0 (01-24-2025)
Major syntax changes
- Types are now specified after the identifier +
:(#310. )This includes:- Variable declarations
- Function argument definitions
- Catch clauses
if (...: type as ...)
- Arrow function use
=>instead of-> - Comments and docblocks must now be prefixed by
//and///instead of|and|| - Bitwise or operator is
|instead of\ - Function type now use
funkeyword instead ofFunction - If a function type has multiple error types, they must be put in parenthesis
- Namespace can now be multiple
\separated identifiers - Qualified name now use
\separator instead of. - The
floattype is renamed todouble(#311) - Enum type is declared between
<>rather than() - Protocol list object is conforming to is declared between
<>rather than() constkeyword is renamed tofinal(#318)
Added
- Immutability by default (#139)
- All non-scalar values are immutable by default
- Mutability can be specified in types and for values with the
mutkeyword - Object methods that mutate
thismust be prefixed bymut - FFI data are considered mutable
- Compile will warn about variable declared with
varbut never assigned - Object can have
finalproperties (#13) rg.subsetOf,rg.intersect,rg.union- Tuples (#298: )syntaxic sugar over anonymous objects:
final tuple = .{ "john", "james" };
tuple.@"0" == "john";
- Checked subscript access to list and strings (gives
nullwhen index is out of bound) (#304😃
var list = [1, 2, 3];
list[?10] == null;
"hello"[?20] == null;
- User input is syntax highlighted in REPL (#217)
- REPL handles multilines input (#218)
std\args(): returns the command line arguments with which the script was launched- Compiler is better at inferring empty list/map type from their context (#86)
Modified
- Enum can now have
rg,ud,void,patas value type - Anonymous object can also omit property name when initial value is a named variable
- Mir was updated to 1.0 (#300)
Fixed
- Type checking was not done on object instance property assignments
- Http client could not be collected because it kept connection opened to previous requests' domains
- Fixed an issue where a JIT compiled function making a lot of function calls would stack overflow
Internal
- Properties are now retrieved with an index rather than a hashmap lookup (#90 )which gives a nice performance boost of about 40% on some benches
0.4.0 (05-16-2024)
Added
- REPL (#17 )available by running buzz without any argument
- WASM build (#142 )and web REPL
- Tracing JIT (#134: )will look for hot loops and compile them
- Tail call optimization (#9))
- Function argument names and object property names can be omitted if the provided value is a named variable with the same name (#204)
object Person {
str name,
str lastName,
}
const name = "Joe";
const lastName = "Doe";
before:
const person = Person {
name: name,
lastName: lastName,
};
after:
const person = Person {
name,
lastName,
};
var value = from {
| ...
out result;
}
recursive_call_limitbuild option limit recursive calls- Compiler will warn about code after a
returnstatement - Compiler will warn about unreferenced imports (#272)
namespace(#271: )if a script exports at least one symbol, it has to define a namespace for the script withnamespace mynamespace- By default, imported symbols from another script will be under
libprefix.XXXX - When importing something, you can still redefine its namespace prefix with
import "..." as mynewnamespaceor remove it altogether withimport "..." _
- By default, imported symbols from another script will be under
- Ranges are now an actual buzz value (#170)
- new
rgtype myrange.toList()transforms a range into a list of integersmyrange.lowandmyrange.highto get a range bounds- works with
foreach
- new
list.fillstd.panicwill panic and print current stack trace- Loop can have labels that you can
breakorcontinueto (#199)
Changed
- Map type notation has changed from
{K, V}to{K: V}. Similarly map expression with specified typed went from{<K, V>, ...}to{<K: V>, ...}(#253) File.readLine,File.readAll,Socket.readLine,Socket.readAllhave now an optionalmaxSizeargument- Empty list and map without a specified type resolve to
[any]/{any: any}unless the variable declaration context provides the type (#86) - Function yield type is now prefixed with
*>:fun willYield() > T > Y?becomesfun willYield() > T *> Y?(#257) - Temporarily disabled
--treeand--fmt. The AST has been completely reworked and those feature will take some work to come back. math.randomremoved in favor ofstd.random
Fixed
- A bunch of crash after reported error. buzz tries to hit a maximum of syntax/compile errors by continuing after an error has been reported. This can lead to unexpected state and crash.
- Trying to resolve a global when only its prefix was provided would result in infinite recursion
- Forbid use of
yield/resume/resolvein the global scope - Would break on unfinished char literal
0.3.0 (10-14-2023)
Added
- FFI (#109)
- Uses MIR to generate wrappers around imported functions and to generate getters and setters to struct fields
- New
zdefstatement to declare and bind foreign functions and struct using zig code - New
ffistd lib - When you need a pointer to something you can use the
Bufferstd lib object. Added:Buffer.writeZ,Buffer.readZ,Buffer.writeStruct,Buffer.readStructBuffer.ptr,Buffer.len
- New (fancy) error reporter (#153)
- Errors have now an associated code
os.sleep- First class types (#21)
- Type can be passed around as values like so:
<str> - New
typeofoperator returns type of any value:typeof "hello"-><str>
- Type can be passed around as values like so:
- Delimiters for non-standard identifiers (#138)
- Collectors (http([#2): s://github.com/buzz-language/buzz/issues/2): )if an
objecthas afun collect() > voidmethod, it will be called before an instance of this object is collected by the garbage collector - Helpers around
udstd.toUd, returns userdata from an int or floatbz_valueToObjUserDatabz_getUserDataPtrBuffer.readUserData,Buffer.writeUserData
std.serializetakes any buzz value and return a serializable version of it (objects become maps, etc.) provided the data is has no circular reference and does not contain not serializable values (functions, fibers, etc.)- UTF8 helpers:
str.utf8Len,str.utf8Codepoints,str.utf8Valid(#39) - New integer literal for single chars:
'A' == 65(#172) - Compiler will warn you when a local or global is never used or when an expression value is discarded. To silence those warnings you can use the
_ = <expression>or name the local/global_. std.currentFiber,fiber.isMain(#162)map.sort,map.forEach,map.map,map.filter,map.reduce,map.diff,map.intersect,map.clone(#110)list.clone(#110)- Number literals can embed
_:1_000_000.300_245(#163) - Type can be inferred when declaring a variable/constant with the
varorconstkeyword:var something = "hello"(#194) - Objects can have generic types (#82)
- Draft of the testing std lib (#129)
File.isTTYfs.exists- Functions annotated with a comment of the form
|| @hotwill always be JIT compiled
Changed
jsonlib is renamedserializeJsonnow returns aBoxedobject (which can be reused in other contexts than JSON)- Identifiers can now have
_since pattern delimiters have changed - Changed pattern delimiters (#165)
list.appenddoes not return the appended value anymore- Generic types syntax changed from
myFunction(<K,V>, ...)tomyFunction::<K,V>(...) - Nullable object fields and nullable variables have a
nullinitial value if none is provided - Migrated to pcre2 which is now a submodule built by build.zig
- Mimalloc is now a submodule built by build.zig
Fixed
- Some bugs
any - Runtime error stack trace was wrong
- Local name checking failed in some instances
- Compiler would not force you to give variables an initial value
- Compiler would crash after raising some errors
- Float operation were sometimes wrong
- Catch clause were sometimes not reached in a JIT compiled function
- Stacktraces of errors reported from within a fiber were wrong
catch (any error)was not considered as catching all possible errors by the compiler- Full GC sweep were never triggered
0.2.0 (07-26-2023)
Added
- buzz has a homepage: https://buzz-lang.dev, a Discord and an actual VS Code extension
- JIT compiler powered by MIR
- mimalloc as the main allocator
- Inline if
- Ranges
anytypeas?operator to safely cast somethinghttpstandard lib (with an HTTP client)cryptostandard lib (in progress)list.pop,list.insert,list.forEach,list.reduce,list.filter,list.map,list.reduce,list.sortpattern.replace,pattern.replaceAllstd.randombz_callallows a native function to call a buzz function--astwill dump a script AST in JSON--checkwill check that a script compiles whitout running it- Shebang comment is allowed (
#!/usr/bin/env buzz) at the start of a script
Changed
- Main function signature must either be
fun main([str] args) > voidorfun main([str] args) > int, plus any required errors - Numbers are splitted in two types:
int(32 bits integers) andfloat(64 bits floating points) - Some performance related changes
- VM uses tail calls to dispatch opcode instead of a big switch
- More specialized opcodes to avoid checking types at runtime
- Some minor things...
- Key can be omitted in
foreachstatements - buzz wil now search a library in a list of common directories
exportcan prefix declarations
Fixed
Too many to count...
0.1.0 (11-18-2022)
- static type system
- null safety
- "error safety": much like zig, function signatures must specify which errors can be raised and error must be handled
- objects (struct-like, no inheritance)
- anonymous objects
- protocols
- enums
- lists and maps
- fibers (coroutines)
- userdata (pointer to foreign data wrapped in a buzz value)
- first-class citizen functions
- arrow functions
- generics
- pcre regex
- zic/c interop
- syntax highlighting via vs code extension or by using the TextMate grammar file
- minimal std lib: buffer, fs, io, os, math, gc, debug
