digitalmars.D.learn - D2 map trouble
- Nick Sabalausky (17/17) Jul 27 2010 Trying to convert some D1 code to D2:
- Nick Sabalausky (6/23) Jul 27 2010 In my particular case, I've just switched to regex:
- Dmitry Olshansky (6/39) Jul 27 2010 AFAIK weird compiler bug. See also thread about std.find which involves
- Philippe Sigaud (22/52) Jul 28 2010 It's an error I get on a weekly basis :-(
- Nick Sabalausky (12/23) Jul 28 2010 *sigh*, If D allowed something like this:
- Pelle (4/21) Jul 28 2010 This is a compiler bug. Easy workaround:
- Philippe Sigaud (3/6) Jul 28 2010 Is it on bugzilla?
- bearophile (5/6) Jul 28 2010 If not present you can add it here:
Trying to convert some D1 code to D2: On 2.047, I'm trying to do this: import std.string; void foo(string str) { str = std.algorithm.map!( (char a) { return inPattern(a, [digits, letters])? a : '_'; } )(str); } And I'm getting: delegate std.algorithm.__dgliteral1 cannot access frame of function __dgliteral1 What's going on? How do I do it right? I figure I probably have some sort of problem with strings being immutable(char)[] instead of char[], but it doesn't look like that's the issue it's complaining about. Also, in this particular case, I'm not concerned about multi-unit UTF-8 characters.
Jul 27 2010
"Nick Sabalausky" <a a.a> wrote in message news:i2no7g$euv$1 digitalmars.com...Trying to convert some D1 code to D2: On 2.047, I'm trying to do this: import std.string; void foo(string str) { str = std.algorithm.map!( (char a) { return inPattern(a, [digits, letters])? a : '_'; } )(str); } And I'm getting: delegate std.algorithm.__dgliteral1 cannot access frame of function __dgliteral1 What's going on? How do I do it right? I figure I probably have some sort of problem with strings being immutable(char)[] instead of char[], but it doesn't look like that's the issue it's complaining about. Also, in this particular case, I'm not concerned about multi-unit UTF-8 characters.In my particular case, I've just switched to regex: import std.regex; str = replace(str, regex("[^a-zA-Z0-9]"), "_"); But I am still curious to hear what exactly was going on with map.
Jul 27 2010
On 28.07.2010 3:06, Nick Sabalausky wrote:"Nick Sabalausky"<a a.a> wrote in message news:i2no7g$euv$1 digitalmars.com...AFAIK weird compiler bug. See also thread about std.find which involves the problem with map http://www.digitalmars.com/d/archives/digitalmars/D/Improving_std.algorithm.find_113545.html#N113558 -- Dmitry OlshanskyTrying to convert some D1 code to D2: On 2.047, I'm trying to do this: import std.string; void foo(string str) { str = std.algorithm.map!( (char a) { return inPattern(a, [digits, letters])? a : '_'; } )(str); } And I'm getting: delegate std.algorithm.__dgliteral1 cannot access frame of function __dgliteral1 What's going on? How do I do it right? I figure I probably have some sort of problem with strings being immutable(char)[] instead of char[], but it doesn't look like that's the issue it's complaining about. Also, in this particular case, I'm not concerned about multi-unit UTF-8 characters.In my particular case, I've just switched to regex: import std.regex; str = replace(str, regex("[^a-zA-Z0-9]"), "_"); But I am still curious to hear what exactly was going on with map.
Jul 27 2010
On Wed, Jul 28, 2010 at 01:06, Nick Sabalausky <a a.a> wrote:"Nick Sabalausky" <a a.a> wrote in message news:i2no7g$euv$1 digitalmars.com...It's an error I get on a weekly basis :-( Either returning a map with an anonymous function or using it as you do. I gather the Map template in std.algo is unable to have access to your closure literal, as it is inside foo. A possible workaround is having the anonymous function as a standard, named, free function and use this inside foo. But in that case, why have anonymous functions in D? Another is to use 'string functions', I think. I can test right now, but something like might work: void foo(string str) { str = std.algorithm.map!q{ inPattern(a, [digits, letters])? a : '_'; } (str); } But then I guess inPattern must be visible from std.algorithm. So my current conclusion it that it's more a limitation of anonymous closures than a limitation in map. PhilippeTrying to convert some D1 code to D2: On 2.047, I'm trying to do this: import std.string; void foo(string str) { str = std.algorithm.map!( (char a) { return inPattern(a, [digits, letters])? a : '_'; } )(str); } And I'm getting: delegate std.algorithm.__dgliteral1 cannot access frame of function __dgliteral1 What's going on? How do I do it right? I figure I probably have some sort of problem with strings being immutable(char)[] instead of char[], but it doesn't look like that's the issue it's complaining about. Also, in this particular case, I'm not concerned about multi-unit UTF-8 characters.In my particular case, I've just switched to regex: import std.regex; str = replace(str, regex("[^a-zA-Z0-9]"), "_"); But I am still curious to hear what exactly was going on with map.
Jul 28 2010
"Philippe Sigaud" <philippe.sigaud gmail.com> wrote in message news:mailman.32.1280323222.13841.digitalmars-d-learn puremagic.com...void foo(string str) { str = std.algorithm.map!q{ inPattern(a, [digits, letters])? a : '_'; } (str); } But then I guess inPattern must be visible from std.algorithm. So my current conclusion it that it's more a limitation of anonymous closures than a limitation in map.*sigh*, If D allowed something like this: mixin string map() { return "code here"; } map(); As an alternative to or intead of this: string map() { return "code here"; } mixin(map()); As I've suggested before (it only got accepted for template mixins, not string mixins), then map's string-style predicates could be made to be evaluated in the proper context without screwing up map's standard interface by requiring it to be called with "mixin(...)".
Jul 28 2010
On 07/28/2010 12:57 AM, Nick Sabalausky wrote:Trying to convert some D1 code to D2: On 2.047, I'm trying to do this: import std.string; void foo(string str) { str = std.algorithm.map!( (char a) { return inPattern(a, [digits, letters])? a : '_'; } )(str); } And I'm getting: delegate std.algorithm.__dgliteral1 cannot access frame of function __dgliteral1 What's going on? How do I do it right? I figure I probably have some sort of problem with strings being immutable(char)[] instead of char[], but it doesn't look like that's the issue it's complaining about. Also, in this particular case, I'm not concerned about multi-unit UTF-8 characters.This is a compiler bug. Easy workaround: auto fn = (char a) { ... }; str = map!fn(str);
Jul 28 2010
On Wed, Jul 28, 2010 at 16:51, Pelle <pelle.mansson gmail.com> wrote:This is a compiler bug. Easy workaround: auto fn = (char a) { ... }; str = map!fn(str);Is it on bugzilla? Philippe
Jul 28 2010
Philippe Sigaud:Is it on bugzilla?If not present you can add it here: http://d.puremagic.com/issues/show_bug.cgi?id=4264 Bye, bearophile
Jul 28 2010