[llvm-dev] RFC: General purpose type-safe formatting library
Zachary Turner via llvm-dev
llvm-dev at lists.llvm.org
Wed Oct 12 09:04:06 PDT 2016
On Tue, Oct 11, 2016 at 11:29 PM Chandler Carruth <chandlerc at google.com>
wrote:
> I'm generally favorable on the core idea of having a type-safe and
> friendly format-string-like formatting utility. Somewhat minor comments
> below:
>
> On Tue, Oct 11, 2016 at 6:22 PM Zachary Turner via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
> The high level design of my library is borrowed heavily from C#.
>
>
> My only big hesitation here is that the substitution specifier seems
> heavily influenced by C#. I'd prefer to model this after a format string
> syntax folks are fairly familiar with. IMO, Python's is probably the best
> bet here and has had a lot of hammering on it over the years. So I'd
> suggest that the pattern syntax be mapped to be as similar to Python's as
> possible or at least built on top of it.
>
A lot of Python's substitution rules only make sense in the context of a
language with reflection. For example, you can write "{0.x}".format(obj)
in python which means to print obj.x. If you take all of that out of the
equation, Python and C#'s formatting syntax is honestly very similar. They
both use curly brace delimeters, they both index by number, they both use a
: separator.
The biggest difference is that Python smashes ALL of the formatting info
into a single field (i.e. everything after the colon), whereas C# separates
this into two fields as follows:
{index[,align][:options]}
I prefer this approach because it draws a firm line between the
type-specific formatting (e.g. the options field) and universal formatting
(e.g. the alignment field). I did find some potentially useful tidbits in
Python's specification that seem useful and which C# does not support
though. For example, the ability to center a field, and the ability to
specify the padding character rather than always using spaces. We could
possibly integrate some of those ideas.
>
> 1. os << format_string("Test"); // writes "test"
> 2. os << format_string("{0}", 7); // writes "7"
>
>
> The "<< format_string(..." is ... really verbose for me. It also makes me
> strongly feel like this produces a string rather than a streamable entity.
>
> I'm not a huge fan of streaming, but if we want to go this route, I'd very
> much like to keep the syntax short and sweet. "format" is pretty great for
> that. If this is going to fully subsume its use cases, can we eventually
> get that to be the name?
>
> (While I don't like streaming, I'm not trying to fight that battle here...)
>
Just for the record, I'm not a fan either. See my response to Sean Silva
for some alternatives.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161012/8f090e95/attachment.html>
More information about the llvm-dev
mailing list