diff options
| author | Mistivia <i@mistivia.com> | 2025-06-22 23:32:56 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-06-22 23:33:12 +0800 |
| commit | 7563e4e5c3c346b8b11f7e66cdb11c81bcf58fa9 (patch) | |
| tree | 3d3ca32fdab4e1b21dc352d0bc98d3e8bedd452f /src/builtins.c | |
| parent | daf22cff78522a1b5140fb7b02be3006ea4a2236 (diff) | |
add symbol functions
Diffstat (limited to 'src/builtins.c')
| -rw-r--r-- | src/builtins.c | 22 |
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); |
