diff options
Diffstat (limited to 'src/primitives.c')
| -rw-r--r-- | src/primitives.c | 16 |
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; |
