diff options
author | olpc user <olpc@xo-5d-f7-86.localdomain> | 2020-01-10 18:05:43 -0800 |
---|---|---|
committer | olpc user <olpc@xo-5d-f7-86.localdomain> | 2020-01-10 18:05:43 -0800 |
commit | 3223a360d0e70f75497aecf8c033a4f987335b5b (patch) | |
tree | c34e5ed5d7aa83513447644b4774c0449336657f /intellect-framework-from-internet/starts/meaning-vm/level-2-wip-stmtexprs/statementref.cpp | |
parent | 26c980d302adce8e3d802cb8db8ab1c69d58ce1a (diff) | |
download | standingwithresilience-3223a360d0e70f75497aecf8c033a4f987335b5b.tar.gz standingwithresilience-3223a360d0e70f75497aecf8c033a4f987335b5b.zip |
I'm confused and am handling multiple unexpected systems issues
Diffstat (limited to 'intellect-framework-from-internet/starts/meaning-vm/level-2-wip-stmtexprs/statementref.cpp')
-rw-r--r-- | intellect-framework-from-internet/starts/meaning-vm/level-2-wip-stmtexprs/statementref.cpp | 68 |
1 files changed, 0 insertions, 68 deletions
diff --git a/intellect-framework-from-internet/starts/meaning-vm/level-2-wip-stmtexprs/statementref.cpp b/intellect-framework-from-internet/starts/meaning-vm/level-2-wip-stmtexprs/statementref.cpp deleted file mode 100644 index 2f23dc8..0000000 --- a/intellect-framework-from-internet/starts/meaning-vm/level-2-wip-stmtexprs/statementref.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "statementref.hpp" - -#include "concepts.hpp" -#include "ref.hpp" - -using namespace intellect; -using namespace level2; -using namespace concepts; - -// so, anonymous-assignment is both a statement and an expression. -// multiple-member-assignment is only an expression: it is an error to evaluate it -// the submember operator will be both a statement and an expression, but doesn't need to be held as a ref -// single-member-assignment is mostly a statement: using it as an expression should be an error. - -static statementref makebinary( - ref lhs, ref kind, ref rhs, - std::function<ref(ref)> expraction, - std::function<void(ref)> stmtaction -) -{ - a(statement-expresion, kind-expression); - ref r = a(kind-expression); - r.set(left-operand, lhs); - r.set(right-operand, rhs); - r.vset(expression-action, expraction); - r.vset(statement-action, stmtaction); - return r; -} - -statementref::statementref(ref r) -: r(r.ptr()) -{ - if (!r.isa(statement-expression)) { - throw std::logic_error("that is not a statement expression"); - } -} - -static void de(ref & r) -{ - ref lhs, rhs, expraction, stmtaction; - - try { lhs = r.get(left-operand); } catch(level0::no_such_link_type&) {} - try { rhs = r.get(right-operand); } catch(level0::no_such_link_type&) {} - - expraction = r.get(expression-action); - stmtaction = r.get(statement-action); - dealloc(r); - if (lhs != nothing) { dealloc(lhs); } - if (rhs != nothing) { dealloc(rhs); } - dealloc(expraction); - dealloc(stmtaction); - r = 0; -} - -statementref::~statementref() -{ - if (r == 0) { return; } - r.vget<std::function<void(ref)>>(statement-action)(r); - de(r); -} - -statementref::operator ref() -{ - if (r == 0) { throw std::logic_error("doubly evaluated expression"); } - auto ret = r.vget<std::function<void(ref)>>(expression-action)(r); - de(r); - return ret; -} |