aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-26 19:18:56 +0800
committerMistivia <i@mistivia.com>2025-06-26 19:33:00 +0800
commit0ba662762023b7e3788690d9990ab39e89fd6f34 (patch)
treeade9d378c7a8e7c04ed7242626c07f889686e2a5 /src
parente05a649c3b5b97f04756d8d08f8b8d6b5d8e672c (diff)
add webassembly build; readline dep is optional
Diffstat (limited to 'src')
-rw-r--r--src/builtins.c8
-rw-r--r--src/interp.c14
-rw-r--r--src/main.c10
-rw-r--r--src/parser.c8
4 files changed, 36 insertions, 4 deletions
diff --git a/src/builtins.c b/src/builtins.c
index 950c2c7..9dcf497 100644
--- a/src/builtins.c
+++ b/src/builtins.c
@@ -8,12 +8,12 @@
#include <math.h>
SExpRef builtin_charp(Interp *interp, SExpRef args) {
- if (LENGTH(args) != 1) return new_error(interp, "char?: arg num error.");
+ if (LENGTH(args) != 1) return new_error(interp, "char?: arg num error.\n");
return new_boolean(interp, VALTYPE(CAR(args)) == kCharSExp);
}
SExpRef builtin_char_eq(Interp *interp, SExpRef args) {
- if (LENGTH(args) != 2) return new_error(interp, "char=: arg num error.");
+ if (LENGTH(args) != 2) return new_error(interp, "char=: arg num error.\n");
if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
return new_error(interp, "char=: type error.\n");
}
@@ -23,7 +23,7 @@ SExpRef builtin_char_eq(Interp *interp, SExpRef args) {
}
SExpRef builtin_char_gt(Interp *interp, SExpRef args) {
- if (LENGTH(args) != 2) return new_error(interp, "char>: arg num error.");
+ if (LENGTH(args) != 2) return new_error(interp, "char>: arg num error.\n");
if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
return new_error(interp, "char>: type error.\n");
}
@@ -33,7 +33,7 @@ SExpRef builtin_char_gt(Interp *interp, SExpRef args) {
}
SExpRef builtin_char_lt(Interp *interp, SExpRef args) {
- if (LENGTH(args) != 2) return new_error(interp, "char<: arg num error.");
+ if (LENGTH(args) != 2) return new_error(interp, "char<: arg num error.\n");
if (VALTYPE(CAR(args)) != kCharSExp || VALTYPE(CADR(args)) != kCharSExp) {
return new_error(interp, "char<: type error.\n");
}
diff --git a/src/interp.c b/src/interp.c
index 9749b6d..5a4c9b6 100644
--- a/src/interp.c
+++ b/src/interp.c
@@ -41,6 +41,19 @@ HASH_TABLE_IMPL(SExpRef, SExpRef);
#define UNBOUND ((SExpRef){-1})
+// for wasm
+Interp *new_interp() {
+ Interp *ret = malloc(sizeof(Interp));
+ Interp_init(ret);
+ return ret;
+}
+
+// for wasm
+void print_lisp_error(Interp *interp, SExpRef err) {
+ if (VALTYPE(err) != kErrSignal) return;
+ fprintf(stderr, "Error: %s", REF(err)->str);
+}
+
void Interp_init(Interp *self) {
self->recursion_depth = 0;
self->gensym_cnt = 42;
@@ -213,6 +226,7 @@ void Interp_init(Interp *self) {
}
}
+
SExpRef Interp_eval_string(Interp *interp, const char * str) {
Parser_set_string(interp->parser, str);
SExpRef sexp, ret;
diff --git a/src/main.c b/src/main.c
index 86a5d36..4ebcd03 100644
--- a/src/main.c
+++ b/src/main.c
@@ -24,16 +24,26 @@ int main(int argc, char **argv) {
mainret = -1; goto end;
}
}
+#ifdef WITHREADLINE
Parser_set_readline(interp.parser);
+#else
+ Parser_set_file(interp.parser, stdin);
+#endif
SExpRef sexp, res;
ParseResult parse_result;
while (1) {
+#ifndef WITHREADLINE
+ printf(">>> ");
+ fflush(stdout);
+#endif
parse_result = parse_sexp(interp.parser);
if (parse_result.errmsg != NULL) {
if (Parser_peek(interp.parser) == EOF) goto end;
fprintf(stderr, "Parsing error: %s", parse_result.errmsg);
+#ifdef WITHREADLINE
free((void*)interp.parser->string);
Parser_set_readline(interp.parser);
+#endif
continue;
}
diff --git a/src/parser.c b/src/parser.c
index 6982198..d8fda82 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -4,8 +4,10 @@
#include <stdlib.h>
#include <stdarg.h>
+#ifdef WITHREADLINE
#include <readline/readline.h>
#include <readline/history.h>
+#endif
#include "sexp.h"
@@ -83,6 +85,7 @@ void Parser_set_file(Parser *parser, FILE *fp) {
parser->fp = fp;
}
+#ifdef WITHREADLINE
void Parser_set_readline(Parser *parser) {
stifle_history(100);
parser->parse_type = kParseReadline;
@@ -90,6 +93,7 @@ void Parser_set_readline(Parser *parser) {
parser->str_cursor = NULL;
parser->readline_eof = false;
}
+#endif
int Parser_getchar(Parser *ctx) {
@@ -100,6 +104,7 @@ int Parser_getchar(Parser *ctx) {
return ret;
} else if (ctx->parse_type == kParseFile) {
return fgetc(ctx->fp);
+#ifdef WITHREADLINE
} else if (ctx->parse_type == kParseReadline) {
if (ctx->readline_eof) return EOF;
if (ctx->string == NULL) {
@@ -127,6 +132,7 @@ int Parser_getchar(Parser *ctx) {
int c = *ctx->str_cursor;
ctx->str_cursor++;
return c;
+#endif
}
return EOF;
}
@@ -141,6 +147,7 @@ int Parser_peek(Parser *ctx) {
if (ret == EOF) return EOF;
ungetc(ret, ctx->fp);
return ret;
+#ifdef WITHREADLINE
} else if (ctx->parse_type == kParseReadline) {
if (ctx->readline_eof) return EOF;
if (ctx->string == NULL) {
@@ -158,6 +165,7 @@ int Parser_peek(Parser *ctx) {
}
int c = *ctx->str_cursor;
return c;
+#endif
}
return EOF;
}