From 4176d439e5e07d48f5eebc4c68acc5a8d8fcebc3 Mon Sep 17 00:00:00 2001 From: Yiyun Liu Date: Fri, 6 Jun 2025 13:32:54 -0400 Subject: [PATCH] Add a unit test for the supercombinators --- tests/eval.rkt | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/eval.rkt diff --git a/tests/eval.rkt b/tests/eval.rkt new file mode 100644 index 0000000..00befa9 --- /dev/null +++ b/tests/eval.rkt @@ -0,0 +1,30 @@ +#lang typed/racket +(require "../semantics.rkt") +(require "../ast.rkt") +(require typed/rackunit) + +(: exp->program (-> CoreExpr CoreProgram)) +(define (exp->program i) + (list `(define (main) ,i))) + +(define-syntax ap-exp + (syntax-rules () + [(ap-exp a) a] + [(ap-exp a b c ...) + (ap-exp (list a b) c ...)])) + +(: program-final-node (-> CoreProgram Node)) +(define (program-final-node prog) + (let* ([st (last (eval-state (compile-core prog)))] + [stack (State-stack st)] + [heap (State-heap st)]) + (if (null? stack) + (error "impossible: not a final node") + (lookup-node heap (first stack))))) + +(: exp-final-node (-> CoreExpr Node)) +(define (exp-final-node e) + (program-final-node (exp->program e))) + +(check-equal? (exp-final-node (ap-exp 'S 'K 'K 3)) 3) +(check-equal? (exp-final-node (ap-exp 'K 100 99)) 100)