From 167e91d8164cf561f25fa0c2463d63d534d62d36 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Sun, 10 Aug 2025 21:33:25 +0100 Subject: [PATCH] Add call AM operation --- lib/am.c | 8 ++++++++ lib/eval.c | 8 +------- lib/include/am.h | 1 + tests/am_tests.c | 24 ++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lib/am.c b/lib/am.c index 9994321..4321368 100644 --- a/lib/am.c +++ b/lib/am.c @@ -53,3 +53,11 @@ void am_assign(am_t *am, am_reg_t dest, am_reg_t src) { am->regs[dest] = am->regs[src]; } + +void am_call(am_t *am, am_reg_t proc) +{ + assert(am->regs[proc]->is_atom); + assert(am->regs[proc]->atom.type == ATOM_TYPE_PRIM_PROC); + assert(am->regs[proc]->atom.prim_proc != NULL); + am->regs[proc]->atom.prim_proc(am); +} diff --git a/lib/eval.c b/lib/eval.c index 74a0c99..8bb96ba 100644 --- a/lib/eval.c +++ b/lib/eval.c @@ -41,14 +41,8 @@ static void eval_list(am_t *am) am_append(am, ARGL, VAL); } - assert(AM_EXPR(am)->is_atom); - assert(AM_EXPR(am)->atom.type == ATOM_TYPE_SYMBOL); env_fetch(am); - - assert(AM_VAL(am)->is_atom); - assert(AM_VAL(am)->atom.type == ATOM_TYPE_PRIM_PROC); - assert(AM_VAL(am)->atom.prim_proc != NULL); - AM_VAL(am)->atom.prim_proc(am); + am_call(am, VAL); } void eval(am_t *am) diff --git a/lib/include/am.h b/lib/include/am.h index 3c5867e..5709dcc 100644 --- a/lib/include/am.h +++ b/lib/include/am.h @@ -35,5 +35,6 @@ void am_append(am_t *am, am_reg_t list_reg, am_reg_t item_reg); void am_car(am_t *am, am_reg_t dest, am_reg_t src); void am_cdr(am_t *am, am_reg_t dest, am_reg_t src); void am_assign(am_t *am, am_reg_t dest, am_reg_t src); +void am_call(am_t *am, am_reg_t proc); #endif diff --git a/tests/am_tests.c b/tests/am_tests.c index 129324f..93d2c56 100644 --- a/tests/am_tests.c +++ b/tests/am_tests.c @@ -6,10 +6,18 @@ #define CADR(expr) CAR(CDR(expr)) static am_t am; +static bool test_prim_proc_called; + +static void test_prim_proc(am_t *am) +{ + (void)am; + test_prim_proc_called = true; +} void setUp(void) { am_init(&am); + test_prim_proc_called = false; } void tearDown(void) @@ -116,6 +124,20 @@ static void test_assign_expr_to_val(void) TEST_ASSERT_EQUAL(42, am.regs[EXPR]->atom.integer); } +static void test_call_prim_proc_val(void) +{ + am.regs[VAL] = expr_prim_proc(&am, test_prim_proc); + am_call(&am, VAL); + TEST_ASSERT_TRUE(test_prim_proc_called); +} + +static void test_call_prim_proc_expr(void) +{ + am.regs[EXPR] = expr_prim_proc(&am, test_prim_proc); + am_call(&am, EXPR); + TEST_ASSERT_TRUE(test_prim_proc_called); +} + int main(void) { UNITY_BEGIN(); @@ -126,5 +148,7 @@ int main(void) RUN_TEST(test_car_of_expr_pair_1_2); RUN_TEST(test_cdr_of_expr_pair_1_2); RUN_TEST(test_assign_expr_to_val); + RUN_TEST(test_call_prim_proc_val); + RUN_TEST(test_call_prim_proc_expr); return UNITY_END(); }