object EvaluateWhereClause(Runtime.PassiveExpression expr, Runtime.Pattern lastPattern, ScriptThread thread) { // instantiate where-clause pattern var patt = Pattern.Instantiate(thread); patt.CopyBoundVariables(lastPattern); // perform matching var result = patt.Match(expr); if (result) { // store last recognized pattern as a local variable thread.SetLastPattern(patt); // match succeeded, return result expression if (ResultExpression != null) { return ResultExpression.Evaluate(thread); } // match succeeded, evaluate more conditions if (MoreConditions != null) { return MoreConditions.Evaluate(thread); } } // matching failed, return nothing return null; }
protected override object DoEvaluate(ScriptThread thread) { // standard prolog thread.CurrentNode = this; // evaluate pattern and copy bound variables of the current block var patt = Pattern.Instantiate(thread); if (BlockPattern != null) { patt.CopyBoundVariables(BlockPattern); } object result = null; // if pattern is recognized, calculate new expression and return true var success = patt.Match(InputExpression); if (success) { // store last recognized pattern as a local variable thread.SetLastPattern(patt); // simple sentence if (Expression != null) { result = Expression.Evaluate(thread); } // sentence with a where- or when-clause else if (Conditions != null) { result = Conditions.Evaluate(thread); } } // standard epilog thread.CurrentNode = Parent; return result; }