public static (bool running, ActionProgram <Unit> newProgram) Process(
            string command,
            Writer writer,
            ActionProgram <Unit> program)
        {
            if (command.Any())
            {
                switch (command[0])
                {
                case 'w':
                case 'W':
                    return(true, Actions.bindInvoke(() => writer.Write(command.Substring(1)), program));

                case 'u':
                case 'U':
                    return(true, Actions.unbind(program));

                case 'a':
                case 'A':
                    return(false, Actions.abort);
                }
            }

            return(false, program);
        }
        public static void Main(string[] args)
        {
            var value   = "initial";
            var program = Actions.abort;
            var writer  = new Writer(s => value = s);
            var running = true;

            do
            {
                (running, program) = Process(Console.ReadLine(), writer, program);
            } while (running);

            Actions.interpret(program);
            Console.WriteLine(value);
        }