summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-14 02:38:30 +0200
committerkdx <kikoodx@paranoici.org>2023-06-14 02:38:30 +0200
commit959b379b90ec95ea0813cc1228cd949872713ec2 (patch)
tree5bb04ed04831ce8b1788961c05ce237a2f30e5a0
parentcd20e8bb36f6ef65bea0e062c66867cb80568152 (diff)
downloadgolem-959b379b90ec95ea0813cc1228cd949872713ec2.tar.gz
function piping
-rw-r--r--samples/move.golem7
-rw-r--r--src/main.c52
-rwxr-xr-xtesting.sh2
3 files changed, 40 insertions, 21 deletions
diff --git a/samples/move.golem b/samples/move.golem
index 407b6e1..f29a899 100644
--- a/samples/move.golem
+++ b/samples/move.golem
@@ -6,16 +6,13 @@ define FALSE = 0;
main() {
loop {
slp;
- erase();
- update();
- draw();
+ erase() |> update() |> draw();
}
}
update() {
- input_update();
- player_update();
+ input_update() |> player_update();
}
diff --git a/src/main.c b/src/main.c
index 622ced0..8aa98ec 100644
--- a/src/main.c
+++ b/src/main.c
@@ -92,6 +92,8 @@ is_punct(const char *p)
return 2;
if (strchr("-+", p[0]) != NULL && p[0] == p[1])
return 2;
+ if (p[0] == '|' && p[1] == '>')
+ return 2;
return (strchr("+-/*()<>,;{}[]=&^|", p[0]) != NULL);
}
@@ -564,6 +566,29 @@ mul(Token **rest, Token *tok)
}
static Node *
+fncall(Token **rest, Token *tok)
+{
+ Node *node = new_word(tok);
+ tok = tok->next;
+ node->type = NOD_FNCALL;
+
+ /* args */
+ Node head = {0};
+ Node *cur = &head;
+
+ tok = skip(tok, "(");
+ while (tok->type != TOK_EOF && !equal(tok, ")")) {
+ cur = cur->next = expr(&tok, tok);
+ if (equal(tok, ","))
+ tok = tok->next;
+ }
+ *rest = skip(tok, ")");
+
+ node->rhs = head.next;
+ return node;
+}
+
+static Node *
primary(Token **rest, Token *tok)
{
if (equal(tok, "(")) {
@@ -605,23 +630,13 @@ primary(Token **rest, Token *tok)
if (tok->type == TOK_WORD && equal(tok->next, "(")) {
/* function call */
- Node *node = new_word(tok);
- tok = tok->next;
- node->type = NOD_FNCALL;
-
- /* args */
- Node head = {0};
- Node *cur = &head;
-
- tok = skip(tok, "(");
- while (tok->type != TOK_EOF && !equal(tok, ")")) {
- cur = cur->next = expr(&tok, tok);
- if (equal(tok, ","))
- tok = tok->next;
+ Node *node = fncall(&tok, tok);
+ Node *cur = node;
+ while (tok->type != TOK_EOF && equal(tok, "|>")) {
+ tok = tok->next;
+ cur = cur->lhs = fncall(&tok, tok);
}
- *rest = skip(tok, ")");
-
- node->rhs = head.next;
+ *rest = tok;
return node;
}
@@ -899,6 +914,11 @@ gen_fncall(Node *node)
printf("\tJRT ,__fn_%.*s\n", node->len, node->loc);
depth += 1;
+
+ if (node->lhs != NULL) {
+ depth -= 1;
+ gen_fncall(node->lhs);
+ }
}
static void
diff --git a/testing.sh b/testing.sh
index 7d35ec0..9781638 100755
--- a/testing.sh
+++ b/testing.sh
@@ -16,6 +16,7 @@ tup -q || ./build.sh || exit 1
test "$1" "main(){5 + 2; return 4;}"
test "$1" "main(){6 + 3;}"
test "$1" "main(){'a' - 'b';}"
+test "$1" "main(){ buzz(); } buzz() { return 42; }"
test "$1" "main(){ fizz(50 + buzz() - 3) * 4; } fizz() { return 3; } buzz() { return 42; }"
test "$1" "global abc; main(){ return abc; }"
test "$1" "global abc = 5; main(){ return abc; }"
@@ -55,4 +56,5 @@ test "$1" "main() return;"
test "$1" "main() { local a; a = 5; dbg a; a++; dbg a; }"
test "$1" "main() { local a; a = 5; dbg a; a--; dbg a; }"
test "$1" "main() { wrt [\"(\"]; wrt '\n'; }"
+test "$1" "main() { wrt inc('0') |> dec() |> inc() |> inc(); wrt '\n'; } inc(a) return a + 1; dec(a) return a - 1;"
rm -f build/tmp.*