Example #1
0
        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;
            }
        }
Example #2
0
        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;
        }
Example #3
0
        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;
        }
Example #4
0
        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;
        }
Example #5
0
        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;
        }