aboutsummaryrefslogtreecommitdiff
path: root/src/builtins.c
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-22 23:32:56 +0800
committerMistivia <i@mistivia.com>2025-06-22 23:33:12 +0800
commit7563e4e5c3c346b8b11f7e66cdb11c81bcf58fa9 (patch)
tree3d3ca32fdab4e1b21dc352d0bc98d3e8bedd452f /src/builtins.c
parentdaf22cff78522a1b5140fb7b02be3006ea4a2236 (diff)
add symbol functions
Diffstat (limited to 'src/builtins.c')
-rw-r--r--src/builtins.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/builtins.c b/src/builtins.c
index b8040ef..98252f8 100644
--- a/src/builtins.c
+++ b/src/builtins.c
@@ -6,6 +6,28 @@
#include <float.h>
#include <math.h>
+SExpRef builtin_symbol2string(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "symbol->string: arg num error.\n");
+ SExpRef arg = CAR(args);
+ if (VALTYPE(arg) != kSymbolSExp) return new_error(interp, "symbol->string: type error.\n");
+ return new_string(interp, REF(arg)->str);
+}
+
+SExpRef builtin_intern(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 1) return new_error(interp, "intern: arg num error.\n");
+ SExpRef arg = CAR(args);
+ if (VALTYPE(arg) != kStringSExp) return new_error(interp, "intern: type error.\n");
+ return new_symbol(interp, REF(arg)->str);
+}
+
+SExpRef builtin_gensym(Interp *interp, SExpRef args) {
+ if (LENGTH(args) != 0) return new_error(interp, "gensym: no arg.\n");
+ char buf[16];
+ snprintf(buf, 16, "sYyYm%d", interp->gensym_cnt);
+ interp->gensym_cnt++;
+ return new_symbol(interp, buf);
+}
+
SExpRef builtin_float(Interp *interp, SExpRef args) {
if (LENGTH(args) != 1) return new_error(interp, "float: expect 1 arg.\n");
SExpRef x = CAR(args);