From db94af675ccfb34885000e3d97947557cebb66f3 Mon Sep 17 00:00:00 2001
From: olpc user <olpc@xo-5d-f7-86.localdomain>
Date: Fri, 20 Dec 2019 09:01:21 -0800
Subject: habit macros can use default arguments now

---
 starts/meaning-vm/level-2/funcs.hpp |  1 +
 starts/meaning-vm/level-2/sugar.hpp | 14 ++++++++++----
 2 files changed, 11 insertions(+), 4 deletions(-)

(limited to 'starts/meaning-vm/level-2')

diff --git a/starts/meaning-vm/level-2/funcs.hpp b/starts/meaning-vm/level-2/funcs.hpp
index 85e1af8..65290fb 100644
--- a/starts/meaning-vm/level-2/funcs.hpp
+++ b/starts/meaning-vm/level-2/funcs.hpp
@@ -9,6 +9,7 @@ namespace intellect {
 namespace level2 {
 
 ref & context();
+// TODO: pass default argument values to makehabit?
 ref makehabit(ref name, std::initializer_list<ref> argnames, std::function<void(ref)> code);
 ref dohabit(ref habit, std::initializer_list<ref> args);
 ref dohabit(ref habit, std::initializer_list<std::initializer_list<ref>> args = {});
diff --git a/starts/meaning-vm/level-2/sugar.hpp b/starts/meaning-vm/level-2/sugar.hpp
index b44b282..9065a20 100644
--- a/starts/meaning-vm/level-2/sugar.hpp
+++ b/starts/meaning-vm/level-2/sugar.hpp
@@ -37,12 +37,18 @@
 		__VA_ARGS__ \
 		if (result != ref("nothing")) { ctx.link(ref("result"), result); } \
 	});
-	#define _macro_habit_argnameref(name, tok) \
+	#define _macro_habit_argnameref(name, tok, ...) \
 		ref(#name)
-	#define _macro_habit_commaargnameref(name, tok) \
+	#define _macro_habit_commaargnameref(name, tok, ...) \
 		, ref(#name)
-	#define _macro_habit_set_posarg(name, tok) \
-		ref tok = ctx[ref(#name)];
+	#define _macro_habit_set_posarg(name, tok, ...) \
+		if ((#__VA_ARGS__)[0] == 0 && !ctx.linked(ref(#name))) { \
+			throw an(ref("habit-context-missing-information")).link \
+				(ref("habit"), self, \
+				 ref("context"), ctx, \
+				 ref("missing-information"), ref(#name)); \
+		} \
+		ref tok = ctx.linked(ref(#name)) ? ctx[ref(#name)] : ref(#__VA_ARGS__);
 	
 	// seed random number generator statically, for habit delay
 	namespace _macro_habit {
-- 
cgit v1.2.3