From 3e1bf7f9946efe70d452c71494ac77ed39110804 Mon Sep 17 00:00:00 2001 From: Joel Kronqvist Date: Wed, 6 Aug 2025 17:05:55 +0300 Subject: Added print, raised level on which UnboundGeneric error is returned --- src/sexp/display.rs | 1 + src/sexp/mod.rs | 4 +++- src/sexp/step.rs | 15 +++++++++++++++ src/sexp/util.rs | 7 +++++++ 4 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src/sexp') diff --git a/src/sexp/display.rs b/src/sexp/display.rs index c3db144..dc5d6cb 100644 --- a/src/sexp/display.rs +++ b/src/sexp/display.rs @@ -27,6 +27,7 @@ impl fmt::Display for SLeaf { Var(s) => s.to_string(), Quote => "quote".to_string(), Vector => "vector".to_string(), + Print => "print".to_string(), Let => "let".to_string(), Nil => "()".to_string(), }) diff --git a/src/sexp/mod.rs b/src/sexp/mod.rs index 7aa517b..c674ee9 100644 --- a/src/sexp/mod.rs +++ b/src/sexp/mod.rs @@ -33,6 +33,8 @@ pub enum SLeaf { Let, + Print, + Int(i32), True, False, @@ -69,7 +71,7 @@ impl SExp { SCons(a, b) => SCons(a.clone(), b.clone()).check_let().is_some() || ( - (**a == Atom(Quote) || **a == Atom(Vector)) + (**a == Atom(Quote) || **a == Atom(Vector) || **a == Atom(Print)) && b.consists_of_values() ), Atom(Var(_)) => false, diff --git a/src/sexp/step.rs b/src/sexp/step.rs index 816582c..94f6381 100644 --- a/src/sexp/step.rs +++ b/src/sexp/step.rs @@ -309,6 +309,21 @@ impl SExp { None => panic!("unreachable as per match guard arm"), }, + // prints + SCons(op, l) if op.clone().is_print() => match *op { + SCons(_, b) => { + println!("{}", match *b { + SCons(a, b) if *b == Atom(Nil) => *a, + t => t, + }); + Ok(match *l { + SCons(a, b) if *b == Atom(Nil) => *a, + t => t + }) + }, + Atom(_) => panic!("unreachable as per match arm guard"), + }, + // op value and a1 .. an values, and b0, b1 .. bn not values // --------------------------------------------------------- diff --git a/src/sexp/util.rs b/src/sexp/util.rs index a28aaad..507455f 100644 --- a/src/sexp/util.rs +++ b/src/sexp/util.rs @@ -86,4 +86,11 @@ impl SExp { _ => None } } + + pub fn is_print(&self) -> bool { + match self { + SCons(op, _) if **op == Atom(Print) => true, + _ => false + } + } } -- cgit v1.2.3