A simple S-expression parser and serializer for MoonBit.
{
"import": [
"sennenki/sexp"
]
}///|
test "parsing" {
let s = "(list 1 2 3)"
// Parse returns a Result, use `try!` to unwrap
let sexp = parse(s)
inspect(sexp, content="(list 1 2 3)")
}///|
test "parsing multiple" {
let s = "1 2 3"
let sexps = try! parse_many(s)
inspect(sexps, content="[1, 2, 3]")
}///|
test "conversion" {
let val = [1, 2, 3]
// Convert to Sexp
let sexp = to_sexp(val)
inspect(sexp, content="(1 2 3)")
// Convert back
let back : Array[Int] = try! from_sexp(sexp)
inspect(back, content="[1, 2, 3]")
}///|
struct User {
name : String
age : Int
} derive(Show, Eq)
///|
impl ToSexp for User with to_sexp(self) {
List([Symbol(Symbol::new("user")), String(self.name), Int(self.age)])
}
///|
impl FromSexp for User with from_sexp(sexp, path) {
match sexp {
List([Symbol(s), String(name), Int(age)]) =>
// Note: Symbol comparison should ideally check interned ID if possible,
// or use the derived Eq.
if s == Symbol::new("user") {
{ name, age }
} else {
raise SexpError("Expected 'user' symbol", path)
}
_ => raise SexpError("Invalid user format", path)
}
}
///|
test "custom type" {
let user = { name: "Alice", age: 30 }
let sexp = to_sexp(user)
inspect(sexp, content="(user \"Alice\" 30)")
let back : User = try! from_sexp(sexp)
assert_eq(back, user)
}///|
test "error handling" {
let sexp = Sexp::List([String("not-user"), Int(42)])
// Attempting to decode into User
let result : Result[User, SexpError] = try! from_sexp(sexp)
// You can inspect the error path to find where it failed
inspect(result, content="Err(SexpError at : Invalid user format)")
}impl ToSexp for FixedArray[T]impl ToSexp for StringViewtype SexpPathInstall
Download zipA simple S-expression parser and serializer for MoonBit.