moonbit-eval

    MoonBit Eval Package

    moonbit
    eval
    Download zip
    Author
    Version
    0.8.26
    License
    Apache-2.0
    Last updated
    5 months ago
    Downloads
    161

    Dependencies

    #MoonBit Eval

    Version GitHub Workflow Status (with event) License

    #Demo

    🚀 REPL Demo

    #Introduction

    MoonBit Eval is an interpreter for the MoonBit language.

    Built on top of the @moonbitlang/parser library, it provides comprehensive and accurate MoonBit syntax support, capable of correctly parsing and executing complex MoonBit code structures including functions, structs, lambdas, loops, and more.

    #Quick Start

    let vm = MoonBitVM::new()

    // Basic expressions
    inspect(vm.eval("1 + 2 * 3"), content="7")
    inspect(vm.eval("\"hello\" + \" world\""), content="hello world")

    // Variables and functions
    inspect(vm.eval("let x = 42"), content="()")
    inspect(vm.eval("fn double(n: Int) -> Int { n * 2 }"), content="(n: Int) -> Int")
    inspect(vm.eval("double(x)"), content="84")

    // Control flow
    inspect(vm.eval("if x > 40 { \"big\" } else { \"small\" }"), content="big")

    // Pattern matching
    inspect(vm.eval("match (1, 2) { (a, b) => a + b }"), content="3")

    // Using aliases (new parser style)
    inspect(vm.eval("using @int {abs}", top=true), content="()")
    inspect(vm.eval("abs(-5)"), content="5")

    #Parser Notes

    • parse_code_to_expr now uses the same path as moonbitlang/parser handrolled parser tests: lexer.tokens_from_string(...).tokens -> handrolled_parser.parse_expr(...).
    • This removes the old wrapper trick (fn init { ... }) and keeps expression parsing behavior aligned with upstream.
    • Diagnostics from parser reports are preserved and returned in Err(...) when parse fails.

    #✨ Features

    • ✅ đŸĨŽ Mooncakes Loader: Load Mooncakes packages at runtime
    • ✅ Builtin FileSystem Library: Provides basic file system operations.
    • ✅ Eval Function: Allows dynamic evaluation of MoonBit code strings.

    #MoonBit Language Support

    FeatureStatusDescription
    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✅using @pkg {name} alias support
    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🟡Limited bridge support via %async.run / %async.suspend (no scheduler/event loop)

    #Contributing

    We welcome contributions to the MoonBit Eval project! Whether it's bug fixes, feature additions, or documentation improvements, your contributions are valuable.

    #Community

    Join our community for discussions and support:
    • QQ Group: 949886784

    QQ įž¤

    MoonBitVM

    pub(all) struct MoonBitVM {
    interpreter :
    ClosureInterpreter

    log : Bool
    }

    MoonBitVM::create

    fn MoonBitVM::create(log? : Bool) -> MoonBitVM

    MoonBitVM::eval

    fn MoonBitVM::eval(self : MoonBitVM, code : String, log? : Bool, top? : Bool) -> EvalResult

    MoonBitVM::new

    fn MoonBitVM::new(log? : Bool) -> MoonBitVM

    code_to_ast

    fn code_to_ast(code : String) -> String

    eval_result_to_string

    fn eval_result_to_string(result : EvalResult) -> String

    expr_to_string

    fn expr_to_string(expr :
    Expr
    ) -> String

    value_to_json

    value_to_string

    Powered by MoonBit

    Site sourceReport issuePackagesBuild queueSkillsStatistics

    Š 2026 mooncakes.io