digitalmars.D.learn - Best way to make Until! into string
- Jonathan M Davis (18/18) Jun 21 2010 Okay. If you call until like so
- Jonathan M Davis (7/31) Jun 21 2010 I should say that array() used to work if you used to!string on the resu...
- Philippe Sigaud (10/30) Jun 22 2010 I got this error also while installing 2.047. I think the new definition...
- Jonathan M Davis (13/26) Jun 22 2010 I guess that would be one downside for things like forward range not bei...
- div0 (7/25) Jun 22 2010 Could be wrong, but strings aren't (conceptually) arrays any more.
- Jonathan M Davis (18/49) Jun 22 2010 As I understand it, they're definitely arrays. It's just that they becau...
- div0 (33/82) Jun 22 2010 I think we're talking about the same thing but with slightly different
- Jonathan M Davis (16/22) Jun 22 2010 [... snip of UTF-8 stuff ...]
- div0 (15/24) Jun 23 2010 Oh it's not through choice; After 2.028 there was a whole string of
- bearophile (4/6) Jun 23 2010 What do you mean?
- div0 (15/21) Jun 24 2010 curly brace initialisers:
- Jonathan M Davis (6/17) Jun 23 2010 TPDL has a great section on Unicode and strings. I definitely think that...
Okay. If you call until like so str.until('\"') you get a Until!(pred,string,char). I want to turn that into a string. array() doesn't seem to do the trick right now. It used to work, but now it gives me main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) does not match any function template declaration main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) cannot deduce template function from argument types !()(Until! (pred,string,char)) to!string just converts it into a string with the Until! stuff being included in the string rather than giving me the actual result, so that doesn't work. So, what is the correct and preferred way to convert the result of Until! to as string when you were searching on a string in the first place? The std.algorithm functions are definitely nice, but they have tendancy to return hard-to-use types. - Jonathan M Davis
Jun 21 2010
Jonathan M Davis wrote:Okay. If you call until like so str.until('\"') you get a Until!(pred,string,char). I want to turn that into a string. array() doesn't seem to do the trick right now. It used to work, but now it gives me main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) does not match any function template declaration main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) cannot deduce template function from argument types !()(Until! (pred,string,char)) to!string just converts it into a string with the Until! stuff being included in the string rather than giving me the actual result, so that doesn't work. So, what is the correct and preferred way to convert the result of Until! to as string when you were searching on a string in the first place? The std.algorithm functions are definitely nice, but they have tendancy to return hard-to-use types. - Jonathan M DavisI should say that array() used to work if you used to!string on the result, but in either case, it won't compile for me now with DMD 2.047 (it did with DMD 2.046) if I feed the result of until() to array(). Maybe it's a bug, or maybe I've just been doing the conversion in the wrong way in the first place, but I don't know how to do it now. - Jonathan M Davis
Jun 21 2010
On Tue, Jun 22, 2010 at 08:38, Jonathan M Davis <jmdavisProg gmail.com>wrote:Jonathan M Davis wrote:I got this error also while installing 2.047. I think the new definition of a forward range asks for a .save() member. And I guess some ranges where not converted. std.range.repeat is one, like cycle. It seems like Until is another. Maybe for repeat/cycle that was a conscious decision? I'll file a bug anyway. http://d.puremagic.com/issues/show_bug.cgi?id=4362 http://d.puremagic.com/issues/show_bug.cgi?id=4363 PhilippeOkay. If you call until like so str.until('\"') you get a Until!(pred,string,char). I want to turn that into a string. array() doesn't seem to do the trick right now. It used to work, but now it gives me main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) does not match any function template declaration main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) cannot deduce template function from argument types !()(Until! (pred,string,char)) I should say that array() used to work if you used to!string on theresult, but in either case, it won't compile for me now with DMD 2.047 (it did with DMD 2.046) if I feed the result of until() to array(). Maybe it's a bug, or maybe I've just been doing the conversion in the wrong way in the first place, but I don't know how to do it now.
Jun 22 2010
Philippe Sigaud wrote:I guess that would be one downside for things like forward range not being interfaces. I guess that that means that when you intend a particular range struct or class to be a particular type of range or ranges that you should probably include unittests to verify that they are. Well, as Andrei said in TDPL, too many unittests is almost enough. In any case, it was hard enough figuring out how to make the result of until() useable in the first place. It's good to know that my solution of using array() is almost certainly still supposed to work. It may be something that I'll have to patch in my local phobos if I want my current program to be of much use... Thanks for the help. - Jonathan M DavisI got this error also while installing 2.047. I think the new definition of a forward range asks for a .save() member. And I guess some ranges where not converted. std.range.repeat is one, like cycle. It seems like Until is another. Maybe for repeat/cycle that was a conscious decision? I'll file a bug anyway. http://d.puremagic.com/issues/show_bug.cgi?id=4362 http://d.puremagic.com/issues/show_bug.cgi?id=4363 Philippe
Jun 22 2010
On 22/06/2010 07:29, Jonathan M Davis wrote:Okay. If you call until like so str.until('\"') you get a Until!(pred,string,char). I want to turn that into a string. array() doesn't seem to do the trick right now. It used to work, but now it gives me main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) does not match any function template declaration main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) cannot deduce template function from argument types !()(Until! (pred,string,char)) to!string just converts it into a string with the Until! stuff being included in the string rather than giving me the actual result, so that doesn't work. So, what is the correct and preferred way to convert the result of Until! to as string when you were searching on a string in the first place? The std.algorithm functions are definitely nice, but they have tendancy to return hard-to-use types. - Jonathan M DavisCould be wrong, but strings aren't (conceptually) arrays any more. They are bidirectional ranges which is why the array call doesn't work. Though how you actually get a string back I don't know. -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk
Jun 22 2010
div0 wrote:On 22/06/2010 07:29, Jonathan M Davis wrote:As I understand it, they're definitely arrays. It's just that they because they're arrays of char (well immutable(char)) but are read as unicode code points, the type of the array isn't necessarily a full character and code that needs to read code points has to treat them as a range of code points rather than an array of char. So, whether you treat them as an array depends a bit on what you're doing with them. As long as you're not actually trying to intrepret them as code points, however, they're the same as any other array.Okay. If you call until like so str.until('\"') you get a Until!(pred,string,char). I want to turn that into a string. array() doesn't seem to do the trick right now. It used to work, but now it gives me main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) does not match any function template declaration main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) cannot deduce template function from argument types !()(Until! (pred,string,char)) to!string just converts it into a string with the Until! stuff being included in the string rather than giving me the actual result, so that doesn't work. So, what is the correct and preferred way to convert the result of Until! to as string when you were searching on a string in the first place? The std.algorithm functions are definitely nice, but they have tendancy to return hard-to-use types. - Jonathan M DavisCould be wrong, but strings aren't (conceptually) arrays any more.They are bidirectional ranges which is why the array call doesn't work. Though how you actually get a string back I don't know.I wasn't clear enough. I was basically doing this: to!string(array(str.until('\"'))); As I understand it, that forces the Until type into an array of whatever type (probably char[]) and then to!string would convert it to immutable(char)[]. It's the cleanest way that I found (well, actually, the only way I think) to convert the result of until() to string in spite of the fact that it was called with a string in the first place. It's one of the prices of flexibility, I guess. - Jonathan M Davis
Jun 22 2010
On 22/06/2010 19:26, Jonathan M Davis wrote:div0 wrote:I think we're talking about the same thing but with slightly different terminology. As far as I understand it, for a string (I'm specifically talking immutable(char)) each byte is not a 'code point' or a character. It may take multiple bytes to encode a 'code point' and it can take multiple code points to encode a character. (Or maybe it's just 2 code points at most, I'm not clear on the details of combining characters) So it's never valid to randomly access the bytes in a utf-8 string. If you take a random byte out of string, you might be getting only one byte out a multi byte encoded 'code point'. (I have the vague recollection that each byte of an encoded 'code point' is itself clearly defined to be an invalid utf 'code point' so you can't accidentally go using one) Which is bad and therefore you should never conceptually treat a string as an array. (To me array implies random access and that's you are going to be doing such). When you have an encoded 'code point' in a utf-8 string you have to start mucking about with bit shifting I believe to decode it. Of course strings are arrays, but I think this is just an implementation detail and might be/probably should be changed in future. Andrei was quite emphatic in one of his posts that strings would from now on be bidirectional ranges. If you decode a string to dstring then you have a list of code points. I'm not clear on whether randomly accessing a dstring is a good idea or bad idea though. If any of that seems wrong please let me know. I'm a bit hazy on the finer points of utf myself and I don't want to carry on making invalid assumptions about it.On 22/06/2010 07:29, Jonathan M Davis wrote:As I understand it, they're definitely arrays. It's just that they because they're arrays of char (well immutable(char)) but are read as unicode code points, the type of the array isn't necessarily a full character and code that needs to read code points has to treat them as a range of code points rather than an array of char. So, whether you treat them as an array depends a bit on what you're doing with them. As long as you're not actually trying to intrepret them as code points, however, they're the same as any other array.Okay. If you call until like so str.until('\"') you get a Until!(pred,string,char). I want to turn that into a string. array() doesn't seem to do the trick right now. It used to work, but now it gives me main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) does not match any function template declaration main.d(47): Error: template std.array.array(Range) if (isForwardRange! (Range)) cannot deduce template function from argument types !()(Until! (pred,string,char)) to!string just converts it into a string with the Until! stuff being included in the string rather than giving me the actual result, so that doesn't work. So, what is the correct and preferred way to convert the result of Until! to as string when you were searching on a string in the first place? The std.algorithm functions are definitely nice, but they have tendancy to return hard-to-use types. - Jonathan M DavisCould be wrong, but strings aren't (conceptually) arrays any more.Sry, means nothing to me. I'm still using dmd 2.028. :( -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.ukThey are bidirectional ranges which is why the array call doesn't work. Though how you actually get a string back I don't know.I wasn't clear enough. I was basically doing this: to!string(array(str.until('\"'))); As I understand it, that forces the Until type into an array of whatever type (probably char[]) and then to!string would convert it to immutable(char)[]. It's the cleanest way that I found (well, actually, the only way I think) to convert the result of until() to string in spite of the fact that it was called with a string in the first place. It's one of the prices of flexibility, I guess. - Jonathan M Davis
Jun 22 2010
div0 wrote:[... snip of UTF-8 stuff ...]The UTF char stuff is all painfully complicated, and I _think_ that I more or less understand it, but I suspect that I don't understand it all that well. It would be nice if the there were a page in the docs somewhere that really explained it well.[... snip of until() stuff ...]Sry, means nothing to me. I'm still using dmd 2.028. :(Oh my, you caveman! ;) I'd have to go look at all of the changelogs to even have a clue of what's been changed since then. Oh well, I guess that it means that you don't have to worry about stuff changing on you each upgrade by sticking to the same version for a while, and I suppose that there could be a specific bug holding you back. But you're going to have to upgrade eventually. Personally, I usually stick to the latest version or possibly one older if I'm slow getting the new one set up, but to each their own, I suppose. - Jonathan M Davis
Jun 22 2010
On 22/06/2010 23:05, Jonathan M Davis wrote:Oh my, you caveman! ;) I'd have to go look at all of the changelogs to even have a clue of what's been changed since then. Oh well, I guess that it means that you don't have to worry about stuff changing on you each upgrade by sticking to the same version for a while, and I suppose that there could be a specific bug holding you back. But you're going to have to upgrade eventually. Personally, I usually stick to the latest version or possibly one older if I'm slow getting the new one set up, but to each their own, I suppose. - Jonathan M DavisOh it's not through choice; After 2.028 there was a whole string of releases with compiler bugs I couldn't find work arounds for. Then I got bored of trying for a while, and now with 2.047 I've been bitten by the removal of struct initialisers. CTFE isn't a full replacement for them yet. I could probably rewrite my code to get round it, but I can't really be bothered. I don't really want to spend the time to do that then find out there's another bug/feature that borks compilation. Luckily I don't use much of phobos so once the compiler is sorted it shouldn't take long to update all my code. And who knows by that point I might even have something worth releasing! -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.uk
Jun 23 2010
div0:and now with 2.047 I've been bitten by the removal of struct initialisers.What do you mean? Bye, bearophile
Jun 23 2010
On 23/06/2010 23:14, bearophile wrote:div0:curly brace initialisers: struct c4 { float[4] _vals; } c4 dat = { [0,0,0,0] }; Needs to be changed to use a constructor, but CTFE can't assign to the _vals array at the moment in the constructor. It'll get fixed sooner or later, so I'd rather wait than recode every thing to work around it; only to change it all back when CTFE gets better. And also not using an array makes generalising the number of _vals a huge pain. -- My enormous talent is exceeded only by my outrageous laziness. http://www.ssTk.co.ukand now with 2.047 I've been bitten by the removal of struct initialisers.What do you mean? Bye, bearophile
Jun 24 2010
Jonathan M Davis wrote:div0 wrote:TPDL has a great section on Unicode and strings. I definitely think that I understand the situation better now. Unicode is a pain to deal with, but D deals with it really well over all. I'm certainly more comfortable dealing with unicode in D than in most languages. - Jonathan M Davis[... snip of UTF-8 stuff ...]The UTF char stuff is all painfully complicated, and I _think_ that I more or less understand it, but I suspect that I don't understand it all that well. It would be nice if the there were a page in the docs somewhere that really explained it well.
Jun 23 2010