AnimExpression::OpCode AnimExpression::evaluate(const AnimVariantMap& map) const { std::stack<OpCode> stack; for (auto& opCode : _opCodes) { switch (opCode.type) { case OpCode::Identifier: case OpCode::Int: case OpCode::Float: case OpCode::Bool: stack.push(opCode); break; case OpCode::And: evalAnd(map, stack); break; case OpCode::Or: evalOr(map, stack); break; case OpCode::GreaterThan: evalGreaterThan(map, stack); break; case OpCode::GreaterThanEqual: evalGreaterThanEqual(map, stack); break; case OpCode::LessThan: evalLessThan(map, stack); break; case OpCode::LessThanEqual: evalLessThanEqual(map, stack); break; case OpCode::Equal: evalEqual(map, stack); break; case OpCode::NotEqual: evalNotEqual(map, stack); break; case OpCode::Not: evalNot(map, stack); break; case OpCode::Subtract: evalSubtract(map, stack); break; case OpCode::Add: evalAdd(map, stack); break; case OpCode::Multiply: evalMultiply(map, stack); break; case OpCode::Divide: evalDivide(map, stack); break; case OpCode::Modulus: evalModulus(map, stack); break; case OpCode::UnaryMinus: evalUnaryMinus(map, stack); break; } } return coerseToValue(map, stack.top()); }
Query* UserQuery:: eval_query() { vector<string,allocator>::iterator it = _query->begin(), end_it = _query->end(); for ( ; it != end_it; ++it ) { switch( evalQueryString( *it )) { case WORD: evalWord( *it ); break; case AND: evalAnd(); break; case OR: evalOr(); break; case NOT: evalNot(); break; case LPAREN: ++_paren; ++_lparenOn; break; case RPAREN: --_paren; ++_rparenOn; evalRParen(); break; } cout << " lparenOn: " << _lparenOn << endl; cout << " rparenOn: " << _rparenOn << endl; } if ( integrity_check() ) { _eval = _query_stack.top(); _query_stack.pop(); if ( _rparenOn ) { _eval->rparen( _rparenOn ); _rparenOn = 0; } return _eval; } else return _eval = 0; }
ValuePtr eval(EnvPtr env, ValuePtr data) { // Self evaluating if(data->isBool() || data->isNumber() || data->isString()) { return data; } // Symbols else if(data->isSymbol()) { EnvPtr current = env; while(!(NULL == current)) { if(current->values.find(data->vString()) != current->values.end()) { return current->values[data->vString()]; } current = current->parent; } CHECK_FAIL(string("Trying to access unknown symbol: ") + data->vString()); } // Lists else if(data->isPair()) { if(!sListP(data)) { CHECK_FAIL("Unable to evaluate non-lists"); return rsUndefined(); } // ---------------------------------------- // Check for special forms if(data->car()->isSymbol()) { // ---------------------------------------- // Quote if(data->car()->vString() == string("quote")) { if(data->cdr()->isPair() && data->cdr()->cdr()->isNull()) return data->cdr()->car(); else CHECK_FAIL("Quote error"); } // ---------------------------------------- // Lambda else if(data->car()->vString() == string("lambda")) { if(sListP(data->cdr()->car())) { return evalLambda(env, data->cdr()->car(), data->cdr()->cdr()); } else { CHECK_FAIL("Malformed lambda parameter sequence"); return rsUndefined(); } } // ---------------------------------------- // Definitions: define, set! else if(data->car()->vString() == string("define")) { return evalDefine(env, data); } else if(data->car()->vString() == string("set!")) { return evalSet(env, data); } // ---------------------------------------- // Conditionals and boolean: if, cond else if(data->car()->vString() == string("if")) { return evalIf(env, data); } else if(data->car()->vString() == string("cond")) { return evalCond(env, data); } else if(data->car()->vString() == string("and")) { return evalAnd(env, data); } else if(data->car()->vString() == string("or")) { return evalOr(env, data); } // ---------------------------------------- // Binding constructs else if(data->car()->vString() == string("let")) { return evalLet(env, data); } // ---------------------------------------- // Sequencing else if(data->car()->vString() == string("begin")) { return evalSequence(env, data->cdr()); } } // Ok, standard statement return evalStatement(env, data); } else { CHECK_FAIL("Trying to evaluate unknown type"); } CHECK_FAIL("Eval error, this should never be reachable"); return rsUndefined(); }
double MathParser::eval() const { return evalOr(Math::NaN); }