コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 /// <inheritdoc />
 public GraceObject PreludeRequest(MethodRequest req)
 {
     return(prelude.Request(this, req));
 }