summaryrefslogtreecommitdiff
path: root/src/library.c
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-09-27 04:21:06 -0400
committerLLLL Colonq <llll@colonq>2025-09-27 04:21:06 -0400
commitab57bc2a6d6ea9c24aa119df6efbd8a38b54c312 (patch)
treebfc7fe32f40804e7808016038a3f2f15ef9e643e /src/library.c
parent811f11463851a0f35835ac72ef09b65b1072de20 (diff)
Source location tracking
Diffstat (limited to 'src/library.c')
-rw-r--r--src/library.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/library.c b/src/library.c
index 3ca716f..be38292 100644
--- a/src/library.c
+++ b/src/library.c
@@ -1,5 +1,7 @@
#include <stdio.h>
+#include "lexer.h"
+#include "parser.h"
#include "runtime.h"
static pit_value impl_sf_quote(pit_runtime *rt, pit_value args) {
@@ -96,6 +98,16 @@ static pit_value impl_m_and(pit_runtime *rt, pit_value args) {
return ret;
}
+static pit_value impl_m_setq(pit_runtime *rt, pit_value args) {
+ pit_value sym = pit_car(rt, args);
+ pit_value v = pit_car(rt, pit_cdr(rt, args));
+ return pit_list(rt, 3,
+ pit_intern_cstr(rt, "set"),
+ pit_list(rt, 2, pit_intern_cstr(rt, "quote"), sym),
+ v
+ );
+}
+
static pit_value impl_set(pit_runtime *rt, pit_value args) {
pit_value sym = pit_car(rt, args);
pit_value v = pit_car(rt, pit_cdr(rt, args));
@@ -116,15 +128,54 @@ static pit_value impl_symbol_is_macro(pit_runtime *rt, pit_value args) {
return PIT_NIL;
}
+static pit_value impl_funcall(pit_runtime *rt, pit_value args) {
+ pit_value fsym = pit_car(rt, args);
+ pit_value f = pit_fget(rt, fsym);
+ pit_value as = pit_cdr(rt, args);
+ return pit_apply(rt, f, as);
+}
+
static pit_value impl_eval(pit_runtime *rt, pit_value args) {
pit_value x = pit_car(rt, args);
return pit_eval(rt, x);
}
+static pit_value impl_load(pit_runtime *rt, pit_value args) {
+ pit_value path = pit_car(rt, args);
+ char pathbuf[1024] = {0};
+ i64 len = pit_as_bytes(rt, path, (u8 *) pathbuf, sizeof(pathbuf) - 1);
+ if (len < 0) { pit_error(rt, "path was not a string"); return PIT_NIL; }
+ pathbuf[len] = 0;
+ pit_value bs = pit_bytes_new_file(rt, pathbuf);
+ pit_lexer lex;
+ if (!pit_lexer_from_bytes(rt, &lex, bs)) {
+ pit_error(rt, "failed to initialize lexer");
+ return PIT_NIL;
+ }
+ pit_parser parse;
+ pit_parser_from_lexer(&parse, &lex);
+ pit_value ret = PIT_NIL;
+ bool eof = false;
+ pit_value p = PIT_NIL;
+ while (p = pit_parse(rt, &parse, &eof), !eof) {
+ ret = pit_eval(rt, p);
+ }
+ return ret;
+}
+
static pit_value impl_print(pit_runtime *rt, pit_value args) {
pit_value x = pit_car(rt, args);
char buf[1024] = {0};
- pit_dump(rt, buf, sizeof(buf), x);
+ pit_dump(rt, buf, sizeof(buf), x, true);
+ buf[1023] = 0;
+ puts(buf);
+ return x;
+}
+
+static pit_value impl_princ(pit_runtime *rt, pit_value args) {
+ pit_value x = pit_car(rt, args);
+ char buf[1024] = {0};
+ pit_dump(rt, buf, sizeof(buf), x, false);
buf[1023] = 0;
puts(buf);
return x;
@@ -152,12 +203,16 @@ void pit_install_library_essential(pit_runtime *rt) {
pit_mset(rt, pit_intern_cstr(rt, "defmacro"), pit_nativefunc_new(rt, impl_m_defmacro));
pit_mset(rt, pit_intern_cstr(rt, "let"), pit_nativefunc_new(rt, impl_m_let));
pit_mset(rt, pit_intern_cstr(rt, "and"), pit_nativefunc_new(rt, impl_m_and));
+ pit_mset(rt, pit_intern_cstr(rt, "setq"), pit_nativefunc_new(rt, impl_m_setq));
pit_fset(rt, pit_intern_cstr(rt, "set"), pit_nativefunc_new(rt, impl_set));
pit_fset(rt, pit_intern_cstr(rt, "fset"), pit_nativefunc_new(rt, impl_fset));
pit_fset(rt, pit_intern_cstr(rt, "symbol-is-macro"), pit_nativefunc_new(rt, impl_symbol_is_macro));
+ pit_fset(rt, pit_intern_cstr(rt, "funcall"), pit_nativefunc_new(rt, impl_funcall));
pit_fset(rt, pit_intern_cstr(rt, "eval"), pit_nativefunc_new(rt, impl_eval));
+ pit_fset(rt, pit_intern_cstr(rt, "load"), pit_nativefunc_new(rt, impl_load));
pit_fset(rt, pit_intern_cstr(rt, "print"), pit_nativefunc_new(rt, impl_print));
+ pit_fset(rt, pit_intern_cstr(rt, "princ"), pit_nativefunc_new(rt, impl_princ));
pit_fset(rt, pit_intern_cstr(rt, "+"), pit_nativefunc_new(rt, impl_add));
pit_fset(rt, pit_intern_cstr(rt, "-"), pit_nativefunc_new(rt, impl_sub));
}