/// <summary>Native method representing the apply method</summary> /// <param name="ctx">Current interpreter</param> /// <param name="req">Request that obtained this method</param> public GraceObject Apply(EvaluationContext ctx, MethodRequest req) { GraceObject ret = GraceObject.Done; MethodNode.CheckArgCount(ctx, "apply", "apply", parameters.Count, Variadic, req[0].Arguments.Count); ctx.Remember(lexicalScope); var myScope = new LocalScope(req.Name); // Bind any local methods (types) on the scope foreach (var localMeth in body.OfType <MethodNode>()) { myScope.AddMethod(localMeth.Name, new Method(localMeth, lexicalScope)); } // Bind parameters and arguments foreach (var arg in parameters.Zip(req[0].Arguments, (a, b) => new { name = a, val = b })) { var id = arg.name as ParameterNode; if (id != null && id.Variadic) { // Populate variadic parameter with all remaining // arguments. var gvl = new GraceVariadicList(); for (var i = parameters.Count - 1; i < req[0].Arguments.Count; i++) { gvl.Add(req[0].Arguments[i]); } myScope.AddLocalDef(id.Name, gvl); } else { string name = ((IdentifierNode)arg.name).Name; myScope.AddLocalDef(name, arg.val); } } if (Variadic && parameters.Count > req[0].Arguments.Count) { // Empty variadic parameter. var param = parameters.Last(); var idNode = param as ParameterNode; if (idNode != null && idNode.Variadic) { var gvl = new GraceVariadicList(); myScope.AddLocalDef(idNode.Name, gvl); } } ctx.Extend(myScope); foreach (Node n in body) { ret = n.Evaluate(ctx); } ctx.Unextend(myScope); ctx.Forget(lexicalScope); return(ret); }
/// <inheritdoc/> /// <remarks>This method uses the indexer on the LocalScope /// object the method was requested on.</remarks> public override GraceObject Respond(EvaluationContext ctx, GraceObject self, MethodRequest req) { checkAccessibility(ctx, req); LocalScope s = self as LocalScope; string name = req[0].Name; s[name] = req[1].Arguments[0]; return(GraceObject.Done); }
/// <inheritdoc/> /// <remarks>This method uses the indexer on the LocalScope /// object the method was requested on.</remarks> public override GraceObject Respond(EvaluationContext ctx, GraceObject self, MethodRequest req) { checkAccessibility(ctx, req); MethodHelper.CheckNoInherits(ctx, req); MethodNode.CheckArgCount(ctx, req.Name, req.Name, 0, false, req[0].Arguments.Count); LocalScope s = self as LocalScope; string name = req.Name; if (s[name] == GraceObject.Uninitialised || s[name] == null) { ErrorReporting.RaiseError(ctx, "R2008", new Dictionary <string, string> { { "name", name }, { "receiver", ToString() } }, "UninitialisedReadError: Cannot read from «" + name + "»" ); } return(s[name]); }
/// <summary>An object with an internal scope</summary> /// <param name="scope">Internal scope of this object</param> /// <param name="omitDefaultMethods"> /// Leave out the default methods ==, asString, etc, /// from this (part-)object. /// </param> public GraceObject(LocalScope scope, bool omitDefaultMethods) { initialise(!omitDefaultMethods); }