本文整理汇总了C#中Env.PushNewEnv方法的典型用法代码示例。如果您正苦于以下问题:C# Env.PushNewEnv方法的具体用法?C# Env.PushNewEnv怎么用?C# Env.PushNewEnv使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Env
的用法示例。
在下文中一共展示了Env.PushNewEnv方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Eval
public override Result Eval(Env env)
{
var lazy = Fun as LazyFun;
if (lazy != null)
{
if (Args.Count() == 1)
throw new ScException("至少需要一个参数");
var name = (Args.First() as Val)?.ValName;
if (name == null) throw new ArgumentNullException(nameof(name));
return lazy.Eval(name, Args.Skip(1).ToList(), env);
}
var evalArgs = (Fun is BuiltinFun ? Args.Skip(1) : Args).Select(a => a.Eval(env)).ToList();
var count = Fun.Args.Count();
env.PushNewEnv();
if (Fun.Limit)
{
if (Fun is BuiltinFun)
{
env.PutValue(Fun.Args.First(), Args.First());
if (Fun.Args.Count() > 1)
env.PutValue(Fun.Args.Skip(1).First(), new Val() { Result = new Result(evalArgs) });
}
else
{
for (var i = 0; i < count; i++)
{
env.PutValue(Fun.Args.ElementAt(i), new Val() { Result = evalArgs.ElementAt(i) });
}
}
}
else
{
switch (count)
{
case 0:
throw new ScException("至少要有一个实参");
case 1:
env.PutValue(Fun.Args.First(), new Val() { Result = new Result(evalArgs) });
break;
default:
var arg = new Result(evalArgs);
env.PutValue(Fun.Args.First(), Fun is BuiltinFun ? Args.First() : new Val()
{
Result =
new Result() { Type = arg.Type, Val = arg.Val.Take(1) }
});
env.PutValue(Fun.Args.Skip(1).First(), new Val()
{
Result =
new Result() { Type = arg.Type, Val = Fun is BuiltinFun ? arg.Val : arg.Val.Skip(1) }
});
break;
}
}
var v = Fun.Eval(env);
env.PopEnv();
return v;
}