aboutsummaryrefslogtreecommitdiff
path: root/src/primitives.c
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-20 15:28:01 +0800
committerMistivia <i@mistivia.com>2025-06-20 15:28:01 +0800
commitad580b3401deb4a41ee3a8f17824d136ee5cf38d (patch)
tree40731b13e0e17d65272610d93ccaf551f5479526 /src/primitives.c
parent815b972460fb83267a719f82afd79c2abaac80cd (diff)
defvar
Diffstat (limited to 'src/primitives.c')
-rw-r--r--src/primitives.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/primitives.c b/src/primitives.c
index f423a6b..25be771 100644
--- a/src/primitives.c
+++ b/src/primitives.c
@@ -165,6 +165,22 @@ error:
return new_error(interp, "defun: syntax error.\n");
}
+SExpRef primitive_defvar(Interp *interp, SExpRef args) {
+ if (lisp_length(interp, args) != 2) goto error;
+ if (CAR(interp->stack).idx != interp->top_level.idx) {
+ return new_error(interp, "defvar: functions can only be defined in top level.\n");
+ }
+ SExpRef name = CAR(args);
+ if (VALTYPE(name) != kSymbolSExp) goto error;
+ SExpRef exp = CADR(args);
+ SExpRef val = EVAL(exp);
+ if (ERRORP(val)) return val;
+ lisp_defvar(interp, REF(name)->str, val);
+ return name;
+error:
+ return new_error(interp, "defvar: syntax error.\n");
+}
+
SExpRef primitive_function(Interp *interp, SExpRef args) {
if (lisp_length(interp, args) != 1) goto error;
if (VALTYPE(CAR(args)) != kSymbolSExp) goto error;