commit 17a56db499f8a126beaf1febce5451f6a9406f07
parent 49c87d325f4a4e83960a1c4d34a13a85c6186c01
Author: Ed van Bruggen <edvb@uw.edu>
Date:   Sat, 12 Jan 2019 18:56:00 -0800
Add void primitive to return nothing
Allow for void type to be printed in a list.
Diffstat:
2 files changed, 32 insertions(+), 11 deletions(-)
diff --git a/doc/tisp.1.md b/doc/tisp.1.md
@@ -144,6 +144,11 @@ as the cdr.
 
 Returns the given argument unevaluated.
 
+#### void
+
+Returns nothing. Used to insert a void type in a list or force a function not
+to return anything.
+
 #### =
 
 Tests if multiple values equal. Returns nil if any are not, and `t` otherwise.
diff --git a/tisp.c b/tisp.c
@@ -600,6 +600,15 @@ tisp_eval(Env env, Val v)
 	return v;
 }
 
+static void
+list_print(FILE *f, Val v)
+{
+	if (v->t == NONE)
+		fprintf(f, "#<void>");
+	else
+		tisp_print(f, v);
+}
+
 /* TODO return str for error msgs? */
 void
 tisp_print(FILE *f, Val v)
@@ -635,16 +644,16 @@ tisp_print(FILE *f, Val v)
 		break;
 	case PAIR:
 		putc('(', f);
-		tisp_print(f, car(v));
+		list_print(f, car(v));
 		v = cdr(v);
 		while (!nilp(v)) {
 			if (v->t == PAIR) {
 				putc(' ', f);
-				tisp_print(f, car(v));
+				list_print(f, car(v));
 				v = cdr(v);
 			} else {
 				fprintf(f, " . ");
-				tisp_print(f, v);
+				list_print(f, v);
 				break;
 			}
 		}
@@ -688,6 +697,19 @@ prim_cons(Env env, Val args)
 }
 
 static Val
+prim_quote(Env env, Val args)
+{
+	tsp_arg_num(args, "quote", 1);
+	return car(args);
+}
+
+static Val
+prim_void(Env env, Val args)
+{
+	return env->none;
+}
+
+static Val
 prim_eq(Env env, Val args)
 {
 	Val v;
@@ -702,13 +724,6 @@ prim_eq(Env env, Val args)
 }
 
 static Val
-prim_quote(Env env, Val args)
-{
-	tsp_arg_num(args, "quote", 1);
-	return car(args);
-}
-
-static Val
 prim_cond(Env env, Val args)
 {
 	Val v, cond;
@@ -808,8 +823,9 @@ tisp_env_init(size_t cap)
 	hash_add(e->h, "car",    mk_prim(prim_car));
 	hash_add(e->h, "cdr",    mk_prim(prim_cdr));
 	hash_add(e->h, "cons",   mk_prim(prim_cons));
-	hash_add(e->h, "=",      mk_prim(prim_eq));
 	hash_add(e->h, "quote",  mk_prim(prim_quote));
+	hash_add(e->h, "void",   mk_prim(prim_void));
+	hash_add(e->h, "=",      mk_prim(prim_eq));
 	hash_add(e->h, "cond",   mk_prim(prim_cond));
 	hash_add(e->h, "lambda", mk_prim(prim_lambda));
 	hash_add(e->h, "define", mk_prim(prim_define));