Yesterday I noticed that std.uri.decodeComponent does not 'preserve' the
nullity of its argument:

   1 void main ()
   2 {
   3    import std.uri;
   4    string s = null;
   5    assert (s is null);
   6    assert (s.decodeComponent);
   7 }

The assertion in line 6 fails. This failure gave rise to a more general
investigation on strings. After some research I found that one
"cannot implicitly convert expression (s) of type string to bool" as in

   1 void main ()
   2 {
   3    string s;
   4    bool b = s;
   5 }

Nonetheless in certain boolean contexts strings convert to bool as here:

   1 void main ()
   2 {
   3    import std.stdio;
   4    string s; // equivalent to s = null
   5    writeln (s ? true : false);
   6    s = "";
   7    writeln (s ? true : false);
   8 }

The code prints

   false
   true

to the console. This lead me to the insight, that in D there are two distinct kinds of empty strings: Those having a ptr which is null and the other. It seems that this ptr nullity not only determines whether the string compares equal to null in an IdentityExpression [1] but also the result of the above mentioned conversion in the boolean context.

I wonder if this distinction is meaningful and---if not---why it is
exposed to the application programmer so prominently.

Then today I found this piece of code

   1 void main ()
   2 {
   3    string s = null;
   4    string t = "";
   5    assert (s is t);
   6 }

which, according to the wording in [1]

"For static and dynamic arrays, identity is defined as referring to
   the same array elements and the same number of elements."

shall succeed but its assertion fails [2]. I anticipate the
implementation compares the ptrs even in the case of zero elements.

A last example of 'deviant behavior' I found is this:

    1 import std.stdio;
    2 import std.file;
    3 void main ()
    4 {
    5    string s = null;
    6    try
    7       mkdir (s);
    8    catch (Exception e)
    9       e.msg.writeln;
   10
   11    s = "";
   12    try
   13       mkdir (s);
   14    catch (Exception e)
   15       e.msg.writeln;
   16 }

Using DMD v2.073.2 the first expression terminates the programm with a
segmentation fault. With 2.074.1 the program prints

   : Bad address
   : No such file or directory

I find that a bit confusing.

[1] https://dlang.org/spec/expression.html#identity_expressions
[2] https://issues.dlang.org/show_bug.cgi?id=17623

Reply via email to