public Value EvalOnce(ICollection <Expression> instrs) { if (ImmediateValue != null) { return(this); } return(Dynamic(ExprUtil.EvalOnce(Expression, instrs), Type)); }
public Expression CreateVariable(string name, Value value) { if (value.ImmediateValue != null) { values[name] = value; return(ExprUtil.Empty()); } else { var variable = Value.Dynamic( type: value.Type, expression: Expression.Parameter(value.GetClrType(), name)); values[name] = variable; return(Expression.Assign(variable.Expression, value.Expression)); } }
public (Value success, Value cost, Value value) CompileCoerce(Value x, Value type) { if (AreEqual(x.Type, type) == true) { return(Value.Immediate(true), Value.Immediate(0), x); } // TODO: develop sophisticated Dijkstra-algorithm based user defined coercion system var cost = Expression.Parameter(typeof(int), "cost"); Expression e = Expression.Call(typeof(RuntimeUtil).GetMethod("Coerce"), Expression.Convert(x.Expression, typeof(object)), type.Expression, cost); var instrs = new List <Expression>(); e = ExprUtil.EvalOnce(e, instrs); return(Value.Seq(instrs, Value.Dynamic(Expression.NotEqual(cost, Expression.Constant(-1)))), Value.Dynamic(cost), Value.Dynamic(Expression.Convert(e, type.AsClrType()))); }