public bool Eval(bool measureTime)
        {
#if !DEBUG
            try
#endif
            {
                var dt  = DateTime.Now;
                var res = DyMachine.Execute(ExecutionContext);
                Printer.Output(res);

                if (measureTime)
                {
                    Printer.SupplementaryOutput($"Time taken: {DateTime.Now - dt}");
                }

                return(true);
            }
#if !DEBUG
            catch (DyCodeException ex)
            {
                Printer.Error(ex.ToString());
                return(false);
            }
            catch (DyRuntimeException ex)
            {
                Printer.Error(ex.Message);
                return(false);
            }
            catch (Exception ex)
            {
                Printer.Error($"Critical failure: {Environment.NewLine}{ex.ToString()}");
                return(false);
            }
#endif
        }
Beispiel #2
0
        private static IList <FunSet> Compile(IEnumerable <string> files, BuilderOptions buildOptions, out List <BuildMessage> warns)
        {
            var funColl = new List <FunSet>();

            warns = new List <BuildMessage>();

            foreach (var file in files)
            {
                var linker = new DyLinker(FileLookup.Create(Path.GetDirectoryName(file)), buildOptions);
                var cres   = linker.Make(SourceBuffer.FromFile(file));
                var funs   = new FunSet();
                funs.Funs     = new Dictionary <string, DyFunction>(StringComparer.OrdinalIgnoreCase);
                funs.FileName = file;

                if (!cres.Success)
                {
                    throw new DyBuildException(cres.Messages);
                }

                warns.AddRange(cres.Messages.Where(m => m.Type == BuildMessageType.Warning));
                var ctx = DyMachine.CreateExecutionContext(cres.Value);
                funs.Context = ctx;
                DyMachine.Execute(ctx);

                foreach (var v in DyMachine.DumpVariables(ctx))
                {
                    if (v.Value is DyFunction fn)
                    {
                        funs.Funs.Remove(v.Name);
                        funs.Funs.Add(v.Name, fn);
                    }
                }

                funColl.Add(funs);
            }

            return(funColl);
        }
Beispiel #3
0
    public static DyObject?Eval(SourceBuffer buffer, BuilderOptions options, FileLookup lookup, object?args = null)
    {
        DyTuple?tup = null;

        if (args is not null)
        {
            var arr = args.GetType().GetProperties().Select(pi =>
                                                            new DyLabel(pi.Name, TypeConverter.ConvertFrom(pi.GetValue(args)))).ToArray();
            tup = new DyTuple(arr);
        }

        var linker = new DyLinker(lookup ?? FileLookup.Default, options ?? BuilderOptions.Default(), tup);
        var result = linker.Make(buffer);

        if (!result.Success)
        {
            throw new DyBuildException(result.Messages);
        }

        var ctx     = DyMachine.CreateExecutionContext(result.Value !);
        var result2 = DyMachine.Execute(ctx);

        return(result2.Value);
    }
Beispiel #4
0
        public DyObject Eval(ExecutionContext ctx, DyObject source, DyObject args)
        {
            if (!(source is DyString strObj))
            {
                return(ctx.InvalidType(source));
            }

            var tup  = args as DyTuple;
            var code = strObj.Value;

            var sb = new StringBuilder();

            sb.Append("func __x12(");

            if (tup != null)
            {
                for (var i = 0; i < tup.Count; i++)
                {
                    var o = tup.Values[i];

                    if (o is DyLabel lab)
                    {
                        if (i > 0)
                        {
                            sb.Append(',');
                        }

                        sb.Append(lab.Label);
                    }
                }
            }

            sb.Append("){");
            sb.Append(code);
            sb.Append('}');
            sb.Append("__x12");

            var linker = new DyLinker(null, BuilderOptions.Default());
            var result = linker.Make(SourceBuffer.FromString(sb.ToString()));

            if (!result.Success)
            {
                throw new DyBuildException(result.Messages);
            }

            var newctx   = DyMachine.CreateExecutionContext(result.Value);
            var result2  = DyMachine.Execute(newctx);
            var func     = result2.Value as DyFunction;
            var argsList = new List <DyObject>();

            if (tup != null)
            {
                for (var i = 0; i < tup.Count; i++)
                {
                    var o = tup.Values[i];

                    if (o is DyLabel lab)
                    {
                        argsList.Add(lab.Value);
                    }
                }
            }

            return(func.Call(newctx, argsList.ToArray()));
        }