/// <summary> /// Load extensions to builtins from traits in an /// existing object. /// </summary> /// <param name="ext">Object containing extension traits.</param> public void LoadExtensionsFromObject(GraceObject ext) { var req = MethodRequest.Nullary("ObjectExtension"); req.IsInherits = true; if (ext.RespondsTo(req)) { var uo = new UserObject(); req.InheritingObject = uo; ext.Request(this, req); GraceObject.ExtendDefaultMethods(req.InheritedMethods); } req = MethodRequest.Nullary("NumberExtension"); req.IsInherits = true; if (ext.RespondsTo(req)) { var uo = new UserObject(); req.InheritingObject = uo; ext.Request(this, req); GraceNumber.ExtendWith(req.InheritedMethods); } req = MethodRequest.Nullary("StringExtension"); req.IsInherits = true; if (ext.RespondsTo(req)) { var uo = new UserObject(); req.InheritingObject = uo; ext.Request(this, req); GraceString.ExtendWith(req.InheritedMethods); } }
/// <summary>Native version of the built-in Grace "while-do" method /// </summary> /// <remarks>This while-do is more efficient than is possible to /// implement in bare Grace without it.</remarks> public static GraceObject BaseWhileDo(EvaluationContext ctx, MethodRequest req) { GraceObject cond = req[0].Arguments[0]; GraceObject block = req[0].Arguments[1]; MethodRequest apply = MethodRequest.Nullary("apply"); while (cond.Request(ctx, apply) == GraceBoolean.True) { block.Request(ctx, apply); } return(GraceObject.Done); }
private void processCallback(EvaluationContext ctx, GraceObject block, object[] args) { var lArgs = new List <GraceObject>(); foreach (var arg in args) { var gfo = arg as GraceForeignObject; if (gfo != null) { lArgs.Add(new DomObject((int)gfo.IdentifyingData, sink)); } else { lArgs.Add((GraceObject)arg); } } var req = MethodRequest.WithArgs("apply", lArgs); block.Request(ctx, req); }
/// <inheritdoc /> public GraceObject PreludeRequest(MethodRequest req) { return(prelude.Request(this, req)); }