[Issue 5142] writefln should allow no arguments (no formating string)

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Nov 3 04:17:38 PDT 2010


http://d.puremagic.com/issues/show_bug.cgi?id=5142



--- Comment #5 from Witold Baryluk <baryluk at smp.if.uj.edu.pl> 2010-11-03 04:16:05 PDT ---
(In reply to comment #3)
> (In reply to comment #2)
> > > This was a deliberate change.
> > > 
> > > The benefit of writeln is that you can put formatting characters in strings
> > > without having them interpreted as formatting sequences.
> > 
> > And how this resolves my problem? I was talking about writefln behaviour, not
> > writeln!
> 
> writeln is for without formatting, writefln is for with formatting.  writefln
> expects its first argument to be a string, if it's not a string, then you
> aren't calling it properly.

As I written, in D1 it was correct behavior. Additionally it is unnecessary
restriction and inconsistency.

Lets see at some common type of code in C:


  printf("\n");
  printf("a=%d b=%f\n", a, b);
  printf("c=%d d=%f\n", c, d);
  printf("\n");
  printf("\n");


(slightly artificial but I have lots of such or similar printf like statements.
I also saw this frequently in others people code).

It is much cleaner and visually appealing than:

  printf("a=%d b=%f\n\n", a, b);
  printf("c=%d d=%f\n\n\n", c, d);

Because you do not see easily where are additional empty lines, and do not
immiedietly see structure of output.

In D1, one could write:

  writefln();
  writefln("a=%d b=%f", a, b);
  writefln("c=%d d=%f", c, d);
  writefln();
  writefln();


Whit is even nicer. It also simplifies reaaranging and editing arguments.

In D2, one needs to write:

  writeln();
  writefln("a=%d b=%f", a, b);
  writefln("c=%d d=%f", c, d);
  writeln();
  writeln();

Which introduces unnecessary burded to the code.

You also cannot just add parameters, like in D1. Suppose you want to add them
to this:

  writefln("c=%d d=%f", c, d);
  writeln();
  writeln();

Then you add them:

  writefln("c=%d d=%f", c, d);
  writeln("f=%f g=%d", f, g);
  writeln();



But, well, it is incorrect, you need to remember to change writeln to writefln.
D1 was simpler and cleaner.


One of potentiality possibility is to just write writefln("");. But this isn't
so common code.

Not to mention, that one can also use other usefull tricks, without formating
string: writefln("f=", f, " g=", g); but this is beyond scope of this bug
report (and I understand that writefln("s=", s, f), can not work as expected
when s="fff%fff", by pure accident). This also makes porting harder, but will
just leave it (There is almost good solution for this problem, but I understand
that it will need some exception, which isn't good as it can fool beginners).


> in fact, here is a special script I wrote in about 5 seconds which will solve
> all your problems:
> 
> find . -name '*.d' -exec sed 's/writefln()/writeln()/g' {} \;

Not exactly all. What if I have aliases, or imported writefln with other
symbolic name? What if I used other style of brackets, like "writefln ( );"?
Can be resolved with some additional work, or with good IDE (which D lacks),
but why break unnecessarily compatibility (of course there will be other
problems with doing D1->D2 port, but just please make it simpler, not harder).


I have thousands of occurrences of this problems in one of the projects. And
spent about 2 hours fixing it.

>>>...
>> I agree.
I understand, but do not agree with rationale.


Thanks for your time. I know that this should be discussed on mailing list, but
was hoping it is simpler problem.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list