Mercurial > lbo > hg > ylisp
changeset 151:fe5d01fa28ee
value, expr: Test "==" methods and enable freeing all symbols
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Tue, 03 Sep 2019 12:57:53 +0200 |
parents | a4a714456110 |
children | 88fec15abdbc |
files | gen/y.lex src/built-ins_test.c src/expr_test.c src/value.c |
diffstat | 4 files changed, 53 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/gen/y.lex Tue Sep 03 12:17:34 2019 +0200 +++ b/gen/y.lex Tue Sep 03 12:57:53 2019 +0200 @@ -23,7 +23,7 @@ NUMBER -?[1-9][0-9]*|0 ATOM [a-z+*/=<>-][a-z0-9=-]* QUOTE ' -STRING_LIT \"[[:alnum:][:blank:][:punct:]]*\" +STRING_LIT \"[^"]*\" %%
--- a/src/built-ins_test.c Tue Sep 03 12:17:34 2019 +0200 +++ b/src/built-ins_test.c Tue Sep 03 12:57:53 2019 +0200 @@ -216,8 +216,8 @@ fprintf(stderr, "test_builtin_let_recall ============\n"); ystr_t input = ystr_new( - "(let my-var ('a 'b) \"cd\")" - "(my-var)"); + "(let my-var ('a 'b) \"cd\")" + "(my-var)"); ystr_t error = ystr_new(NULL); yexpr_t program = yexpr_new(); assert(yparse_str(&input, &program, &error)); @@ -225,7 +225,7 @@ ypreprocess_resolve_builtins(&program); - yeval_state_t state = { .call_stack = YVEC_NEW(NULL, 0, yexpr_t) }; + yeval_state_t state = {.call_stack = YVEC_NEW(NULL, 0, yexpr_t)}; // Evaluate whole program yexpr_t result = yeval_list_return_last(&state, &program.value.list, 0); @@ -243,6 +243,43 @@ yexpr_destroy(&program); } +void test_builtin_eq(void) { + fprintf(stderr, "test_builtin_eq ============\n"); + + ystr_t input = ystr_new( + "(let var-a 1)" + "(let var-b 'atom)" + "(let var-c \"string\")" + "((== var-a 1) (== 1 var-a) (== var-a var-a) (== for for) (== (1 2 3) " + "(var-a 2 3)) (== var-b 'atom) (== " + "'atom2 'atom2) (== " + "var-c \"string\"))"); + ystr_t error = ystr_new(NULL); + yexpr_t program = yexpr_new(); + assert(yparse_str(&input, &program, &error)); + + yexpr_debug(&program); + ypreprocess(&program); + yexpr_debug(&program); + + yeval_state_t state; + YVEC_INIT(&state.call_stack, 4, yexpr_t); + yexpr_t result = yeval_list_return_last(&state, &program.value.list, 0); + assert(result.typ == YEXPR_LIST); + yexpr_debug(&result); + for (size_t i = 0; i < result.value.list.len; i++) { + yexpr_t* elem = YVEC_AT(&result.value.list, i, yexpr_t); + assert(YEXPR_ATOM == elem->typ && + yatom_get_or_add("true") == elem->value.atom); + } + + yexpr_destroy(&result); + yexpr_destroy(&program); + ystr_destroy(&input); + ystr_destroy(&error); + yvec_destroy(&state.call_stack); +} + int main(void) { test_builtin_translate(); test_builtin_for(); @@ -251,6 +288,7 @@ test_builtin_let(); test_builtin_let_parsed(); test_builtin_let_recall(); + test_builtin_eq(); yvalue_free_all(); yatom_free_all(); return 0;
--- a/src/expr_test.c Tue Sep 03 12:17:34 2019 +0200 +++ b/src/expr_test.c Tue Sep 03 12:57:53 2019 +0200 @@ -26,7 +26,7 @@ ref = yref_new(); assert(YREF_ID == yref_type(&ref)); - assert(ref.ref.id == ref0.ref.id+1); + assert(ref.ref.id == ref0.ref.id + 1); } void test_expr_copy(void) { @@ -35,7 +35,8 @@ yexpr_set_ref(&expr, ref); yexpr_t copy = yexpr_copy(&expr); - assert(ystr_at(&expr.value.ref.ref.sym, 0) != ystr_at(©.value.ref.ref.sym, 0)); + assert(ystr_at(&expr.value.ref.ref.sym, 0) != + ystr_at(©.value.ref.ref.sym, 0)); yexpr_destroy(&expr); yexpr_destroy(©);
--- a/src/value.c Tue Sep 03 12:17:34 2019 +0200 +++ b/src/value.c Tue Sep 03 12:57:53 2019 +0200 @@ -31,7 +31,8 @@ static bool yvalue_table_initialized = false; static struct hsearch_data yvalue_name_table; -static yvec_t yvalue_table; +static yvec_t yvalue_table; // vector of yvalue_t +static yvec_t yvalue_names; // vector of char* // TODO: Enable garbage collection/reuse instead of monotonic counter. (e.g. // reference-counting in different table) static yvalue_id_t yvalue_counter = YVALUE_COUNTER_OFFSET; @@ -45,6 +46,7 @@ yvalue_table_initialized = true; hcreate_r(YVALUE_MAX_VALUES, &yvalue_name_table); YVEC_INIT(&yvalue_table, YVALUE_INITIAL_VALUES, yvalue_t); + YVEC_INIT(&yvalue_names, YVALUE_INITIAL_VALUES, char*); } bool yvalue_is_valid(yvalue_id_t id) { @@ -210,6 +212,7 @@ ENTRY new = {.key = strdup(ystr_str(sym)), .data = (void*)new_id}; ENTRY* result; hsearch_r(new, ENTER, &result, &yvalue_name_table); + YVEC_PUSH(&yvalue_names, &new.key); return new_id; } @@ -287,6 +290,10 @@ if (val->typ == YVALUE_FUNC) yfunc_destroy(&val->value.func); freed += 1; } + for (size_t i = 0; i < yvalue_names.len; i++) { + free(*YVEC_AT(&yvalue_names, i, char*)); + } + yvec_destroy(&yvalue_names); hdestroy_r(&yvalue_name_table); yvec_destroy(&yvalue_table); }