1use crate::scheme::environment::Environment;
30use crate::scheme::value::{Procedure, Value};
31use crate::grove::{Grove, Node};
32use crate::fot::FotBuilder;
33use gc::Gc;
34use std::rc::Rc;
35use std::cell::RefCell;
36
37thread_local! {
48 static EVALUATOR_CONTEXT: RefCell<Option<EvaluatorContext>> = RefCell::new(None);
49}
50
51#[derive(Clone)]
53pub struct EvaluatorContext {
54 pub grove: Option<Rc<dyn Grove>>,
55 pub current_node: Option<Rc<Box<dyn Node>>>,
56 pub backend: Option<Rc<RefCell<dyn FotBuilder>>>,
57}
58
59pub fn get_evaluator_context() -> Option<EvaluatorContext> {
61 EVALUATOR_CONTEXT.with(|ctx| ctx.borrow().clone())
62}
63
64fn has_evaluator_context() -> bool {
66 EVALUATOR_CONTEXT.with(|ctx| ctx.borrow().is_some())
67}
68
69fn set_evaluator_context(ctx: EvaluatorContext) {
71 EVALUATOR_CONTEXT.with(|c| *c.borrow_mut() = Some(ctx));
72}
73
74fn clear_evaluator_context() {
76 EVALUATOR_CONTEXT.with(|c| *c.borrow_mut() = None);
77}
78
79#[derive(Debug, Clone)]
85pub struct EvalError {
86 pub message: String,
87}
88
89impl EvalError {
90 pub fn new(message: String) -> Self {
91 EvalError { message }
92 }
93}
94
95impl std::fmt::Display for EvalError {
96 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
97 write!(f, "Eval error: {}", self.message)
98 }
99}
100
101impl std::error::Error for EvalError {}
102
103pub type EvalResult = Result<Value, EvalError>;
104
105#[derive(Clone)]
114pub struct ConstructionRule {
115 pub element_name: String,
117
118 pub expr: Value,
120}
121
122pub struct ProcessingMode {
127 pub rules: Vec<ConstructionRule>,
131
132 pub default_rule: Option<Value>,
134}
135
136impl ProcessingMode {
137 pub fn new() -> Self {
139 ProcessingMode {
140 rules: Vec::new(),
141 default_rule: None,
142 }
143 }
144
145 pub fn add_rule(&mut self, element_name: String, expr: Value) {
147 self.rules.push(ConstructionRule { element_name, expr });
148 }
149
150 pub fn add_default_rule(&mut self, expr: Value) {
152 self.default_rule = Some(expr);
153 }
154
155 pub fn find_match(&self, gi: &str) -> Option<&ConstructionRule> {
160 self.rules.iter().find(|rule| rule.element_name == gi)
161 }
162}
163
164pub struct Evaluator {
179 grove: Option<Rc<dyn Grove>>,
181
182 current_node: Option<Rc<Box<dyn Node>>>,
188
189 processing_mode: ProcessingMode,
194
195 backend: Option<Rc<RefCell<dyn FotBuilder>>>,
200}
201
202impl Evaluator {
203 pub fn new() -> Self {
205 Evaluator {
206 grove: None,
207 current_node: None,
208 processing_mode: ProcessingMode::new(),
209 backend: None,
210 }
211 }
212
213 pub fn with_grove(grove: Rc<dyn Grove>) -> Self {
215 Evaluator {
216 grove: Some(grove),
217 current_node: None,
218 processing_mode: ProcessingMode::new(),
219 backend: None,
220 }
221 }
222
223 pub fn set_backend(&mut self, backend: Rc<RefCell<dyn FotBuilder>>) {
225 self.backend = Some(backend);
226 }
227
228 pub fn set_grove(&mut self, grove: Rc<dyn Grove>) {
230 self.grove = Some(grove);
231 }
232
233 pub fn grove(&self) -> Option<&Rc<dyn Grove>> {
235 self.grove.as_ref()
236 }
237
238 pub fn set_current_node(&mut self, node: Box<dyn Node>) {
240 self.current_node = Some(Rc::new(node));
241 }
242
243 pub fn current_node(&self) -> Option<Rc<Box<dyn Node>>> {
245 self.current_node.clone()
246 }
247
248 pub fn clear_current_node(&mut self) {
250 self.current_node = None;
251 }
252
253 pub fn process_root(&mut self, env: Gc<Environment>) -> EvalResult {
262 let root_node = match &self.grove {
264 Some(grove) => grove.root(),
265 None => return Err(EvalError::new("No grove set".to_string())),
266 };
267
268 self.current_node = Some(Rc::new(root_node));
270 self.process_node(env)
271 }
272
273 pub fn process_node(&mut self, env: Gc<Environment>) -> EvalResult {
284 let node = match &self.current_node {
285 Some(n) => n.clone(),
286 None => return Err(EvalError::new("No current node".to_string())),
287 };
288
289 let gi = match node.gi() {
291 Some(gi) => gi,
292 None => {
293 return Ok(Value::Unspecified);
296 }
297 };
298
299 let rule = self.processing_mode.find_match(&gi);
301
302 if let Some(rule) = rule {
303 self.eval(rule.expr.clone(), env)
306 } else if let Some(ref default_expr) = self.processing_mode.default_rule {
307 self.eval(default_expr.clone(), env)
309 } else {
310 self.eval_process_children(env)
313 }
314 }
315
316 pub fn eval(&mut self, expr: Value, env: Gc<Environment>) -> EvalResult {
326 let context_was_set = has_evaluator_context();
328 let previous_context = get_evaluator_context();
329
330 set_evaluator_context(EvaluatorContext {
333 grove: self.grove.clone(),
334 current_node: self.current_node.clone(),
335 backend: self.backend.clone(),
336 });
337
338 let result = self.eval_inner(expr, env);
340
341 if context_was_set {
343 if let Some(prev_ctx) = previous_context {
344 set_evaluator_context(prev_ctx);
345 }
346 } else {
347 clear_evaluator_context();
348 }
349
350 result
351 }
352
353 fn eval_inner(&mut self, expr: Value, env: Gc<Environment>) -> EvalResult {
355 match expr {
356 Value::Nil => Ok(Value::Nil),
358 Value::Bool(_) => Ok(expr),
359 Value::Integer(_) => Ok(expr),
360 Value::Real(_) => Ok(expr),
361 Value::Char(_) => Ok(expr),
362 Value::String(_) => Ok(expr),
363 Value::Procedure(_) => Ok(expr),
364 Value::Vector(_) => Ok(expr), Value::Unspecified => Ok(expr),
366 Value::Error => Ok(expr),
367
368 Value::Node(_) => Ok(expr),
370 Value::NodeList(_) => Ok(expr),
371 Value::Sosofo => Ok(expr),
372
373 Value::Symbol(ref name) => env
375 .lookup(name)
376 .ok_or_else(|| EvalError::new(format!("Undefined variable: {}", name))),
377
378 Value::Keyword(_) => Ok(expr),
380
381 Value::Pair(_) => self.eval_list(expr, env),
383 }
384 }
385
386 fn eval_list(&mut self, expr: Value, env: Gc<Environment>) -> EvalResult {
388 let (operator, args) = self.list_car_cdr(&expr)?;
390
391 if let Value::Symbol(ref sym) = operator {
393 match &**sym {
394 "quote" => self.eval_quote(args),
395 "if" => self.eval_if(args, env),
396 "define" => self.eval_define(args, env),
397 "set!" => self.eval_set(args, env),
398 "lambda" => self.eval_lambda(args, env),
399 "let" => self.eval_let(args, env),
400 "let*" => self.eval_let_star(args, env),
401 "letrec" => self.eval_letrec(args, env),
402 "begin" => self.eval_begin(args, env),
403 "cond" => self.eval_cond(args, env),
404 "case" => self.eval_case(args, env),
405 "and" => self.eval_and(args, env),
406 "or" => self.eval_or(args, env),
407 "apply" => self.eval_apply(args, env),
408 "map" => self.eval_map(args, env),
409 "for-each" => self.eval_for_each(args, env),
410 "node-list-filter" => self.eval_node_list_filter(args, env),
411 "node-list-map" => self.eval_node_list_map(args, env),
412 "node-list-some?" => self.eval_node_list_some(args, env),
413 "load" => self.eval_load(args, env),
414
415 "define-language" => self.eval_define_language(args, env),
417 "declare-flow-object-class" => self.eval_declare_flow_object_class(args, env),
418 "declare-characteristic" => self.eval_declare_characteristic(args, env),
419 "element" => self.eval_element(args, env),
420 "default" => self.eval_default(args, env),
421 "process-children" => self.eval_process_children(env),
422 "make" => self.eval_make(args, env),
423
424 _ => self.eval_application(operator, args, env),
426 }
427 } else {
428 self.eval_application(operator, args, env)
430 }
431 }
432
433 fn list_car_cdr(&self, list: &Value) -> Result<(Value, Value), EvalError> {
435 if let Value::Pair(ref p) = list {
436 let pair = p.borrow();
437 Ok((pair.car.clone(), pair.cdr.clone()))
438 } else {
439 Err(EvalError::new("Expected list".to_string()))
440 }
441 }
442
443 fn vec_to_list(&self, vec: Vec<Value>) -> Value {
445 let mut result = Value::Nil;
446 for val in vec.iter().rev() {
447 result = Value::cons(val.clone(), result);
448 }
449 result
450 }
451
452 fn list_to_vec(&self, list: Value) -> Result<Vec<Value>, EvalError> {
454 let mut result = Vec::new();
455 let mut current = list;
456
457 loop {
458 match current {
459 Value::Nil => break,
460 Value::Pair(ref p) => {
461 let pair = p.borrow();
462 result.push(pair.car.clone());
463 let cdr = pair.cdr.clone();
464 drop(pair); current = cdr;
466 }
467 _ => return Err(EvalError::new("Improper list".to_string())),
468 }
469 }
470
471 Ok(result)
472 }
473
474 fn eval_quote(&mut self, args: Value) -> EvalResult {
480 let args_vec = self.list_to_vec(args)?;
481 if args_vec.len() != 1 {
482 return Err(EvalError::new("quote requires exactly 1 argument".to_string()));
483 }
484 Ok(args_vec[0].clone())
485 }
486
487 fn eval_if(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
489 let args_vec = self.list_to_vec(args)?;
490 if args_vec.len() < 2 || args_vec.len() > 3 {
491 return Err(EvalError::new(
492 "if requires 2 or 3 arguments".to_string(),
493 ));
494 }
495
496 let test = self.eval_inner(args_vec[0].clone(), env.clone())?;
497
498 if test.is_true() {
499 self.eval_inner(args_vec[1].clone(), env)
500 } else if args_vec.len() == 3 {
501 self.eval_inner(args_vec[2].clone(), env)
502 } else {
503 Ok(Value::Unspecified)
504 }
505 }
506
507 fn eval_define(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
509 let args_vec = self.list_to_vec(args)?;
510 if args_vec.len() < 2 {
511 return Err(EvalError::new(
512 "define requires at least 2 arguments".to_string(),
513 ));
514 }
515
516 match &args_vec[0] {
518 Value::Symbol(ref name) => {
519 if args_vec.len() != 2 {
521 return Err(EvalError::new(
522 "define with symbol requires exactly 2 arguments".to_string(),
523 ));
524 }
525 let value = self.eval_inner(args_vec[1].clone(), env.clone())?;
526 env.define(name, value);
527 Ok(Value::Unspecified)
528 }
529
530 Value::Pair(_) => {
531 let (name_val, params) = self.list_car_cdr(&args_vec[0])?;
534
535 if let Value::Symbol(ref name) = name_val {
536 let lambda_body = args_vec[1..].to_vec();
538 let mut body_list = Value::Nil;
539 for expr in lambda_body.into_iter().rev() {
540 body_list = Value::cons(expr, body_list);
541 }
542 let lambda_expr = Value::cons(
543 Value::symbol("lambda"),
544 Value::cons(params, body_list),
545 );
546
547 let lambda_value = self.eval_inner(lambda_expr, env.clone())?;
548 env.define(name, lambda_value);
549 Ok(Value::Unspecified)
550 } else {
551 Err(EvalError::new(
552 "First element of define must be a symbol".to_string(),
553 ))
554 }
555 }
556
557 _ => Err(EvalError::new(
558 "First argument to define must be symbol or list".to_string(),
559 )),
560 }
561 }
562
563 fn eval_define_language(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
566 let args_vec = self.list_to_vec(args)?;
567
568 if args_vec.is_empty() {
569 return Err(EvalError::new(
570 "define-language requires at least 1 argument".to_string(),
571 ));
572 }
573
574 if let Value::Symbol(ref name) = args_vec[0] {
576 env.define(name, args_vec[0].clone());
579 Ok(Value::Unspecified)
580 } else {
581 Err(EvalError::new(
582 "First argument to define-language must be a symbol".to_string(),
583 ))
584 }
585 }
586
587 fn eval_declare_flow_object_class(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
590 let args_vec = self.list_to_vec(args)?;
591
592 if args_vec.is_empty() {
593 return Err(EvalError::new(
594 "declare-flow-object-class requires at least 1 argument".to_string(),
595 ));
596 }
597
598 if let Value::Symbol(ref name) = args_vec[0] {
600 env.define(name, args_vec[0].clone());
603 Ok(Value::Unspecified)
604 } else {
605 Err(EvalError::new(
606 "First argument to declare-flow-object-class must be a symbol".to_string(),
607 ))
608 }
609 }
610
611 fn eval_declare_characteristic(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
614 let args_vec = self.list_to_vec(args)?;
615
616 if args_vec.len() < 3 {
617 return Err(EvalError::new(
618 "declare-characteristic requires at least 3 arguments (name, public-id, default-value)".to_string(),
619 ));
620 }
621
622 if let Value::Symbol(ref name) = args_vec[0] {
624 let default_value = self.eval(args_vec[2].clone(), env.clone())?;
626
627 env.define(name, default_value);
629 Ok(Value::Unspecified)
630 } else {
631 Err(EvalError::new(
632 "First argument to declare-characteristic must be a symbol".to_string(),
633 ))
634 }
635 }
636
637 fn eval_element(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
643 let args_vec = self.list_to_vec(args)?;
644
645 if args_vec.len() < 2 {
646 return Err(EvalError::new(
647 "element requires at least 2 arguments (element-name and construction-expression)".to_string(),
648 ));
649 }
650
651 let element_name = if let Value::Symbol(ref name) = args_vec[0] {
653 name.clone()
654 } else {
655 return Err(EvalError::new(
656 "First argument to element must be a symbol".to_string(),
657 ));
658 };
659
660 self.processing_mode.add_rule(element_name.to_string(), args_vec[1].clone());
663
664 Ok(Value::Unspecified)
665 }
666
667 fn eval_default(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
673 let args_vec = self.list_to_vec(args)?;
674
675 if args_vec.is_empty() {
676 return Err(EvalError::new(
677 "default requires at least 1 argument (construction-expression)".to_string(),
678 ));
679 }
680
681 self.processing_mode.add_default_rule(args_vec[0].clone());
683
684 Ok(Value::Unspecified)
685 }
686
687 fn eval_process_children(&mut self, env: Gc<Environment>) -> EvalResult {
693 let current_node = match &self.current_node {
695 Some(node) => node.clone(),
696 None => return Err(EvalError::new("No current node".to_string())),
697 };
698
699 let mut children = current_node.children();
701
702 let mut result = Value::Unspecified;
704 while !children.is_empty() {
705 if let Some(child_node) = children.first() {
707 let saved_node = self.current_node.clone();
709
710 self.current_node = Some(Rc::new(child_node));
712
713 result = self.process_node(env.clone())?;
715
716 self.current_node = saved_node;
718 }
719
720 children = children.rest();
722 }
723
724 Ok(result)
725 }
726
727 fn eval_make(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
733 let args_vec = self.list_to_vec(args)?;
734
735 if args_vec.is_empty() {
736 return Err(EvalError::new(
737 "make requires at least a flow object type".to_string(),
738 ));
739 }
740
741 let fo_type = match &args_vec[0] {
743 Value::Symbol(s) => s.as_ref(),
744 _ => return Err(EvalError::new(
745 "make: first argument must be a flow object type symbol".to_string(),
746 )),
747 };
748
749 let mut i = 1;
751 let mut system_id = None;
752 let mut data = None;
753
754 while i < args_vec.len() {
755 match &args_vec[i] {
756 Value::Keyword(kw) => {
757 if i + 1 >= args_vec.len() {
759 return Err(EvalError::new(
760 format!("make: keyword {} requires a value", kw),
761 ));
762 }
763 let value = self.eval(args_vec[i + 1].clone(), env.clone())?;
764
765 match kw.as_ref() {
766 "system-id" => {
767 if let Value::String(s) = value {
768 system_id = Some(s);
769 } else {
770 return Err(EvalError::new(
771 "make: system-id must be a string".to_string(),
772 ));
773 }
774 }
775 "data" => {
776 if let Value::String(s) = value {
777 data = Some(s);
778 } else {
779 return Err(EvalError::new(
780 "make: data must be a string".to_string(),
781 ));
782 }
783 }
784 _ => {
785 }
787 }
788 i += 2;
789 }
790 _ => {
791 let _result = self.eval(args_vec[i].clone(), env.clone())?;
794 i += 1;
795 }
796 }
797 }
798
799 match self.backend {
801 Some(ref backend) => {
802 match fo_type {
803 "entity" => {
804 if let Some(sid) = system_id {
805 let content = backend.borrow().current_output().to_string();
807 backend.borrow_mut().entity(&sid, &content)
808 .map_err(|e| EvalError::new(format!("Backend error: {}", e)))?;
809 backend.borrow_mut().clear_buffer();
811 } else {
812 return Err(EvalError::new(
813 "make entity requires system-id: keyword".to_string(),
814 ));
815 }
816 }
817 "formatting-instruction" => {
818 if let Some(d) = data {
819 backend.borrow_mut().formatting_instruction(&d)
821 .map_err(|e| EvalError::new(format!("Backend error: {}", e)))?;
822 } else {
823 return Err(EvalError::new(
824 "make formatting-instruction requires data: keyword".to_string(),
825 ));
826 }
827 }
828 "literal" => {
829 if let Some(d) = data {
832 backend.borrow_mut().formatting_instruction(&d)
833 .map_err(|e| EvalError::new(format!("Backend error: {}", e)))?;
834 } else {
835 return Err(EvalError::new(
836 "make literal requires data: keyword or a string body".to_string(),
837 ));
838 }
839 }
840 _ => {
841 return Ok(Value::Unspecified);
843 }
844 }
845 }
846 None => {
847 return Err(EvalError::new(
848 "make: no backend available".to_string(),
849 ));
850 }
851 }
852
853 Ok(Value::Unspecified)
854 }
855
856 fn eval_set(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
858 let args_vec = self.list_to_vec(args)?;
859 if args_vec.len() != 2 {
860 return Err(EvalError::new(
861 "set! requires exactly 2 arguments".to_string(),
862 ));
863 }
864
865 if let Value::Symbol(ref name) = args_vec[0] {
866 let value = self.eval(args_vec[1].clone(), env.clone())?;
867 env.set(name, value)
868 .map_err(|e| EvalError::new(e))?;
869 Ok(Value::Unspecified)
870 } else {
871 Err(EvalError::new(
872 "First argument to set! must be a symbol".to_string(),
873 ))
874 }
875 }
876
877 fn eval_lambda(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
879 let args_vec = self.list_to_vec(args)?;
880 if args_vec.len() < 2 {
881 return Err(EvalError::new(
882 "lambda requires at least 2 arguments (params and body)".to_string(),
883 ));
884 }
885
886 let params_list = &args_vec[0];
888 let params_vec = if params_list.is_nil() {
889 Vec::new()
891 } else {
892 self.list_to_vec(params_list.clone())?
893 };
894
895 let mut param_names = Vec::new();
897 for param in params_vec {
898 if let Value::Symbol(ref name) = param {
899 param_names.push(name.to_string());
900 } else {
901 return Err(EvalError::new(format!(
902 "Lambda parameter must be a symbol, got: {:?}",
903 param
904 )));
905 }
906 }
907
908 let body = if args_vec.len() == 2 {
910 args_vec[1].clone()
912 } else {
913 let mut body_list = Value::Nil;
915 for expr in args_vec[1..].iter().rev() {
916 body_list = Value::cons(expr.clone(), body_list);
917 }
918 Value::cons(Value::symbol("begin"), body_list)
919 };
920
921 Ok(Value::lambda(param_names, body, env))
923 }
924
925 fn eval_let(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
927 let args_vec = self.list_to_vec(args)?;
928 if args_vec.len() < 2 {
929 return Err(EvalError::new(
930 "let requires at least 2 arguments".to_string(),
931 ));
932 }
933
934 if let Value::Symbol(ref loop_name) = args_vec[0] {
936 if args_vec.len() < 3 {
937 return Err(EvalError::new(
938 "named let requires at least 3 arguments".to_string(),
939 ));
940 }
941
942 let bindings_list = &args_vec[1];
944 let bindings = self.list_to_vec(bindings_list.clone())?;
945 let body = &args_vec[2..];
946
947 let mut var_names = Vec::new();
949 let mut init_values = Vec::new();
950 for binding in &bindings {
951 let binding_vec = self.list_to_vec(binding.clone())?;
952 if binding_vec.len() != 2 {
953 return Err(EvalError::new(
954 "named let binding must have exactly 2 elements".to_string(),
955 ));
956 }
957 var_names.push(binding_vec[0].clone());
958 init_values.push(binding_vec[1].clone());
959 }
960
961 let lambda_params = self.vec_to_list(var_names);
963 let mut lambda_body = vec![Value::symbol("lambda"), lambda_params];
964 lambda_body.extend_from_slice(body);
965 let lambda_expr = self.vec_to_list(lambda_body);
966
967 let letrec_binding = Value::cons(
969 Value::symbol(loop_name),
970 Value::cons(lambda_expr, Value::Nil),
971 );
972 let letrec_bindings = Value::cons(letrec_binding, Value::Nil);
973
974 let mut call_expr = vec![Value::symbol(loop_name)];
976 call_expr.extend_from_slice(&init_values);
977 let call = self.vec_to_list(call_expr);
978
979 return self.eval_letrec(self.vec_to_list(vec![letrec_bindings, call]), env);
981 }
982
983 let bindings_list = &args_vec[0];
985 let bindings = self.list_to_vec(bindings_list.clone())?;
986
987 let new_env = Environment::extend(env.clone());
989
990 for binding in bindings {
992 let binding_vec = self.list_to_vec(binding)?;
993 if binding_vec.len() != 2 {
994 return Err(EvalError::new(
995 "let binding must have exactly 2 elements".to_string(),
996 ));
997 }
998
999 if let Value::Symbol(ref name) = binding_vec[0] {
1000 let value = self.eval_inner(binding_vec[1].clone(), env.clone())?;
1001 new_env.define(name, value);
1002 } else {
1003 return Err(EvalError::new(
1004 "Binding variable must be a symbol".to_string(),
1005 ));
1006 }
1007 }
1008
1009 let body = &args_vec[1..];
1011 self.eval_sequence(body, new_env)
1012 }
1013
1014 fn eval_let_star(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1016 let args_vec = self.list_to_vec(args)?;
1017 if args_vec.len() < 2 {
1018 return Err(EvalError::new(
1019 "let* requires at least 2 arguments".to_string(),
1020 ));
1021 }
1022
1023 let bindings_list = &args_vec[0];
1025 let bindings = self.list_to_vec(bindings_list.clone())?;
1026
1027 let current_env = Environment::extend(env);
1029
1030 for binding in bindings {
1032 let binding_vec = self.list_to_vec(binding)?;
1033 if binding_vec.len() != 2 {
1034 return Err(EvalError::new(
1035 "let* binding must have exactly 2 elements".to_string(),
1036 ));
1037 }
1038
1039 if let Value::Symbol(ref name) = binding_vec[0] {
1040 let value = self.eval_inner(binding_vec[1].clone(), current_env.clone())?;
1041 current_env.define(name, value);
1042 } else {
1043 return Err(EvalError::new(
1044 "Binding variable must be a symbol".to_string(),
1045 ));
1046 }
1047 }
1048
1049 let body = &args_vec[1..];
1051 self.eval_sequence(body, current_env)
1052 }
1053
1054 fn eval_letrec(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1064 let args_vec = self.list_to_vec(args)?;
1065 if args_vec.len() < 2 {
1066 return Err(EvalError::new(
1067 "letrec requires at least 2 arguments".to_string(),
1068 ));
1069 }
1070
1071 let bindings_list = &args_vec[0];
1073 let bindings = self.list_to_vec(bindings_list.clone())?;
1074
1075 let new_env = Environment::extend(env);
1077
1078 let mut var_names = Vec::new();
1080 for binding in &bindings {
1081 let binding_vec = self.list_to_vec(binding.clone())?;
1082 if binding_vec.len() != 2 {
1083 return Err(EvalError::new(
1084 "letrec binding must have exactly 2 elements".to_string(),
1085 ));
1086 }
1087
1088 if let Value::Symbol(ref name) = binding_vec[0] {
1089 var_names.push(name.to_string());
1090 new_env.define(name, Value::Unspecified);
1091 } else {
1092 return Err(EvalError::new(
1093 "Binding variable must be a symbol".to_string(),
1094 ));
1095 }
1096 }
1097
1098 for (i, binding) in bindings.iter().enumerate() {
1100 let binding_vec = self.list_to_vec(binding.clone())?;
1101 let value = self.eval_inner(binding_vec[1].clone(), new_env.clone())?;
1102
1103 new_env.set(&var_names[i], value)
1105 .map_err(|e| EvalError::new(e))?;
1106 }
1107
1108 let body = &args_vec[1..];
1110 self.eval_sequence(body, new_env)
1111 }
1112
1113 fn eval_begin(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1115 let args_vec = self.list_to_vec(args)?;
1116 self.eval_sequence(&args_vec, env)
1117 }
1118
1119 fn eval_cond(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1121 let clauses = self.list_to_vec(args)?;
1122
1123 for clause in clauses {
1124 let clause_vec = self.list_to_vec(clause)?;
1125 if clause_vec.is_empty() {
1126 return Err(EvalError::new("Empty cond clause".to_string()));
1127 }
1128
1129 if let Value::Symbol(ref sym) = clause_vec[0] {
1131 if &**sym == "else" {
1132 return self.eval_sequence(&clause_vec[1..], env);
1133 }
1134 }
1135
1136 let test = self.eval_inner(clause_vec[0].clone(), env.clone())?;
1138 if test.is_true() {
1139 if clause_vec.len() == 1 {
1140 return Ok(test);
1141 } else {
1142 return self.eval_sequence(&clause_vec[1..], env);
1143 }
1144 }
1145 }
1146
1147 Ok(Value::Unspecified)
1148 }
1149
1150 fn eval_case(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1164 let args_vec = self.list_to_vec(args)?;
1165 if args_vec.is_empty() {
1166 return Err(EvalError::new("case requires at least 1 argument".to_string()));
1167 }
1168
1169 let key = self.eval_inner(args_vec[0].clone(), env.clone())?;
1171
1172 for clause in &args_vec[1..] {
1174 let clause_vec = self.list_to_vec(clause.clone())?;
1175 if clause_vec.is_empty() {
1176 return Err(EvalError::new("Empty case clause".to_string()));
1177 }
1178
1179 if let Value::Symbol(ref sym) = clause_vec[0] {
1181 if &**sym == "else" {
1182 return self.eval_sequence(&clause_vec[1..], env);
1183 }
1184 }
1185
1186 let datums = self.list_to_vec(clause_vec[0].clone())?;
1188
1189 for datum in datums {
1193 if key.equal(&datum) {
1194 if clause_vec.len() == 1 {
1196 return Ok(Value::Unspecified);
1198 } else {
1199 return self.eval_sequence(&clause_vec[1..], env);
1200 }
1201 }
1202 }
1203 }
1204
1205 Ok(Value::Unspecified)
1207 }
1208
1209 fn eval_and(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1211 let args_vec = self.list_to_vec(args)?;
1212
1213 if args_vec.is_empty() {
1214 return Ok(Value::bool(true));
1215 }
1216
1217 let mut result = Value::bool(true);
1218 for expr in args_vec {
1219 result = self.eval_inner(expr, env.clone())?;
1220 if !result.is_true() {
1221 return Ok(Value::bool(false));
1222 }
1223 }
1224
1225 Ok(result)
1226 }
1227
1228 fn eval_or(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1230 let args_vec = self.list_to_vec(args)?;
1231
1232 for expr in args_vec {
1233 let result = self.eval_inner(expr, env.clone())?;
1234 if result.is_true() {
1235 return Ok(result);
1236 }
1237 }
1238
1239 Ok(Value::bool(false))
1240 }
1241
1242 fn eval_sequence(&mut self, exprs: &[Value], env: Gc<Environment>) -> EvalResult {
1244 if exprs.is_empty() {
1245 return Ok(Value::Unspecified);
1246 }
1247
1248 let mut result = Value::Unspecified;
1249 for expr in exprs {
1250 result = self.eval_inner(expr.clone(), env.clone())?;
1251 }
1252
1253 Ok(result)
1254 }
1255
1256 fn eval_apply(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1261 let args_vec = self.list_to_vec(args)?;
1262 if args_vec.len() != 2 {
1263 return Err(EvalError::new(
1264 "apply requires exactly 2 arguments".to_string(),
1265 ));
1266 }
1267
1268 let proc = self.eval_inner(args_vec[0].clone(), env.clone())?;
1270
1271 let arg_list = self.eval_inner(args_vec[1].clone(), env)?;
1273
1274 let arg_values = self.list_to_vec(arg_list)?;
1276
1277 self.apply(proc, arg_values)
1279 }
1280
1281 fn eval_map(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1295 let args_vec = self.list_to_vec(args)?;
1296 if args_vec.len() < 2 {
1297 return Err(EvalError::new("map requires at least 2 arguments".to_string()));
1298 }
1299
1300 let proc = self.eval_inner(args_vec[0].clone(), env.clone())?;
1302
1303 let mut lists = Vec::new();
1305 for i in 1..args_vec.len() {
1306 let list = self.eval_inner(args_vec[i].clone(), env.clone())?;
1307 let list_vec = self.list_to_vec(list)?;
1308 lists.push(list_vec);
1309 }
1310
1311 if lists.is_empty() {
1313 return Ok(Value::Nil);
1314 }
1315
1316 let length = lists[0].len();
1317 for list in &lists[1..] {
1318 if list.len() != length {
1319 return Err(EvalError::new(
1320 "map: all lists must have the same length".to_string(),
1321 ));
1322 }
1323 }
1324
1325 let mut result_vec = Vec::new();
1327 for i in 0..length {
1328 let mut proc_args = Vec::new();
1330 for list in &lists {
1331 proc_args.push(list[i].clone());
1332 }
1333
1334 let result = self.apply(proc.clone(), proc_args)?;
1336 result_vec.push(result);
1337 }
1338
1339 let mut result_list = Value::Nil;
1341 for elem in result_vec.into_iter().rev() {
1342 result_list = Value::cons(elem, result_list);
1343 }
1344
1345 Ok(result_list)
1346 }
1347
1348 fn eval_for_each(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1356 let args_vec = self.list_to_vec(args)?;
1357 if args_vec.len() < 2 {
1358 return Err(EvalError::new(
1359 "for-each requires at least 2 arguments".to_string(),
1360 ));
1361 }
1362
1363 let proc = self.eval_inner(args_vec[0].clone(), env.clone())?;
1365
1366 let mut lists = Vec::new();
1368 for i in 1..args_vec.len() {
1369 let list = self.eval_inner(args_vec[i].clone(), env.clone())?;
1370 let list_vec = self.list_to_vec(list)?;
1371 lists.push(list_vec);
1372 }
1373
1374 if lists.is_empty() {
1376 return Ok(Value::Unspecified);
1377 }
1378
1379 let length = lists[0].len();
1380 for list in &lists[1..] {
1381 if list.len() != length {
1382 return Err(EvalError::new(
1383 "for-each: all lists must have the same length".to_string(),
1384 ));
1385 }
1386 }
1387
1388 for i in 0..length {
1390 let mut proc_args = Vec::new();
1392 for list in &lists {
1393 proc_args.push(list[i].clone());
1394 }
1395
1396 self.apply(proc.clone(), proc_args)?;
1398 }
1399
1400 Ok(Value::Unspecified)
1401 }
1402
1403 fn eval_node_list_filter(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1408 let args_vec = self.list_to_vec(args)?;
1409 if args_vec.len() != 2 {
1410 return Err(EvalError::new("node-list-filter requires exactly 2 arguments".to_string()));
1411 }
1412
1413 let pred = self.eval_inner(args_vec[0].clone(), env.clone())?;
1415
1416 let node_list_val = self.eval_inner(args_vec[1].clone(), env.clone())?;
1418
1419 match node_list_val {
1420 Value::NodeList(ref nl) => {
1421 let mut filtered_nodes = Vec::new();
1422
1423 let mut index = 0;
1425 loop {
1426 if let Some(node) = nl.get(index) {
1427 let node_val = Value::node(node);
1429 let result = self.apply(pred.clone(), vec![node_val.clone()])?;
1430
1431 if !matches!(result, Value::Bool(false)) {
1433 if let Value::Node(n) = node_val {
1435 filtered_nodes.push(n.as_ref().clone_node());
1436 }
1437 }
1438
1439 index += 1;
1440 } else {
1441 break;
1442 }
1443 }
1444
1445 Ok(Value::node_list(Box::new(crate::grove::VecNodeList::new(filtered_nodes))))
1446 }
1447 _ => Err(EvalError::new(format!("node-list-filter: second argument not a node-list: {:?}", node_list_val))),
1448 }
1449 }
1450
1451 fn eval_node_list_map(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1461 let args_vec = self.list_to_vec(args)?;
1462 if args_vec.len() != 2 {
1463 return Err(EvalError::new("node-list-map requires exactly 2 arguments".to_string()));
1464 }
1465
1466 let proc = self.eval_inner(args_vec[0].clone(), env.clone())?;
1468
1469 let node_list_val = self.eval_inner(args_vec[1].clone(), env.clone())?;
1471
1472 let mut result_nodes: Vec<Box<dyn crate::grove::Node>> = Vec::new();
1474
1475 match node_list_val {
1476 Value::Node(ref n) => {
1477 let node_val = Value::node(n.as_ref().clone_node());
1479 let result = self.apply(proc, vec![node_val])?;
1480
1481 match result {
1484 Value::Node(n) => {
1485 result_nodes.push(n.as_ref().clone_node());
1487 }
1488 Value::NodeList(nl) => {
1489 let mut index = 0;
1491 while let Some(node) = nl.get(index) {
1492 result_nodes.push(node);
1493 index += 1;
1494 }
1495 }
1496 _ => {
1497 }
1500 }
1501 }
1502 Value::NodeList(ref nl) => {
1503 let mut index = 0;
1505 loop {
1506 if let Some(node) = nl.get(index) {
1507 let node_val = Value::node(node);
1509 let result = self.apply(proc.clone(), vec![node_val])?;
1510
1511 match result {
1513 Value::Node(n) => {
1514 result_nodes.push(n.as_ref().clone_node());
1516 index += 1;
1517 }
1518 Value::NodeList(nl_result) => {
1519 let mut nl_index = 0;
1521 while let Some(node) = nl_result.get(nl_index) {
1522 result_nodes.push(node);
1523 nl_index += 1;
1524 }
1525 index += 1;
1526 }
1527 _ => {
1528 break;
1530 }
1531 }
1532 } else {
1533 break;
1534 }
1535 }
1536 }
1537 _ => return Err(EvalError::new(format!("node-list-map: second argument must be a node or node-list: {:?}", node_list_val))),
1538 }
1539
1540 Ok(Value::node_list(Box::new(crate::grove::VecNodeList::new(result_nodes))))
1542 }
1543
1544 fn eval_node_list_some(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1550 let args_vec = self.list_to_vec(args)?;
1551 if args_vec.len() != 2 {
1552 return Err(EvalError::new("node-list-some? requires exactly 2 arguments".to_string()));
1553 }
1554
1555 let pred = self.eval_inner(args_vec[0].clone(), env.clone())?;
1557
1558 let node_list_val = self.eval_inner(args_vec[1].clone(), env.clone())?;
1560
1561 match node_list_val {
1562 Value::NodeList(ref nl) => {
1563 let mut index = 0;
1565 loop {
1566 if let Some(node) = nl.get(index) {
1567 let node_val = Value::node(node);
1569 let result = self.apply(pred.clone(), vec![node_val])?;
1570
1571 if !matches!(result, Value::Bool(false)) {
1573 return Ok(Value::bool(true));
1574 }
1575
1576 index += 1;
1577 } else {
1578 break;
1579 }
1580 }
1581
1582 Ok(Value::bool(false))
1584 }
1585 _ => Err(EvalError::new(format!("node-list-some?: second argument not a node-list: {:?}", node_list_val))),
1586 }
1587 }
1588
1589 fn eval_load(&mut self, args: Value, env: Gc<Environment>) -> EvalResult {
1594 let args_vec = self.list_to_vec(args)?;
1595 if args_vec.len() != 1 {
1596 return Err(EvalError::new(
1597 "load requires exactly 1 argument".to_string(),
1598 ));
1599 }
1600
1601 let filename_val = self.eval_inner(args_vec[0].clone(), env.clone())?;
1603
1604 let filename = match filename_val {
1605 Value::String(s) => s.to_string(),
1606 _ => return Err(EvalError::new(
1607 format!("load: filename must be a string, got {:?}", filename_val)
1608 )),
1609 };
1610
1611 let contents = std::fs::read_to_string(&filename)
1613 .map_err(|e| EvalError::new(format!("load: cannot read file '{}': {}", filename, e)))?;
1614
1615 let mut parser = crate::scheme::parser::Parser::new(&contents);
1617 let mut result = Value::Unspecified;
1618
1619 loop {
1621 match parser.parse() {
1622 Ok(expr) => {
1623 result = self.eval_inner(expr, env.clone())?;
1624 }
1625 Err(e) => {
1626 let error_msg = e.to_string();
1628 if error_msg.contains("Unexpected end of input")
1629 || error_msg.contains("Expected")
1630 || error_msg.contains("EOF") {
1631 break;
1632 }
1633 return Err(EvalError::new(
1634 format!("load: parse error in '{}': {}", filename, e)
1635 ));
1636 }
1637 }
1638 }
1639
1640 Ok(result)
1641 }
1642
1643 fn eval_application(
1649 &mut self,
1650 operator: Value,
1651 args: Value,
1652 env: Gc<Environment>,
1653 ) -> EvalResult {
1654 let proc = self.eval_inner(operator, env.clone())?;
1656
1657 let args_vec = self.list_to_vec(args)?;
1659 let mut evaled_args = Vec::new();
1660 for arg in args_vec {
1661 evaled_args.push(self.eval_inner(arg, env.clone())?);
1662 }
1663
1664 self.apply(proc, evaled_args)
1666 }
1667
1668 fn apply(&mut self, proc: Value, args: Vec<Value>) -> EvalResult {
1670 if let Value::Procedure(ref p) = proc {
1671 match &**p {
1672 Procedure::Primitive { func, .. } => {
1673 func(&args).map_err(|e| EvalError::new(e))
1674 }
1675 Procedure::Lambda { params, body, env } => {
1676 if args.len() != params.len() {
1678 return Err(EvalError::new(format!(
1679 "Lambda expects {} arguments, got {}",
1680 params.len(),
1681 args.len()
1682 )));
1683 }
1684
1685 let lambda_env = Environment::extend(env.clone());
1687
1688 for (param_name, arg_value) in params.iter().zip(args.iter()) {
1690 lambda_env.define(param_name, arg_value.clone());
1691 }
1692
1693 self.eval_inner((**body).clone(), lambda_env)
1695 }
1696 }
1697 } else {
1698 Err(EvalError::new(format!(
1699 "Not a procedure: {:?}",
1700 proc
1701 )))
1702 }
1703 }
1704}
1705
1706impl Default for Evaluator {
1707 fn default() -> Self {
1708 Self::new()
1709 }
1710}
1711
1712#[cfg(test)]
1717mod tests {
1718 use super::*;
1719
1720 fn make_env() -> Gc<Environment> {
1721 Environment::new_global()
1722 }
1723
1724 #[test]
1725 fn test_eval_self_evaluating() {
1726 let mut eval = Evaluator::new();
1727 let env = make_env();
1728
1729 assert!(eval.eval(Value::integer(42), env.clone()).unwrap().is_integer());
1730 assert!(eval.eval(Value::bool(true), env.clone()).unwrap().is_bool());
1731 assert!(eval.eval(Value::string("hello".to_string()), env).unwrap().is_string());
1732 }
1733
1734 #[test]
1735 fn test_eval_quote() {
1736 let mut eval = Evaluator::new();
1737 let env = make_env();
1738
1739 let expr = Value::cons(
1741 Value::symbol("quote"),
1742 Value::cons(
1743 Value::cons(
1744 Value::integer(1),
1745 Value::cons(Value::integer(2), Value::cons(Value::integer(3), Value::Nil)),
1746 ),
1747 Value::Nil,
1748 ),
1749 );
1750
1751 let result = eval.eval(expr, env).unwrap();
1752 assert!(result.is_list());
1753 }
1754
1755 #[test]
1756 fn test_eval_if_true() {
1757 let mut eval = Evaluator::new();
1758 let env = make_env();
1759
1760 let expr = Value::cons(
1762 Value::symbol("if"),
1763 Value::cons(
1764 Value::bool(true),
1765 Value::cons(Value::integer(1), Value::cons(Value::integer(2), Value::Nil)),
1766 ),
1767 );
1768
1769 let result = eval.eval(expr, env).unwrap();
1770 if let Value::Integer(n) = result {
1771 assert_eq!(n, 1);
1772 } else {
1773 panic!("Expected integer 1");
1774 }
1775 }
1776
1777 #[test]
1778 fn test_eval_if_false() {
1779 let mut eval = Evaluator::new();
1780 let env = make_env();
1781
1782 let expr = Value::cons(
1784 Value::symbol("if"),
1785 Value::cons(
1786 Value::bool(false),
1787 Value::cons(Value::integer(1), Value::cons(Value::integer(2), Value::Nil)),
1788 ),
1789 );
1790
1791 let result = eval.eval(expr, env).unwrap();
1792 if let Value::Integer(n) = result {
1793 assert_eq!(n, 2);
1794 } else {
1795 panic!("Expected integer 2");
1796 }
1797 }
1798
1799 #[test]
1800 fn test_eval_define() {
1801 let mut eval = Evaluator::new();
1802 let env = make_env();
1803
1804 let expr = Value::cons(
1806 Value::symbol("define"),
1807 Value::cons(Value::symbol("x"), Value::cons(Value::integer(42), Value::Nil)),
1808 );
1809
1810 eval.eval(expr, env.clone()).unwrap();
1811
1812 assert!(env.is_defined("x"));
1814 if let Value::Integer(n) = env.lookup("x").unwrap() {
1815 assert_eq!(n, 42);
1816 }
1817 }
1818
1819 #[test]
1820 fn test_eval_symbol_lookup() {
1821 let mut eval = Evaluator::new();
1822 let env = make_env();
1823
1824 env.define("x", Value::integer(99));
1825
1826 let result = eval.eval(Value::symbol("x"), env).unwrap();
1827 if let Value::Integer(n) = result {
1828 assert_eq!(n, 99);
1829 } else {
1830 panic!("Expected integer 99");
1831 }
1832 }
1833
1834 #[test]
1835 fn test_eval_and() {
1836 let mut eval = Evaluator::new();
1837 let env = make_env();
1838
1839 let expr = Value::cons(
1841 Value::symbol("and"),
1842 Value::cons(Value::bool(true), Value::cons(Value::bool(true), Value::Nil)),
1843 );
1844
1845 let result = eval.eval(expr, env.clone()).unwrap();
1846 assert!(result.is_true());
1847
1848 let expr = Value::cons(
1850 Value::symbol("and"),
1851 Value::cons(Value::bool(true), Value::cons(Value::bool(false), Value::Nil)),
1852 );
1853
1854 let result = eval.eval(expr, env).unwrap();
1855 assert!(!result.is_true());
1856 }
1857
1858 #[test]
1859 fn test_eval_or() {
1860 let mut eval = Evaluator::new();
1861 let env = make_env();
1862
1863 let expr = Value::cons(
1865 Value::symbol("or"),
1866 Value::cons(Value::bool(false), Value::cons(Value::bool(true), Value::Nil)),
1867 );
1868
1869 let result = eval.eval(expr, env.clone()).unwrap();
1870 assert!(result.is_true());
1871
1872 let expr = Value::cons(
1874 Value::symbol("or"),
1875 Value::cons(Value::bool(false), Value::cons(Value::bool(false), Value::Nil)),
1876 );
1877
1878 let result = eval.eval(expr, env).unwrap();
1879 assert!(!result.is_true());
1880 }
1881
1882 #[test]
1883 fn test_eval_lambda_creation() {
1884 let mut eval = Evaluator::new();
1885 let env = make_env();
1886
1887 let expr = Value::cons(
1889 Value::symbol("lambda"),
1890 Value::cons(
1891 Value::cons(Value::symbol("x"), Value::Nil),
1892 Value::cons(Value::symbol("x"), Value::Nil),
1893 ),
1894 );
1895
1896 let result = eval.eval(expr, env).unwrap();
1897 assert!(result.is_procedure());
1898 }
1899
1900 #[test]
1901 fn test_eval_lambda_application() {
1902 let mut eval = Evaluator::new();
1903 let env = make_env();
1904
1905 let lambda_expr = Value::cons(
1907 Value::symbol("lambda"),
1908 Value::cons(
1909 Value::cons(Value::symbol("x"), Value::Nil),
1910 Value::cons(Value::symbol("x"), Value::Nil),
1911 ),
1912 );
1913
1914 let app_expr = Value::cons(lambda_expr, Value::cons(Value::integer(42), Value::Nil));
1915
1916 let result = eval.eval(app_expr, env).unwrap();
1917 if let Value::Integer(n) = result {
1918 assert_eq!(n, 42);
1919 } else {
1920 panic!("Expected integer 42");
1921 }
1922 }
1923
1924 #[test]
1925 fn test_eval_lambda_multiple_params() {
1926 let mut eval = Evaluator::new();
1927 let env = make_env();
1928
1929 let params = Value::cons(Value::symbol("x"), Value::cons(Value::symbol("y"), Value::Nil));
1931 let body = Value::symbol("x");
1932
1933 let lambda_expr = Value::cons(Value::symbol("lambda"), Value::cons(params, Value::cons(body, Value::Nil)));
1934
1935 let app_expr = Value::cons(
1936 lambda_expr,
1937 Value::cons(Value::integer(1), Value::cons(Value::integer(2), Value::Nil)),
1938 );
1939
1940 let result = eval.eval(app_expr, env).unwrap();
1941 if let Value::Integer(n) = result {
1942 assert_eq!(n, 1);
1943 } else {
1944 panic!("Expected integer 1");
1945 }
1946 }
1947
1948 #[test]
1949 fn test_eval_lambda_wrong_arg_count() {
1950 let mut eval = Evaluator::new();
1951 let env = make_env();
1952
1953 let lambda_expr = Value::cons(
1955 Value::symbol("lambda"),
1956 Value::cons(
1957 Value::cons(Value::symbol("x"), Value::Nil),
1958 Value::cons(Value::symbol("x"), Value::Nil),
1959 ),
1960 );
1961
1962 let app_expr = Value::cons(
1963 lambda_expr,
1964 Value::cons(Value::integer(1), Value::cons(Value::integer(2), Value::Nil)),
1965 );
1966
1967 let result = eval.eval(app_expr, env);
1968 assert!(result.is_err());
1969 }
1970
1971 #[test]
1972 fn test_eval_lambda_closure() {
1973 let mut eval = Evaluator::new();
1974 let env = make_env();
1975
1976 env.define("x", Value::integer(10));
1978
1979 let lambda_expr = Value::cons(
1982 Value::symbol("lambda"),
1983 Value::cons(
1984 Value::cons(Value::symbol("y"), Value::Nil),
1985 Value::cons(Value::symbol("x"), Value::Nil),
1986 ),
1987 );
1988
1989 let app_expr = Value::cons(lambda_expr, Value::cons(Value::integer(20), Value::Nil));
1990
1991 let result = eval.eval(app_expr, env).unwrap();
1992 if let Value::Integer(n) = result {
1993 assert_eq!(n, 10); } else {
1995 panic!("Expected integer 10 from closure");
1996 }
1997 }
1998
1999 #[test]
2000 fn test_eval_lambda_no_params() {
2001 let mut eval = Evaluator::new();
2002 let env = make_env();
2003
2004 let lambda_expr = Value::cons(
2006 Value::symbol("lambda"),
2007 Value::cons(Value::Nil, Value::cons(Value::integer(42), Value::Nil)),
2008 );
2009
2010 let app_expr = Value::cons(lambda_expr, Value::Nil);
2011
2012 let result = eval.eval(app_expr, env).unwrap();
2013 if let Value::Integer(n) = result {
2014 assert_eq!(n, 42);
2015 } else {
2016 panic!("Expected integer 42");
2017 }
2018 }
2019
2020 #[test]
2021 fn test_eval_lambda_multiple_body_expressions() {
2022 let mut eval = Evaluator::new();
2023 let env = make_env();
2024
2025 let params = Value::cons(Value::symbol("x"), Value::Nil);
2028 let body1 = Value::integer(1);
2029 let body2 = Value::integer(2);
2030 let body3 = Value::symbol("x");
2031
2032 let lambda_expr = Value::cons(
2033 Value::symbol("lambda"),
2034 Value::cons(
2035 params,
2036 Value::cons(body1, Value::cons(body2, Value::cons(body3, Value::Nil))),
2037 ),
2038 );
2039
2040 let app_expr = Value::cons(lambda_expr, Value::cons(Value::integer(99), Value::Nil));
2041
2042 let result = eval.eval(app_expr, env).unwrap();
2043 if let Value::Integer(n) = result {
2044 assert_eq!(n, 99);
2045 } else {
2046 panic!("Expected integer 99");
2047 }
2048 }
2049}