shithub: sl

Download patch

ref: 01199e8014b93d649d04e0780a6175cc591df32c
parent: b44678667842b4d277d0dc8342d690e234fd4e4d
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Wed Nov 27 04:41:17 EST 2024

add "makunbound"

--- a/builtins.c
+++ b/builtins.c
@@ -163,6 +163,15 @@
 	return args[1];
 }
 
+BUILTIN("makunbound", makunbound)
+{
+	argcount(nargs, 1);
+	symbol_t *sym = tosymbol(args[0]);
+	if(!isconstant(sym))
+		sym->binding = UNBOUND;
+	return FL(t);
+}
+
 static void
 global_env_list(symbol_t *root, value_t *pv)
 {
--- a/test/unittest.lsp
+++ b/test/unittest.lsp
@@ -360,9 +360,18 @@
 (assert (equal? (append '(1 2)) '(1 2)))
 (assert (equal? (append '(1 2) '(3 4)) '(1 2 3 4)))
 
+;; infinite list
 (define a '(1))
 (set-cdr! a a)
 (assert (equal? (length a) +inf.0))
+
+;; unbinding
+(define abc 1)
+(assert (equal? (bound? 'abc) #t))
+(assert (equal? (eval '(+ abc 1)) 2))
+(makunbound 'abc)
+(assert (equal? (bound? 'abc) #f))
+(assert-fail (eval '(+ abc 1)))
 
 ;; make many initialized tables large enough not to be stored in-line
 (for 1 100 (λ (i)