On Thu, Jan 17, 2013 at 07:12:56PM +0100, Andrej Mitrovic wrote:
> On 1/16/13, H. S. Teoh <[email protected]> wrote:
> >             // Wait -- what? What on earth are %i, %j, %k, and %l?!
> >             writeln("%i", s);       // Hmm, prints "i"!
> >             writeln("%j", s);       // Hmm, prints "j"!
> 
> I wish we could write string specifiers rather than char specifiers.
> You can invent your own char specifiers but they're still going to be
> hard to understand at the call site. I would prefer:
> 
> >             writefln("{fullname}", s);
> >             writefln("{type}", s);
> 
> And have:
> 
> void toString(scope void delegate(const(char)[]) sink,
>                   FormatSpec!string fmt) const
> {
>         switch(fmt.spec)
>         {
>             case "fullname"
>                 break;
>             case "type":
>                 break;
>         }
> }
> 
> We could invent this in our own library but it won't be usable with
> existing format and write functions.

What would *really* be nice is if we extended the current format
specifiers to be able to deal with named parameters and custom
modifiers, for example:

        struct Actor {
                string name;
                void toString(scope void delegate(const(char)[]) sink,
                                FormatSpec!string fmt) const
                {
                        switch (fmt.spec)
                        {
                                case "thename":
                                        sink("the ");
                                        sink(name);
                                        break;
                                case "Thename":
                                        sink("The ");
                                        sink(name);
                                        break;
                                case "name":
                                        sink(name);
                                        break;
                                case "Name":
                                        assert(name.length > 0);
                                        sink(toUpper(name[0]));
                                        if (name.length > 1)
                                                sink(name[1..$]);
                                        break;
                                default:
                                        ...
                        }
                }
        }

        auto x = Actor("man");
        auto y = Actor("dog");
        auto z = Actor("cats");

        writeln("%{subj:Thename} is feeding %{obj:thename}.", [
                "subj": x,
                "obj": y
        ]);
        // Outputs: "The man is feeding the dog."

        writeln("%{subj:Name} don't like %{obj:thename}.", [
                "subj": z,
                "obj": x
        ]);
        // Outputs: "Cats don't like the man."

        writeln("But %{subj:thename} likes %{obj:name}.", [
                "subj": y,
                "obj": z
        ]);
        // Outputs: "But the dog likes cats."


T

-- 
A mathematician is a device for turning coffee into theorems. -- P. Erdos

Reply via email to