Releases: buzz-language/buzz
0.5.0
The most notable features of this new release are:
- Major syntax changes
- Immutability by default
- Tuples
- Checked subscript
- Performance improvements
Windows support is almost there and will probably be shipped in a minor release in the coming weeks.
Here is the full changelog
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
- Compiler 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:
const 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
The most notable features of this new release are:
- REPL
- WASM build and web REPL
- Tracing JIT
Here is the full changelog:
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
Note: No binaries are provided until I figure out #226
0.3.0
The most notable features of this new release are:
- The introduction of FFI allowing buzz to call C functions very easily (see this example using SDL).
objectgeneric types- Type values
- The new
varkeyword
Here is the full changelog:
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 (#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 to
$"..."(#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
A lot of work went into implementing the JIT compiler: first with LLVM then with MIR which was way faster at compiling. There's also a lot of new features, fixes and changes. See below.
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
This is the first version of buzz.
Here's a quick summary of buzz features as of this release:
- strong 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
- zig/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
You are all welcome to play with buzz and report any issue you encounter.
Please read the README for build instructions and a tour of the language. Documentation for the standard library of the language can be found here.
You'll find binaries for macOS-x86 below. Although I recommend building buzz yourself right now.