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 }
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); }
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); }
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())); }