Is std.array.replace supposed to work with char[]?

2011-02-19 Thread Jacob Carlborg

Compiling the following code with DMD 2.052 on Mac OS X:

import std.array;

void main ()
{
char[] a;
char[] b;
a.replace(1, 3, b);
}

Results in the following error:

test.d(7): Error: template std.array.replace(T,Range) if 
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) does not match 
any function template declaration
test.d(7): Error: template std.array.replace(T,Range) if 
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) cannot deduce 
template function from argument types !()(char[],int,int,char[])


What am I doing wrong or isn't std.array.replace supposed to work with 
char[]?


--
/Jacob Carlborg


Re: Is std.array.replace supposed to work with char[]?

2011-02-19 Thread Steven Schveighoffer

On Sat, 19 Feb 2011 16:23:12 -0500, Jacob Carlborg  wrote:


Compiling the following code with DMD 2.052 on Mac OS X:

import std.array;

void main ()
{
 char[] a;
 char[] b;
 a.replace(1, 3, b);
}

Results in the following error:

test.d(7): Error: template std.array.replace(T,Range) if  
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) does not match  
any function template declaration
test.d(7): Error: template std.array.replace(T,Range) if  
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) cannot deduce  
template function from argument types !()(char[],int,int,char[])


What am I doing wrong or isn't std.array.replace supposed to work with  
char[]?


D currently suffers from a form of schizophrenia.  in Phobos, char[] and  
wchar[] (and related const/immutable versions) are *NOT* treated as arrays  
of char and wchar.  They are treated as bi-directional ranges of dchar.   
The compiler does not see it this way, it thinks they are arrays.


The error in your assumption is that Range's element type is char, when in  
fact it is dchar (Range is the type of the second char[]).  So the  
is(ElementType!(char[]) : char) fails.


-Steve


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread Jacob Carlborg

On 2011-02-19 23:20, Steven Schveighoffer wrote:

On Sat, 19 Feb 2011 16:23:12 -0500, Jacob Carlborg  wrote:


Compiling the following code with DMD 2.052 on Mac OS X:

import std.array;

void main ()
{
char[] a;
char[] b;
a.replace(1, 3, b);
}

Results in the following error:

test.d(7): Error: template std.array.replace(T,Range) if
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) does not match
any function template declaration
test.d(7): Error: template std.array.replace(T,Range) if
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) cannot deduce
template function from argument types !()(char[],int,int,char[])

What am I doing wrong or isn't std.array.replace supposed to work with
char[]?


D currently suffers from a form of schizophrenia. in Phobos, char[] and
wchar[] (and related const/immutable versions) are *NOT* treated as
arrays of char and wchar. They are treated as bi-directional ranges of
dchar. The compiler does not see it this way, it thinks they are arrays.

The error in your assumption is that Range's element type is char, when
in fact it is dchar (Range is the type of the second char[]). So the
is(ElementType!(char[]) : char) fails.

-Steve


So you're saying that I can only use dstrings for anything with the same 
template constraint?


--
/Jacob Carlborg


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread Steven Schveighoffer

On Sun, 20 Feb 2011 09:45:36 -0500, Jacob Carlborg  wrote:


On 2011-02-19 23:20, Steven Schveighoffer wrote:

On Sat, 19 Feb 2011 16:23:12 -0500, Jacob Carlborg  wrote:


Compiling the following code with DMD 2.052 on Mac OS X:

import std.array;

void main ()
{
char[] a;
char[] b;
a.replace(1, 3, b);
}

Results in the following error:

test.d(7): Error: template std.array.replace(T,Range) if
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) does not match
any function template declaration
test.d(7): Error: template std.array.replace(T,Range) if
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) cannot deduce
template function from argument types !()(char[],int,int,char[])

What am I doing wrong or isn't std.array.replace supposed to work with
char[]?


D currently suffers from a form of schizophrenia. in Phobos, char[] and
wchar[] (and related const/immutable versions) are *NOT* treated as
arrays of char and wchar. They are treated as bi-directional ranges of
dchar. The compiler does not see it this way, it thinks they are arrays.

The error in your assumption is that Range's element type is char, when
in fact it is dchar (Range is the type of the second char[]). So the
is(ElementType!(char[]) : char) fails.

-Steve


So you're saying that I can only use dstrings for anything with the same  
template constraint?


Yes, dstrings act like arrays according to phobos.  wstrings and strings  
do not.  Some functions have specialized versions for strings, some do  
not.  Expect to be confused...


-Steve


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread Jacob Carlborg

On 2011-02-20 17:12, Steven Schveighoffer wrote:

On Sun, 20 Feb 2011 09:45:36 -0500, Jacob Carlborg  wrote:


On 2011-02-19 23:20, Steven Schveighoffer wrote:

On Sat, 19 Feb 2011 16:23:12 -0500, Jacob Carlborg  wrote:


Compiling the following code with DMD 2.052 on Mac OS X:

import std.array;

void main ()
{
char[] a;
char[] b;
a.replace(1, 3, b);
}

Results in the following error:

test.d(7): Error: template std.array.replace(T,Range) if
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) does not match
any function template declaration
test.d(7): Error: template std.array.replace(T,Range) if
(isDynamicArray!(Range) && is(ElementType!(Range) : T)) cannot deduce
template function from argument types !()(char[],int,int,char[])

What am I doing wrong or isn't std.array.replace supposed to work with
char[]?


D currently suffers from a form of schizophrenia. in Phobos, char[] and
wchar[] (and related const/immutable versions) are *NOT* treated as
arrays of char and wchar. They are treated as bi-directional ranges of
dchar. The compiler does not see it this way, it thinks they are arrays.

The error in your assumption is that Range's element type is char, when
in fact it is dchar (Range is the type of the second char[]). So the
is(ElementType!(char[]) : char) fails.

-Steve


So you're saying that I can only use dstrings for anything with the
same template constraint?


Yes, dstrings act like arrays according to phobos. wstrings and strings
do not. Some functions have specialized versions for strings, some do
not. Expect to be confused...

-Steve


I'm confused about how someone can implement a library like this. Every 
time I try to use D2 it's just a PITA to use. I've used D1 and Tango for 
several years and had no problem with that.


I assume this has been discussed, did that resolve in any plans to solve 
this?


--
/Jacob Carlborg


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread bearophile
Jacob Carlborg:

> Every time I try to use D2 it's just a PITA to use. I've used D1 and Tango 
> for 
> several years and had no problem with that.

I use this thread to ask regarding one specific little problem I have with 
strings. I want to generate a random string of AB using the array, map, etc, 
this looks like a possible implementation (in std.random there is no choice() 
function yet):


import std.stdio, std.random, std.string, std.algorithm, std.range;
void main() {
auto m = map!((i){ return "AB"[uniform(0,2)]; })(iota(10));
string s = join(array(m));
writeln(s);
}


It gives this error:
...\dmd\src\phobos\std\array.d(62): Error: result[i] isn't mutable
test.d(5): Error: template instance 
std.array.array!(Map!(__dgliteral1,Iota!(int,uint))) error instantiating

What's the right way to write it in D?

The same code in Python2.x:

from random import choice
s = "".join(choice("AB") for _ in xrange(10))
print s

Bye,
bearophile


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread Steven Schveighoffer
On Sun, 20 Feb 2011 14:51:10 -0500, bearophile   
wrote:



Jacob Carlborg:

Every time I try to use D2 it's just a PITA to use. I've used D1 and  
Tango for

several years and had no problem with that.


I use this thread to ask regarding one specific little problem I have  
with strings. I want to generate a random string of AB using the array,  
map, etc, this looks like a possible implementation (in std.random there  
is no choice() function yet):



import std.stdio, std.random, std.string, std.algorithm, std.range;
void main() {
auto m = map!((i){ return "AB"[uniform(0,2)]; })(iota(10));
string s = join(array(m));
writeln(s);
}


It gives this error:
...\dmd\src\phobos\std\array.d(62): Error: result[i] isn't mutable
test.d(5): Error: template instance  
std.array.array!(Map!(__dgliteral1,Iota!(int,uint))) error instantiating


What's the right way to write it in D?

The same code in Python2.x:

from random import choice
s = "".join(choice("AB") for _ in xrange(10))
print s


Just a blind guess, I have not tested, but maybe it's because the compiler  
is using const(char) as the return type for your delegate literal since  
you never specify one?


-Steve


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread Steven Schveighoffer

On Sun, 20 Feb 2011 13:40:08 -0500, Jacob Carlborg  wrote:




I'm confused about how someone can implement a library like this. Every  
time I try to use D2 it's just a PITA to use. I've used D1 and Tango for  
several years and had no problem with that.


Strings are a sore spot for me, I think the current implementation is a  
hack which leaves much to be desired.  However, it seems that Andrei  
believes the current implementation is not only decent, but actually  
better than any alternative.


I assume this has been discussed, did that resolve in any plans to solve  
this?


I am, in my spare time, working on a way to represent strings that allows  
strings to be what they are and arrays of chars or wchars to be what they  
are.  It is not finished yet, but I've put forth a couple incomplete  
examples.  Search for [review] on the D news group.


Things have gotten quite more complex when I realized that dchar is  
actually not the most natural "element" of a string, since a dchar doesn't  
represent a visible character (or one that a human would interpret as a  
single character) and also that the exact same string can be sometimes  
represented by two distinct sequences of dchars.  When I can finish the  
proposed change, I will probably try integrating it with Phobos to see how  
well it works.


-Steve


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread Jacob Carlborg

On 2011-02-20 21:30, Steven Schveighoffer wrote:

On Sun, 20 Feb 2011 13:40:08 -0500, Jacob Carlborg  wrote:




I'm confused about how someone can implement a library like this.
Every time I try to use D2 it's just a PITA to use. I've used D1 and
Tango for several years and had no problem with that.


Strings are a sore spot for me, I think the current implementation is a
hack which leaves much to be desired. However, it seems that Andrei
believes the current implementation is not only decent, but actually
better than any alternative.


I assume this has been discussed, did that resolve in any plans to
solve this?


I am, in my spare time, working on a way to represent strings that
allows strings to be what they are and arrays of chars or wchars to be
what they are. It is not finished yet, but I've put forth a couple
incomplete examples. Search for [review] on the D news group.

Things have gotten quite more complex when I realized that dchar is
actually not the most natural "element" of a string, since a dchar
doesn't represent a visible character (or one that a human would
interpret as a single character) and also that the exact same string can
be sometimes represented by two distinct sequences of dchars. When I can
finish the proposed change, I will probably try integrating it with
Phobos to see how well it works.

-Steve


Oh, I remember that thread(s). It got so overly complicated so I stopped 
reading it.


--
/Jacob Carlborg


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread bearophile
Steven Schveighoffer:

> Just a blind guess, I have not tested, but maybe it's because the compiler  
> is using const(char) as the return type for your delegate literal since  
> you never specify one?

Right, this works:

import std.stdio, std.random, std.string, std.algorithm, std.range;
void main() {
string s = array(map!((i){ return cast(char)("AB"[uniform(0,2)]); 
})(iota(10))).idup;
writeln(s);
}

Thank you, bye,
bearophile


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread bearophile
http://d.puremagic.com/issues/show_bug.cgi?id=5630


Re: Is std.array.replace supposed to work with char[]?

2011-02-20 Thread Steven Schveighoffer

On Sun, 20 Feb 2011 17:10:28 -0500, Jacob Carlborg  wrote:


On 2011-02-20 21:30, Steven Schveighoffer wrote:

On Sun, 20 Feb 2011 13:40:08 -0500, Jacob Carlborg  wrote:




I'm confused about how someone can implement a library like this.
Every time I try to use D2 it's just a PITA to use. I've used D1 and
Tango for several years and had no problem with that.


Strings are a sore spot for me, I think the current implementation is a
hack which leaves much to be desired. However, it seems that Andrei
believes the current implementation is not only decent, but actually
better than any alternative.


I assume this has been discussed, did that resolve in any plans to
solve this?


I am, in my spare time, working on a way to represent strings that
allows strings to be what they are and arrays of chars or wchars to be
what they are. It is not finished yet, but I've put forth a couple
incomplete examples. Search for [review] on the D news group.

Things have gotten quite more complex when I realized that dchar is
actually not the most natural "element" of a string, since a dchar
doesn't represent a visible character (or one that a human would
interpret as a single character) and also that the exact same string can
be sometimes represented by two distinct sequences of dchars. When I can
finish the proposed change, I will probably try integrating it with
Phobos to see how well it works.

-Steve


Oh, I remember that thread(s). It got so overly complicated so I stopped  
reading it.


Yeah, UTF is so overly complicated, it's difficult to properly implement  
it.


-Steve


Re: Is std.array.replace supposed to work with char[]?

2011-02-21 Thread Lars T. Kyllingstad
On Sun, 20 Feb 2011 15:23:29 -0500, Steven Schveighoffer wrote:

> On Sun, 20 Feb 2011 14:51:10 -0500, bearophile
>  wrote:
> 
>> Jacob Carlborg:
>>
>>> Every time I try to use D2 it's just a PITA to use. I've used D1 and
>>> Tango for
>>> several years and had no problem with that.
>>
>> I use this thread to ask regarding one specific little problem I have
>> with strings. I want to generate a random string of AB using the array,
>> map, etc, this looks like a possible implementation (in std.random
>> there is no choice() function yet):
>>
>>
>> import std.stdio, std.random, std.string, std.algorithm, std.range;
>> void main() {
>> auto m = map!((i){ return "AB"[uniform(0,2)]; })(iota(10)); string
>> s = join(array(m));
>> writeln(s);
>> }
>>
>>
>> It gives this error:
>> ...\dmd\src\phobos\std\array.d(62): Error: result[i] isn't mutable
>> test.d(5): Error: template instance
>> std.array.array!(Map!(__dgliteral1,Iota!(int,uint))) error
>> instantiating
>>
>> What's the right way to write it in D?
>>
>> The same code in Python2.x:
>>
>> from random import choice
>> s = "".join(choice("AB") for _ in xrange(10)) print s
> 
> Just a blind guess, I have not tested, but maybe it's because the
> compiler is using const(char) as the return type for your delegate
> literal since you never specify one?

It's probably using immutable(char) since that's the element type of "AB".

-Lars