aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2021-01-04 01:25:44 +0300
committerAleksey Veresov <aleksey@veresov.pro>2021-01-04 01:25:44 +0300
commit0b4de175110bdf6ffaeb0ba3b86053fd2fec78be (patch)
treeac9b054f1ea89c5bc0772afa06b7092f81e1fbbe
parent76ad99e0aa3fc5dd079dcf1b2f232c2a5f390372 (diff)
downloadcsx-0b4de175110bdf6ffaeb0ba3b86053fd2fec78be.tar
csx-0b4de175110bdf6ffaeb0ba3b86053fd2fec78be.tar.xz
csx-0b4de175110bdf6ffaeb0ba3b86053fd2fec78be.zip
.
-rw-r--r--examples/generated.c2
-rw-r--r--examples/generated.csx18
-rw-r--r--src/csx.c29
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 <csx.h>
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 <stdlib.h>
#include <stdarg.h>
#include <string.h>
+#include <stdio.h>
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));
}