From 0b4de175110bdf6ffaeb0ba3b86053fd2fec78be Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Mon, 4 Jan 2021 01:25:44 +0300 Subject: . --- examples/generated.c | 2 +- examples/generated.csx | 18 ++++++++++++++---- src/csx.c | 29 +++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/examples/generated.c b/examples/generated.c index db94cc6..a428c03 100644 --- a/examples/generated.c +++ b/examples/generated.c @@ -1,6 +1,6 @@ #include int main() { -csx_run(csx_list(csx_name("do"),csx_list(csx_name("set"),csx_name("map"),csx_list(csx_name("fn"),csx_list(csx_name("f"),csx_name("l"),0),csx_list(csx_name("if"),csx_list(csx_name("same"),csx_name("l"),csx_list(0),0),csx_list(0),csx_list(csx_name("pair"),csx_list(csx_name("f"),csx_list(csx_name("head"),csx_name("l"),0),0),csx_list(csx_name("map"),csx_name("f"),csx_list(csx_name("tail"),csx_name("l"),0),0),0),0),0),0),csx_list(csx_name("map"),csx_list(csx_name("fn"),csx_list(csx_name("n"),0),csx_list(csx_name("sum"),csx_name("n"),csx_int(10),0),0),csx_list(csx_name("quote"),csx_list(csx_int(1),csx_int(2),csx_int(3),csx_int(4),csx_int(5),0),0),0),0)); +csx_run(csx_list(csx_name("do"),csx_list(csx_name("set"),csx_name("no"),csx_list(csx_name("fn"),csx_list(csx_name("x"),0),csx_list(csx_name("same"),csx_name("x"),csx_list(0),0),0),0),csx_list(csx_name("set"),csx_name("outint"),csx_list(csx_name("fn"),csx_list(csx_name("n"),0),csx_list(csx_name("if"),csx_list(csx_name("<"),csx_name("n"),csx_int(0),0),csx_list(csx_name("do"),csx_list(csx_name("out"),csx_int(45),0),csx_list(csx_name("outint"),csx_list(csx_name("neg"),csx_name("n"),0),0),0),csx_list(csx_name("if"),csx_list(csx_name("<"),csx_name("n"),csx_int(10),0),csx_list(csx_name("out"),csx_list(csx_name("+"),csx_int(48),csx_name("n"),0),0),csx_list(csx_name("do"),csx_list(csx_name("outint"),csx_list(csx_name("div"),csx_name("n"),csx_int(10),0),0),csx_list(csx_name("out"),csx_list(csx_name("+"),csx_int(48),csx_list(csx_name("mod"),csx_name("n"),csx_int(10),0),0),0),0),0),0),0),0),csx_list(csx_name("set"),csx_name("map"),csx_list(csx_name("fn"),csx_list(csx_name("f"),csx_name("l"),0),csx_list(csx_name("if"),csx_list(csx_name("no"),csx_name("l"),0),csx_list(0),csx_list(csx_name("pair"),csx_list(csx_name("f"),csx_list(csx_name("head"),csx_name("l"),0),0),csx_list(csx_name("map"),csx_name("f"),csx_list(csx_name("tail"),csx_name("l"),0),0),0),0),0),0),csx_list(csx_name("map"),csx_list(csx_name("fn"),csx_list(csx_name("n"),0),csx_list(csx_name("outint"),csx_name("n"),0),csx_list(csx_name("out"),csx_int(10),0),0),csx_list(csx_name("quote"),csx_list(csx_int(99),csx_int(37),csx_int(73),csx_int(42),0),0),0),0)); return 0; } diff --git a/examples/generated.csx b/examples/generated.csx index bddb2ed..cb2557c 100644 --- a/examples/generated.csx +++ b/examples/generated.csx @@ -1,7 +1,17 @@ -[set map [fn [f l] [if [same l []] [] +[set no [fn [x] [same x []]]] +[set outint [fn [n] [if [< n 0] + [do [out 45] [outint [neg n]]] + [if [< n 10] + [out [+ 48 n]] + [do + [outint [div n 10]] + [out [+ 48 [mod n 10]]] + ] + ] +]]] +[set map [fn [f l] [if [no l] [] [pair [f [head l]] [map f [tail l]]] ]]] - -[map [fn [n] [sum n 10]] - [quote [1 2 3 4 5]] +[map [fn [n] [outint n] [out 10]] + [quote [99 37 73 42]] ] diff --git a/src/csx.c b/src/csx.c index 57b4778..eca55e7 100644 --- a/src/csx.c +++ b/src/csx.c @@ -3,6 +3,7 @@ #include #include #include +#include static void init(); @@ -146,7 +147,7 @@ static void *base_set(void *arg) { pair_data *res; void *name = head(arg); - void *value = head(tail(arg)); + void *value = csx_run(head(tail(arg))); if (type(context) == type_null) { void *nameval = new_pair(name, value); context = new_pair(new_pair(nameval, null), null); @@ -202,7 +203,7 @@ static void *base_tail(void *arg) static void *base_quote(void *arg) { - return arg; + return head(arg); } static void *base_same(void *arg) @@ -293,6 +294,12 @@ static void *base_inv(void *arg) return csx_int(0); } +static void *base_div(void *arg) +{ + arg = run_each(arg); + return csx_int(*(int *)head(arg) / *(int *)head(tail(arg))); +} + static void *base_mod(void *arg) { arg = run_each(arg); @@ -330,6 +337,21 @@ static void *base_dec(void *arg) } +static void *base_out(void *arg) +{ + arg = run_each(arg); + int res = putchar(*(int *)head(arg)); + return res != EOF ? one : null; +} + +static void *base_in(void *arg) +{ + arg = run_each(arg); + int res = getchar(); + return res != EOF ? csx_int(res) : null; +} + + static void *zip(void *params, void *values) { void *res = null; @@ -398,9 +420,12 @@ static void new_context() base_set(csx_list(csx_name("*"), csx_base(base_prod), 0)); base_set(csx_list(csx_name("neg"), csx_base(base_neg), 0)); base_set(csx_list(csx_name("inv"), csx_base(base_inv), 0)); + base_set(csx_list(csx_name("div"), csx_base(base_div), 0)); base_set(csx_list(csx_name("mod"), csx_base(base_mod), 0)); base_set(csx_list(csx_name("<"), csx_base(base_inc), 0)); base_set(csx_list(csx_name(">"), csx_base(base_dec), 0)); + base_set(csx_list(csx_name("out"), csx_base(base_out), 0)); + base_set(csx_list(csx_name("in"), csx_base(base_in), 0)); base_set(csx_list(csx_name("run"), csx_base(csx_run), 0)); } -- cgit v1.2.3