summaryrefslogtreecommitdiff
path: root/plugins/lisp.c
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-11 17:16:40 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-11 17:17:04 +0000
commitd2461482caf9e93d6e2bc7ff17567102f635211a (patch)
treec302d1a2e7cb829b6ed006c905db0b8bbf45f57a /plugins/lisp.c
parentf9b1992795142a073cd5dc1794350fc64e9aa695 (diff)
Fixed some things. Next thing will be tests.
Diffstat (limited to 'plugins/lisp.c')
-rw-r--r--plugins/lisp.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/plugins/lisp.c b/plugins/lisp.c
index 7147928..439dd16 100644
--- a/plugins/lisp.c
+++ b/plugins/lisp.c
@@ -1,9 +1,9 @@
#include "zprep_plugin.h"
+#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <ctype.h>
static void skip_whitespace(const char **p)
{
@@ -421,36 +421,42 @@ void lisp_transpile(const char *input_body, const ZApi *api)
FILE *h = api->hoist_out;
fprintf(h, "/* Lisp Runtime */\n");
fprintf(h, "typedef enum { L_NUM, L_PAIR, L_NIL } LType;\n");
- fprintf(h, "typedef struct LVal { LType type; union { long num; struct { struct LVal *car; "
+ fprintf(h, "typedef struct LVal { LType type; union { long num; struct { "
+ "struct LVal *car; "
"struct LVal *cdr; } pair; }; } *LVal;\n");
fprintf(h, "static struct LVal _nil = { L_NIL }; static LVal LNIL = &_nil;\n");
fprintf(h, "static LVal nil = &_nil;\n"); // Use static for file scope
fprintf(h, "static LVal l_num(long n) { LVal v = malloc(sizeof(struct LVal)); "
"v->type=L_NUM; v->num=n; return v; }\n");
fprintf(h, "static LVal l_nil() { return LNIL; }\n");
- fprintf(h, "static LVal l_cons(LVal a, LVal b) { LVal v = malloc(sizeof(struct LVal)); "
+ fprintf(h, "static LVal l_cons(LVal a, LVal b) { LVal v = "
+ "malloc(sizeof(struct LVal)); "
"v->type=L_PAIR; v->pair.car=a; v->pair.cdr=b; return v; }\n");
- fprintf(
- h,
- "static LVal l_car(LVal v) { return (v && v->type==L_PAIR) ? v->pair.car : LNIL; }\n");
- fprintf(
- h,
- "static LVal l_cdr(LVal v) { return (v && v->type==L_PAIR) ? v->pair.cdr : LNIL; }\n");
+ fprintf(h, "static LVal l_car(LVal v) { return (v && v->type==L_PAIR) ? "
+ "v->pair.car : LNIL; }\n");
+ fprintf(h, "static LVal l_cdr(LVal v) { return (v && v->type==L_PAIR) ? "
+ "v->pair.cdr : LNIL; }\n");
fprintf(h, "static int l_truthy(LVal v) { return (v && v->type!=L_NIL); }\n");
- fprintf(h, "static LVal l_add(LVal a, LVal b) { long x=(a&&a->type==L_NUM)?a->num:0; long "
+ fprintf(h, "static LVal l_add(LVal a, LVal b) { long "
+ "x=(a&&a->type==L_NUM)?a->num:0; long "
"y=(b&&b->type==L_NUM)?b->num:0; return l_num(x+y); }\n");
- fprintf(h, "static LVal l_sub(LVal a, LVal b) { long x=(a&&a->type==L_NUM)?a->num:0; long "
+ fprintf(h, "static LVal l_sub(LVal a, LVal b) { long "
+ "x=(a&&a->type==L_NUM)?a->num:0; long "
"y=(b&&b->type==L_NUM)?b->num:0; return l_num(x-y); }\n");
- fprintf(h, "static LVal l_mul(LVal a, LVal b) { long x=(a&&a->type==L_NUM)?a->num:0; long "
+ fprintf(h, "static LVal l_mul(LVal a, LVal b) { long "
+ "x=(a&&a->type==L_NUM)?a->num:0; long "
"y=(b&&b->type==L_NUM)?b->num:0; return l_num(x*y); }\n");
- fprintf(h, "static LVal l_div(LVal a, LVal b) { long x=(a&&a->type==L_NUM)?a->num:0; long "
+ fprintf(h, "static LVal l_div(LVal a, LVal b) { long "
+ "x=(a&&a->type==L_NUM)?a->num:0; long "
"y=(b&&b->type==L_NUM)?b->num:0; return l_num(y?x/y:0); }\n");
- fprintf(h, "static LVal l_lt(LVal a, LVal b) { long x=(a&&a->type==L_NUM)?a->num:0; long "
+ fprintf(h, "static LVal l_lt(LVal a, LVal b) { long "
+ "x=(a&&a->type==L_NUM)?a->num:0; long "
"y=(b&&b->type==L_NUM)?b->num:0; return (x<y)?l_num(1):LNIL; }\n");
fprintf(h, "static void l_print(LVal v) { \n");
fprintf(h, " if(!v || v->type==L_NIL) printf(\"nil\");\n");
fprintf(h, " else if(v->type==L_NUM) printf(\"%%ld\", v->num);\n");
- fprintf(h, " else if(v->type==L_PAIR) { printf(\"(\"); l_print(v->pair.car); printf(\" . "
+ fprintf(h, " else if(v->type==L_PAIR) { printf(\"(\"); "
+ "l_print(v->pair.car); printf(\" . "
"\"); l_print(v->pair.cdr); printf(\")\"); }\n");
fprintf(h, "}\n");