static Any getExecuteWhen(When w) { if ( executeCode(w->condition) ) return expandCodeArgument(w->then_branch); else return expandCodeArgument(w->else_branch); }
static status ExecuteEqual(Equal eq) { Any left = expandCodeArgument(eq->left); Any right = expandCodeArgument(eq->right); if ( left == FAIL || right == FAIL ) fail; if ( left == right ) /* left ->equal: right? */ succeed; fail; }
static status ExecuteAssignment(Assignment b) { Any val; TRY(val = expandCodeArgument(b->value)); return assignVar(b->var, val, b->scope); }
static Any getExecuteObtain(Obtain obt) { Any receiver; Name selector; Any rval = FAIL; void *savedcontext; if ( notNil(obt->context) && TheCallbackFunctions.setHostContext ) { savedcontext = (*TheCallbackFunctions.setHostContext)(obt->context); } else savedcontext = NIL; if ( !(receiver = expandCodeArgument(obt->receiver)) ) goto out; if ( !(selector = checkSelector(obt->selector)) ) goto out; if ( isNil(obt->arguments) ) { rval = getv(receiver, selector, 0, NULL); } else { int n; int argc = valInt(obt->arguments->size); ArgVector(argv, argc); Any *elms = obt->arguments->elements; for(n = 0; n < argc; n++) { if ( !(argv[n] = expandCodeArgument(elms[n])) ) goto out; } rval = getv(receiver, selector, argc, argv); } out: if ( notNil(savedcontext) ) (*TheCallbackFunctions.setHostContext)(savedcontext); return rval; }