use sexpression::{Expression, OwnedExpression, ParseError, read};
fn main() -> Result<(), ParseError> {
println!("S-Expression Parser Examples\n");
println!("1. Basic parsing:");
let source = "(define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1)))))";
let expr = read(source)?;
println!(" Input: {}", source);
println!(" Parsed: {:?}\n", expr);
println!("2. Different data types:");
let types = vec![
"42", "true", "false", "null", "\"hello world\"", "symbol", "(1 2 3)", ];
for input in types {
match read(input) {
Ok(expr) => println!(" {} -> {:?}", input, expr),
Err(e) => println!(" {} -> Error: {}", input, e),
}
}
println!();
println!("3. Error handling:");
let errors = vec![
"(unclosed",
")unexpected",
"",
];
for input in errors {
match read(input) {
Ok(expr) => println!(" {} -> {:?}", input, expr),
Err(e) => println!(" {} -> Error: {}", input, e),
}
}
println!();
println!("4. Converting to owned:");
let borrowed = Expression::Symbol("hello");
let owned: OwnedExpression = borrowed.to_owned();
println!(" Borrowed: {:?}", borrowed);
println!(" Owned: {:?}\n", owned);
println!("5. Complex nested expression:");
let complex = "(define (map f lst) (if (null? lst) '() (cons (f (car lst)) (map f (cdr lst)))))";
match read(complex) {
Ok(expr) => {
println!(" Input: {}", complex);
println!(" Parsed successfully!");
println!(" Expression type: {:?}", std::mem::discriminant(&expr));
}
Err(e) => println!(" Error: {}", e),
}
Ok(())
}