summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorolpc user <olpc@xo-5d-f7-86.localdomain>2019-12-14 11:48:23 -0800
committerolpc user <olpc@xo-5d-f7-86.localdomain>2019-12-14 11:48:23 -0800
commit0a59d8631e2acb20601e72c6f79d7ce193633844 (patch)
treee8c1292049fd1c6d6b3702bb944d830fc5a9655d
parentec53662abe09a3ee1502e6ee7042d4ee84f36d1c (diff)
downloadstandingwithresilience-0a59d8631e2acb20601e72c6f79d7ce193633844.tar.gz
standingwithresilience-0a59d8631e2acb20601e72c6f79d7ce193633844.zip
missing changes
-rw-r--r--starts/meaning-vm/level-1/sugar.cpp1
-rw-r--r--starts/meaning-vm/level-2/concepts.hpp3
-rw-r--r--starts/meaning-vm/level-2/funcs.cpp9
-rw-r--r--starts/meaning-vm/level-2/sugar.hpp2
4 files changed, 13 insertions, 2 deletions
diff --git a/starts/meaning-vm/level-1/sugar.cpp b/starts/meaning-vm/level-1/sugar.cpp
index accad6c..025c68e 100644
--- a/starts/meaning-vm/level-1/sugar.cpp
+++ b/starts/meaning-vm/level-1/sugar.cpp
@@ -20,6 +20,7 @@ ref a(ref group)
}
ref a(ref group, ref name)
{
+ if (name == nothing) { return a(group); }
if (!name.isa(group)) {
name.link(is, group);
}
diff --git a/starts/meaning-vm/level-2/concepts.hpp b/starts/meaning-vm/level-2/concepts.hpp
index 3a6ac6b..8e9c145 100644
--- a/starts/meaning-vm/level-2/concepts.hpp
+++ b/starts/meaning-vm/level-2/concepts.hpp
@@ -7,11 +7,14 @@ namespace level2 {
namespace concepts {
+using level1::concepts::nothing;
+
static ref context("context");
static ref habit("habit");
static ref next("next");
static ref positional("positional");
static ref argument("argument");
+static ref result("result");
}
diff --git a/starts/meaning-vm/level-2/funcs.cpp b/starts/meaning-vm/level-2/funcs.cpp
index a8835f4..11b3184 100644
--- a/starts/meaning-vm/level-2/funcs.cpp
+++ b/starts/meaning-vm/level-2/funcs.cpp
@@ -46,13 +46,18 @@ ref dohabit(ref habit, std::initializer_list<ref> args)
if (posarg.linked(next-positional-argument)) {
throw std::invalid_argument("wrong number of arguments to habit");
}
- ref ret = habit.fun<ref>()(ref::context());
+ habit.fun<ref>()(ref::context());
posarg = habit;
while (posarg.linked(next-positional-argument)) {
posarg = posarg[next-positional-argument];
ref::context().unlink(posarg[argument]);
}
- return ret;
+ if (ref::context().linked(result)) {
+ ref ret = ref::context().get(result);
+ ref::context().unlink(result, ret);
+ return ret;
+ }
+ return nothing;
}
}
diff --git a/starts/meaning-vm/level-2/sugar.hpp b/starts/meaning-vm/level-2/sugar.hpp
index bff945b..5b3b150 100644
--- a/starts/meaning-vm/level-2/sugar.hpp
+++ b/starts/meaning-vm/level-2/sugar.hpp
@@ -32,8 +32,10 @@
usleep(delay); \
} \
ref self = name; (void)self; \
+ ref result("nothing"); (void)result; \
_macro_call(_macro_for_each_parens, _macro_habit_set_posarg, _macro_habit_set_posarg _macro_comma_remove_parens(argnametoklist)); \
__VA_ARGS__ \
+ if (result != ref("nothing")) { ctx.link(ref("result"), result); }
});
#define _macro_habit_argnameref(name, tok) \
ref(#name)