public Value Invoke(Value self, RubyContext context, IList <Value> values) { RubyContext newContext = context.VM.NewContext(context.VM.rb_obj_ptr(self), this.context); int k = 0; // int cv = values.Count; foreach (var parameter in parameters.args) { switch (parameter.type) { case AstNodeType.CONST: case AstNodeType.LVAR: case AstNodeType.SYM: newContext.SetLocalValue( (parameter as INamedNode).name, context.VM.GetArg <Value> (values, k) ); k++; break; default: Console.WriteLine($"DefinedFunction::Invoke param type: {parameter.type} 未实现"); break; } } // if ( isConstructor ) { // body.Evaluate ( newContext ); // return self; // } return(body.Evaluate(newContext)); }
public override Value Evaluate(RubyContext context) { #if DEBUG context.VM.CurrentEvalNode = this; #endif Value ret = cdr.Evaluate(context); switch (car.type) { case AstNodeType.GVAR: context.RootContext.SetLocalValue((( INamedNode )car).name, ret); return(ret); case AstNodeType.SYM: case AstNodeType.CONST: case AstNodeType.LVAR: context.SetLocalValue((( INamedNode )car).name, ret); return(ret); case AstNodeType.CVAR: context.Self.SingletonClass.SetIV((( INamedNode )car).name, ret); return(ret); case AstNodeType.IVAR: context.Self.SetIV((( INamedNode )car).name, ret); return(ret); case AstNodeType.AREF: var arrayRefNode = car.As <ArrayRefNode> (); var array = arrayRefNode.car.Evaluate(context); var indexed = arrayRefNode.cdr.Evaluate(context); context.VM.FunctionCall(array, "[]=", new [] { indexed, ret }); break; case AstNodeType.DOT: default: VM.ThrowException($"AsgnNode type: {car.type} not impl."); break; } return(ret); }