GitHub - oboard/moonbit-eval: MoonBit language interpreter
Core Language
Basic Types (Int, Bool, String, Double, Char)
✅
Full support for primitive types
Expressions (arithmetic, logical, comparison)
✅
Complete expression evaluation
Variables (let, let mut)
✅
Immutable and mutable variables
Assignment
✅
Variable reassignment and shadowing
Multiline strings
✅
#|syntax for multiline string literals
String interpolation
✅
{variable} syntax in string literals
Type constraints
✅
(value : Type) syntax for explicit typing
Control Flow
If-else
✅
Conditional expressions
For loops
✅
C-style for loops with continue/break
While loops
✅
While loop constructs with else clause
Loop control
✅
Continue and break statements
Guard expressions
✅
guard condition else { action } syntax
Is expressions
✅
Pattern matching with 'is' operator
Defer expressions
✅
defer statement for cleanup code
Return expressions
✅
Early return from functions
Raise expressions
✅
Exception throwing with raise
Try-catch expressions
✅
Exception handling with try-catch
Loop expressions
✅
loop pattern matching with break/continue
Functions
Function definitions
✅
Named functions with parameters
Named parameters
✅
Named and optional parameters
Lambda expressions
✅
Anonymous functions (x => x * 2)
Closures
✅
Proper closure environment capture
Recursive functions
✅
Self-referencing function calls
Currying
✅
Higher-order function composition
External functions
✅
Integration with external calls
Embedded functions
✅
Native function integration
Data Structures
Arrays
✅
Array creation, indexing, assignment
Array methods
✅
length, get, push, pop, contains, slice, concat, join
Array boolean methods
✅
any, all operations
Array spread syntax
✅
[..array1, ..array2] syntax
Array slice operations
✅
arr[start:end], arr[start:], arr[:end] syntax
Array augmented assignment
✅
arr[i] += value, arr[i] *= value syntax
Tuples
✅
Tuple creation, access, destructuring
Structs
✅
Custom data types with methods
Mutable struct fields
✅
Field mutation support
Nested struct references
✅
Reference semantics for nested structures
Record update syntax
✅
{ ..record, field: new_value } syntax
Map literals
✅
{ "key": value } syntax for map creation
Pattern Matching
Basic patterns
✅
Constants, variables, wildcards
Tuple patterns
✅
Destructuring tuples
Array patterns
✅
Array destructuring
Record patterns
✅
Struct field matching
Range patterns
✅
Range expressions (_..<x, 'a'..='z')
Constructor patterns
✅
Constant constructor matching
Or patterns
✅
Multiple pattern alternatives
Nested patterns
✅
Complex nested pattern matching
Enums and Generics
Basic enums
✅
Simple enumeration types
Enums with data
✅
Algebraic data types
Enum pattern matching
✅
Pattern matching on enum variants
Generic types
✅
Generic enums and functions
Generic functions
✅
Polymorphic function definitions
Option Type
Option basics
✅
Some/None construction
Option pattern matching
✅
Pattern matching on Option
Option methods
✅
unwrap, unwrap_or, is_empty, map, filter
Built-in Methods
Bool methods
✅
compare, default
Int methods
✅
Bitwise ops, comparisons, bit manipulation
String methods
✅
length, get, unsafe_get, to_string
Double methods
✅
compare, to_int64
Char methods
✅
compare, to_int
Advanced Features
Type system
✅
Basic type checking and inference
Static method calls
✅
Class::method() syntax
Pipe operator
✅
|> operator for function chaining
Function aliases
✅
Alias support (e.g., not for %bool_not)
Cross-package method calls
✅
Method calls across different packages
Error handling
✅
Result type error handling
Group expressions
✅
Parenthesized expressions for precedence
For-in loops
✅
Iterator-based loops
Iterator methods
✅
iter, map, filter, reduce, for_each
Nested iteration
✅
Complex nested loop structures
Iterator control flow
✅
break/continue in iterator contexts
Package System
Module imports
✅
@package.function syntax
Cross-package types
✅
Using types from other packages
Built-in packages
✅
@int, @math, @bigint, @cmp, @list support
Package method calling
✅
Method calls across package boundaries
IO and FFI
Print functions
✅
println and print support
Embedded functions
✅
Native function integration via FFI
External function binding
✅
Custom function registration
Sorting and Collections
List sorting
✅
Built-in sort methods for collections
Array sorting
✅
Sorting operations on arrays
Collection methods
✅
Comprehensive collection manipulation
Comparison Operations
Equality operators
✅
== and != operators
Relational operators
✅
<, >, <=, >= operators
Type-aware comparison
✅
Proper type checking in comparisons
Constructor Patterns
Single argument matching
✅
Constructor pattern with single args
Named field matching
✅
Constructor patterns with named fields
Wildcard patterns
✅
_ patterns in constructor matching
Functional Programming
Higher-order functions
✅
Functions as first-class values
Function composition
✅
Combining functions effectively
Closure environments
✅
Proper variable capture in closures
Literal Overloading
Numeric literal overloading
✅
Automatic conversion between numeric types
Character literal overloading
✅
Char to Int conversion in pattern matching
String literal overloading
✅
String to Bytes conversion
Array literal overloading
✅
Array to various types (Bytes, String) conversion
Double literal overloading
✅
Double to Float precision conversion
Map literal overloading
✅
Map to Json object conversion
Complex overloading scenarios
✅
Multi-step type conversions
Traits
🟡
Interface definitions
Trait as expressions
🟡
(value as Trait) syntax for trait casting
Packages
🟡
Module system with @package.function syntax (no trait, trait derive, operator overloading)
Attribute
#alias
✅
Function alias
#external
❌
External function binding
#callsite
❌
Call site information
#skip
❌
Skipping compilation of a function
#cfg
❌
Conditional compilation based on configuration
Not Yet Supported
Async/await
❌
Asynchronous programming