summaryrefslogtreecommitdiff
path: root/src/library.c
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-09-25 20:05:19 -0400
committerLLLL Colonq <llll@colonq>2025-09-25 20:05:19 -0400
commit811f11463851a0f35835ac72ef09b65b1072de20 (patch)
tree225cee11b86af7662e6319c9864788b92be3dfb1 /src/library.c
parent8e79c8ac42d3fa248174120266ae0988361df212 (diff)
Add runtime freezing, add defun and defmacro
Diffstat (limited to 'src/library.c')
-rw-r--r--src/library.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/library.c b/src/library.c
index fed601e..3ca716f 100644
--- a/src/library.c
+++ b/src/library.c
@@ -1,3 +1,5 @@
+#include <stdio.h>
+
#include "runtime.h"
static pit_value impl_sf_quote(pit_runtime *rt, pit_value args) {
@@ -42,6 +44,26 @@ static pit_value impl_sf_lambda(pit_runtime *rt, pit_value args) {
return PIT_NIL;
}
+static pit_value impl_m_defun(pit_runtime *rt, pit_value args) {
+ pit_value nm = pit_car(rt, args);
+ pit_value as = pit_car(rt, pit_cdr(rt, args));
+ pit_value body = pit_cdr(rt, pit_cdr(rt, args));
+ return pit_list(rt, 3,
+ pit_intern_cstr(rt, "fset"),
+ pit_list(rt, 2, pit_intern_cstr(rt, "quote"), nm),
+ pit_cons(rt, pit_intern_cstr(rt, "lambda"), pit_cons(rt, as, body))
+ );
+}
+
+static pit_value impl_m_defmacro(pit_runtime *rt, pit_value args) {
+ pit_value nm = pit_car(rt, args);
+ return pit_list(rt, 3,
+ pit_intern_cstr(rt, "progn"),
+ pit_cons(rt, pit_intern_cstr(rt, "defun"), args),
+ pit_list(rt, 2, pit_intern_cstr(rt, "set-symbol-macro"), nm)
+ );
+}
+
static pit_value impl_m_let(pit_runtime *rt, pit_value args) {
pit_value lparams = PIT_NIL;
pit_value largs = PIT_NIL;
@@ -88,9 +110,23 @@ static pit_value impl_fset(pit_runtime *rt, pit_value args) {
return v;
}
+static pit_value impl_symbol_is_macro(pit_runtime *rt, pit_value args) {
+ pit_value sym = pit_car(rt, args);
+ pit_symbol_is_macro(rt, sym);
+ return PIT_NIL;
+}
+
+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_print(pit_runtime *rt, pit_value args) {
pit_value x = pit_car(rt, args);
- pit_trace(rt, x);
+ char buf[1024] = {0};
+ pit_dump(rt, buf, sizeof(buf), x);
+ buf[1023] = 0;
+ puts(buf);
return x;
}
@@ -112,12 +148,16 @@ void pit_install_library_essential(pit_runtime *rt) {
pit_sfset(rt, pit_intern_cstr(rt, "progn"), pit_nativefunc_new(rt, impl_sf_progn));
pit_sfset(rt, pit_intern_cstr(rt, "lambda"), pit_nativefunc_new(rt, impl_sf_lambda));
+ pit_mset(rt, pit_intern_cstr(rt, "defun"), pit_nativefunc_new(rt, impl_m_defun));
+ 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_fset(rt, pit_intern_cstr(rt, "print"), pit_nativefunc_new(rt, impl_print));
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, "eval"), pit_nativefunc_new(rt, impl_eval));
+ pit_fset(rt, pit_intern_cstr(rt, "print"), pit_nativefunc_new(rt, impl_print));
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));
}