Files
brolang/LANGUAGE.md
T
2026-06-23 18:24:36 +02:00

4.8 KiB

language features

IMPLEMENTED

source and declarations

  • newline-terminated statements and # comments
  • immutable :: bindings, mutable function-local = bindings, and _ sinks
  • immutable and mutable locals
  • package-level globals and functions
  • interned identifiers

types and expressions

  • exact-width i8 through i64, u8 through u64, f32, f64, isize, usize, bool, void, and inferred integer-constrained int
  • target-dependent atomic C primitives from c_char through c_longdouble
  • C primitives remain semantically distinct from exact-width Brolang primitives until target lowering
  • contextual integer and character literals and constant folding of arithmetic and negation trees
  • strict numeric conversions, binary + - * / with checked integer overflow and divide-by-zero traps (floats follow IEEE), and unary negation
  • boolean literals, comparisons, unary !, and short-circuiting and / or
  • arrays [N]T, sentinel arrays [N;S]T, single-item pointers @T, many-item pointers *T, sentinel many-item pointers [*;S]T, pointer offsets, slices, and explicit slicing
  • immutable UTF-8 string literals typed as pointers to static sentinel arrays: @[N;0]u8
  • pointer-to-array .len, indexing, and slicing without explicit dereference
  • arrays expose .len but not .ptr; slices and pointers-to-arrays expose .ptr and preserve sentinel information when available
  • information-preserving and information-forgetting pointer-to-array decay and sentinel slice/pointer weakening; array values never implicitly decay
  • narrow immutable zero-terminated byte pointer conversion to *c_char and [*;0]c_char, without general u8/c_char interchange
  • optionals with trapping postfix ?, orelse, and nullable pointer representation
  • conditional optional unwrapping with immutable guard/then-block bindings, guarded captures, and left-to-right short-circuiting multi-unwrap: if first and second |a, b : guard| { ... }
  • source-order native structs, defined or opaque c_struct, and keyed record literals
  • complete plain imported C structs and unions as runtime values; incomplete or unsupported-layout records remain pointer-only
  • C function pointer types as pointer-sized runtime values, including manual *c_func(...) T spelling and nullable imported callback typedefs
  • postfix pointer dereference, general writable locations, function calls, assignments, compound assignment (+= -= *= /=) with single-evaluation lvalues, and returns
  • first-class exclusive and inclusive integer ranges: start..end and start..=end
  • boolean if statements and while loops with optional post-iteration assignment/expression clauses
  • for loops over ranges, arrays, slices, and pointers-to-arrays, with copy, pointer, and optional usize index captures
  • |@item| pointer captures inherit pointee mutability from the iterable; arrays require an explicit pointer such as &items

functions and packages

  • demand-monomorphized functions
  • bodyful c_func definitions using the c calling convention
  • bodyless c_func declarations with exact, globally unique external symbol names
  • concrete-only foreign signatures
  • Apple Silicon C ABI scalar, pointer, and fixed-signature plain record/union lowering, including narrow integer extension attributes
  • directory packages with merged declarations
  • file-local relative imports, aliases, and qualified member access
  • relative .h imports as synthetic package namespaces
  • transitive external C function prototypes, typedef chains, C scalars, fixed arrays, complete plain records/unions, and pointers to opaque C records
  • imported external C object variables, including writable globals and immutable arrays
  • object-like scalar and plain record/union C macro constants
  • supported static inline C functions through generated external wrappers
  • bodyless manual and imported C variadic declarations with target-aware default argument promotions
  • passing concrete c_func declarations/definitions as C callback values and calling non-null C function pointers with postfix call syntax
  • reference-time diagnostics for unsupported imported C declarations

compiler behavior

  • error-tolerant compilation with runtime diagnostic traps
  • lazy semantic checking of demanded function specializations
  • demand-driven LLVM declarations for referenced foreign functions
  • ordered linking of additional c sources, objects, and libraries
  • replaceable dynamically loaded libclang C-import backend
  • per-compilation C-header import caching by canonical path, target, ordered include paths, and ordered defines
  • static, eager runtime, and deferred problematic globals

PLANNED

foreign functions and linking

  • exporting brolang functions to c
  • additional target-specific C ABI lowering

scalar and compound types

  • tuples and native variadic functions
  • C enums and non-plain C record layouts