protected override bool Run() { if (connection == null) { new Lookup(task_master, source_ref, new []{"connection"}, context).Notify(return_value => { if (return_value is ReflectedFrame) { Object backing = ((ReflectedFrame) return_value).Backing; if (backing is DbConnection) { connection = (DbConnection) backing; if (Interlocked.Decrement(ref interlock) == 0) { task_master.Slot(this); } return; } } task_master .ReportOtherError(source_ref, "Expected “connection” to come from “sql:” import."); }); new Lookup(task_master, source_ref, new []{"sql_query"}, context).Notify(return_value=> { if (return_value is Stringish) { query = return_value.ToString(); if (Interlocked.Decrement(ref interlock) == 0) { task_master.Slot(this); } return; } task_master.ReportOtherError(source_ref, string.Format( "Expected type Str for “sql_query”, but got {0}.", Stringish.NameForType(return_value.GetType()))); }); if (Interlocked.Decrement(ref interlock) > 0) { return false; } } try { var command = connection.CreateCommand(); command.CommandType = System.Data.CommandType.Text; command.CommandText = query; var reader = command.ExecuteReader(); if (debug) { Console.WriteLine("SQL Query to {0}: {1}", connection, query); } NameChooser name_chooser = (rs, it) => TaskMaster.OrdinalNameStr(it); var retrievers = new List<Retriever>(); for (int col = 0; col < reader.FieldCount; col++) { var column = col; if (reader.GetName(col) == "ATTRNAME") { name_chooser = (rs, it) => rs.GetString(column); continue; } if (reader.GetName(col).StartsWith("$")) { var attr_name = reader.GetName(col).Substring(1); if (!task_master.VerifySymbol(source_ref, attr_name)) { return false; } retrievers.Add((rs, frame) => frame.Set(attr_name, rs.IsDBNull(column) ? Precomputation.Capture(Unit.NULL) : Lookup.Do(rs.GetString(column).Split('.')))); continue; } Unpacker unpacker; if (!unpackers.TryGetValue(reader.GetFieldType(col), out unpacker)) { task_master .ReportOtherError( source_ref, string.Format( "Cannot convert SQL type “{0}” for column “{1}” into Flabbergast type.", reader.GetFieldType(col), reader.GetName(col))); } if (!task_master.VerifySymbol(source_ref, reader.GetName(col))) { return false; } retrievers.Add(Bind(reader.GetName(col), col, unpacker)); } var list = new MutableFrame(task_master, source_ref, context, self); for (int it = 1; reader.Read(); it++) { var frame = new MutableFrame(task_master, source_ref, list.Context, list); foreach (var r in retrievers) { r(reader, frame); } list.Set(name_chooser(reader, it), frame); } result = list; return true; } catch (DataException e) { task_master.ReportOtherError(source_ref, e.Message); return false; } }
protected override bool Run() { if (mappings.Count == 0) { interlock = categories.Count + 2; Computation input_lookup = new Lookup(task_master, source_reference, new []{"arg"}, context); input_lookup.Notify(input_result => { if (input_result is Stringish) { input = input_result.ToString(); if (Interlocked.Decrement(ref interlock) == 0) { task_master.Slot(this); } } else { task_master.ReportOtherError(source_reference, "Input argument must be a string."); } }); foreach (var entry in categories) { var lookup = new Lookup(task_master, source_reference, new []{ entry.Value }, context); lookup.Notify(cat_result => { mappings[entry.Key] = cat_result; if (Interlocked.Decrement(ref interlock) == 0) { task_master.Slot(this); } }); } if (Interlocked.Decrement(ref interlock) > 0) { return false; } } var frame = new MutableFrame(task_master, source_reference, context, container); for(int it = 0; it < input.Length; it++) { frame.Set(it + 1, mappings[Char.GetUnicodeCategory(input[it])]); } result = frame; return true; }
protected override bool Run() { if (!state) { var input_lookup = new Lookup(task_master, source_ref, new []{"args"}, context); input_lookup.Notify(HandleArgs); var transformation_lookup = new Lookup(task_master, source_ref, new []{"transformations"}, context); transformation_lookup.Notify(HandleTransformations); state = true; if (Interlocked.Decrement(ref interlock) > 0) { return false; } } var output_frame = new MutableFrame(task_master, source_ref, context, self); for (var index = 0; index < input.Length; index++) { var buffer = new StringBuilder(); for(var it = 0; it < input[index].Length; it += Char.IsSurrogatePair(input[index], it) ? 2 : 1) { var c = Char.ConvertToUtf32(input[index], it); var is_surrogate = Char.IsSurrogatePair(input[index], it); string replacement; if (single_substitutions.TryGetValue(c, out replacement)) { buffer.Append(replacement); } else { bool matched = false; foreach(var range in ranges.Values) { if (c >= range.start && c <= range.end) { var utf8 = new byte[4]; Encoding.UTF8.GetBytes(input[index], it, is_surrogate ? 2 : 1, utf8, 0); buffer.Append(String.Format(range.replacement, c, (int) input[index][it], is_surrogate ? (int) input[index][it + 1] : 0, (int) utf8[0], (int) utf8[1], (int) utf8[2], (int) utf8[3])); matched = true; break; } } if (!matched) { buffer.Append(Char.ConvertFromUtf32(c)); } } } output_frame.Set(index, new SimpleStringish(buffer.ToString())); } result = output_frame; return true; }
protected override bool Run() { if (input == null) { Computation input_lookup = new Lookup(task_master, source_reference, new []{"arg"}, context); input_lookup.Notify(input_result => { if (input_result is Stringish) { input = input_result.ToString(); if (Interlocked.Decrement(ref interlock) == 0) { task_master.Slot(this); } } else { task_master.ReportOtherError(source_reference, "Input argument must be a string."); } }); if (Interlocked.Decrement(ref interlock) > 0) { return false; } } var frame = new MutableFrame(task_master, source_reference, context, container); for(int it = 0; it < input.Length; it++) { frame.Set(it + 1, (long) Char.ConvertToUtf32(input, it)); } result = frame; return true; }
public static int Main(string[] args) { var show_help = false; var use_precompiled = true; var options = new OptionSet { {"p|no-precomp", "do not use precompiled libraries", v => use_precompiled = v == null}, {"h|help", "show this message and exit", v => show_help = v != null} }; List<string> files; try { files = options.Parse(args); } catch (OptionException e) { Console.Error.Write(AppDomain.CurrentDomain.FriendlyName + ": "); Console.Error.WriteLine(e.Message); Console.Error.WriteLine("Try “" + AppDomain.CurrentDomain.FriendlyName + " --help” for more information."); return 1; } if (show_help) { Console.WriteLine("Usage: " + AppDomain.CurrentDomain.FriendlyName + " input.o_0"); Console.WriteLine("Run Flabbergast interactively."); Console.WriteLine(); Console.WriteLine("Options:"); options.WriteOptionDescriptions(Console.Out); return 1; } if (files.Count > 1) { Console.Error.WriteLine("No more than one Flabbergast script may be given."); return 1; } Frame original = null; var assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Repl"), AssemblyBuilderAccess.Run); var module_builder = assembly_builder.DefineDynamicModule("ReplModule"); var unit = new CompilationUnit(module_builder, false); var collector = new ConsoleCollector(); var task_master = new ConsoleTaskMaster(); task_master.AddUriHandler(BuiltInLibraries.INSTANCE); task_master.AddUriHandler(DbUriHandler.INSTANCE); if (use_precompiled) { task_master.AddUriHandler(new LoadPrecompiledLibraries()); } task_master.AddUriHandler(new DynamicallyCompiledLibraries(collector)); if (files.Count == 1) { var parser = Parser.Open(files[0]); var root_type = parser.ParseFile(collector, unit, "REPLRoot"); if (root_type != null) { var computation = (Computation) Activator.CreateInstance(root_type, task_master); computation.Notify(r => original = r as Frame); task_master.Run(); task_master.ReportCircularEvaluation(); } } if (original == null) { original = new MutableFrame(task_master, new NativeSourceReference("REPL"), null, null); } var id = 0; Frame current = original; bool run = true; ConsumeResult update_current = (x) => current = (x as Frame) ?? current; var line_editor = new LineEditor("flabbergast"); var completables = new Completables(); line_editor.AutoCompleteEvent = completables.Handler; string s; while (run && (s = line_editor.Edit(id + "‽ ", "")) != null) { var parser = new Parser("line" + id, s); var run_type = parser.ParseRepl(collector, unit, "REPL" + id++); if (run_type != null) { object result = null; var computation = (Computation) Activator.CreateInstance(run_type, new object[] { task_master, original, current, update_current, (ConsumeResult) (output => result = output), (ConsumeResult) Console.WriteLine }); computation.Notify(r => run = (r as bool?) ?? true); task_master.Run(); if (result != null) { HandleResult(result); } task_master.ReportCircularEvaluation(); } } line_editor.SaveHistory(); return 0; }