diff options
| author | LLLL Colonq <llll@colonq> | 2025-09-27 04:21:06 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2025-09-27 04:21:06 -0400 |
| commit | ab57bc2a6d6ea9c24aa119df6efbd8a38b54c312 (patch) | |
| tree | bfc7fe32f40804e7808016038a3f2f15ef9e643e /src/library.c | |
| parent | 811f11463851a0f35835ac72ef09b65b1072de20 (diff) | |
Source location tracking
Diffstat (limited to 'src/library.c')
| -rw-r--r-- | src/library.c | 57 |
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)); } |
