From 672512b0a2b3b4ae88f204293f4379c1fbb79850 Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Wed, 6 Jan 2021 01:37:05 +0300 Subject: Added interpreter. --- src/csx.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/csx.c') diff --git a/src/csx.c b/src/csx.c index 0f07713..f114114 100644 --- a/src/csx.c +++ b/src/csx.c @@ -190,6 +190,7 @@ static void *base_is_set(void *arg) static void *base_sethead(void *arg) { + arg = run_each(arg); pair_data *p = head(arg); p->head = head(tail(arg)); return null; @@ -197,6 +198,7 @@ static void *base_sethead(void *arg) static void *base_settail(void *arg) { + arg = run_each(arg); pair_data *p = head(arg); p->tail = head(tail(arg)); return null; @@ -421,6 +423,18 @@ static void *base_len(void *arg) return csx_int(len); } +static void *base_run(void *arg) +{ + arg = run_each(arg); + if (type(tail(arg)) == type_null) return csx_run(head(arg)); + void *saved = context; + context = head(tail(arg)); + void *res = csx_run(head(arg)); + void *rescontext = context; + context = saved; + return new_pair(res, rescontext); +} + static void *zip(void *params, void *values) { @@ -485,6 +499,21 @@ tailcall: } +static void *base_context(void *args) +{ + return context; +} + +static void new_context(); +static void *base_newcontext(void *args) +{ + void *saved = context; + new_context(); + void *res = context; + context = saved; + return res; +} + static void new_context() { context = new_pair(null, null); @@ -515,7 +544,9 @@ static void new_context() base_set(csx_list(csx_name("name"), csx_base(base_name), 0)); base_set(csx_list(csx_name("str"), csx_base(base_str), 0)); base_set(csx_list(csx_name("len"), csx_base(base_len), 0)); - base_set(csx_list(csx_name("run"), csx_base(csx_run), 0)); + base_set(csx_list(csx_name("run"), csx_base(base_run), 0)); + base_set(csx_list(csx_name("context"), csx_base(base_context), 0)); + base_set(csx_list(csx_name("newcontext"), csx_base(base_newcontext), 0)); } static void init() -- cgit v1.2.3