public Evaluate ( Context context, bool withvars = false ) : object | ||
context | Context | |
withvars | bool | |
return | object |
public object Evaluate(Context context, bool withvars = false)
{
object modulevalue = this.moduleexpression.Evaluate(context, withvars);
object namevalue = this.nameexpression.Evaluate(context, withvars);
string modulename = ((Atom)modulevalue).Name;
string name = string.Format("{0}/{1}", ((Atom)namevalue).Name, this.argumentexpressions.Count);
IList<object> arguments = new List<object>();
foreach (var argexpr in this.argumentexpressions)
arguments.Add(argexpr.Evaluate(context, withvars));
Module module = context.GetValue(modulename) as Module;
if (module == null || !module.ExportNames.Contains(name) || !(module.Context.GetValue(name) is IFunction))
throw new Exception(string.Format("undefined function {0}:{1}", modulename, name));
IFunction func = (IFunction)module.Context.GetValue(name);
return func.Apply(context, arguments);
}
public void EvaluateQualifiedCallExpression() { Context context = new Context(); Module module = new Module(null); context.SetValue("mod", module); Function function = new Function(context, new object[] { new Variable("X"), new Variable("Y") }, new AddExpression(new VariableExpression(new Variable("X")), new VariableExpression(new Variable("Y")))); module.Context.SetValue("add/2", function); module.AddExportNames(new string[] { "add/2" }); QualifiedCallExpression expr = new QualifiedCallExpression(new AtomExpression(new Atom("mod")), new AtomExpression(new Atom("add")), new IExpression[] { new ConstantExpression(1), new ConstantExpression(2) }); Assert.IsFalse(expr.HasVariable()); Assert.IsNotNull(expr.ModuleExpression); Assert.IsInstanceOfType(expr.ModuleExpression, typeof(AtomExpression)); Assert.IsNotNull(expr.NameExpression); Assert.IsInstanceOfType(expr.NameExpression, typeof(AtomExpression)); Assert.IsNotNull(expr.ArgumentExpressions); Assert.AreEqual(2, expr.ArgumentExpressions.Count); Assert.AreEqual(3, expr.Evaluate(context)); }