From abfe132b83219efa30220ecfdaf6e26e31b9d13d Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Sun, 3 Jan 2021 01:19:12 +0300 Subject: Input-output added. --- examples/generated.c | 6 ++++++ examples/translator.c | 2 +- src/csx.c | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 examples/generated.c diff --git a/examples/generated.c b/examples/generated.c new file mode 100644 index 0000000..0b70fd6 --- /dev/null +++ b/examples/generated.c @@ -0,0 +1,6 @@ +#include +int main() +{ +csx_eval(csx_list(csx_name("do"),csx_list(csx_name("define"),csx_name("a"),csx_num(10),0),csx_list(csx_name("define"),csx_name("b"),csx_list(csx_name("sum"),csx_name("a"),csx_num(3),0),0),csx_list(csx_name("outname"),csx_list(csx_name("quote"),csx_name("sum-of-10-and-3-is"),0),0),csx_list(csx_name("outnum"),csx_name("b"),0),0)); +return 0; +} diff --git a/examples/translator.c b/examples/translator.c index 448d052..ad676c0 100644 --- a/examples/translator.c +++ b/examples/translator.c @@ -14,7 +14,7 @@ void readlist() readlist(); printf("0)"); c = getchar(); - } else if (isdigit(c)) { + } else if (isdigit(c) || c == '-') { if (first) first = 0; else putchar(','); printf("csx_num("); diff --git a/src/csx.c b/src/csx.c index 7225792..1a643f2 100644 --- a/src/csx.c +++ b/src/csx.c @@ -3,6 +3,7 @@ #include #include #include +#include typedef enum csx_type { @@ -380,7 +381,33 @@ static void *base_context(void *arg) static void *base_quote(void *arg) { - return arg; + return head(arg); +} + +static void *base_input(void *arg) +{ + int res = getchar(); + return res != EOF ? new_num(res) : null; +} + +static void *base_output(void *arg) +{ + arg = eval_each(arg); + return putchar(*(int *)head(arg)) != EOF ? one : null; +} + +static void *base_outname(void *arg) +{ + arg = eval_each(arg); + return fputs(head(arg), stdout) != EOF ? one : null; +} + +static void *base_outnum(void *arg) +{ + arg = eval_each(arg); + int num = *(int *)head(arg); + printf("%d", num); + return one; } static void *base_fn(void *arg) @@ -500,6 +527,10 @@ static void new_context() base_define(csx_list(new_name("if"), new_base(base_if), 0)); base_define(csx_list(new_name("and"), new_base(base_and), 0)); base_define(csx_list(new_name("or"), new_base(base_or), 0)); + base_define(csx_list(new_name("input"), new_base(base_input), 0)); + base_define(csx_list(new_name("output"), new_base(base_output), 0)); + base_define(csx_list(new_name("outname"), new_base(base_outname), 0)); + base_define(csx_list(new_name("outnum"), new_base(base_outnum), 0)); } -- cgit v1.2.3