Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
July 27, 2010 D2 map trouble | ||||
---|---|---|---|---|
| ||||
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. |
July 27, 2010 Re: D2 map trouble | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nick Sabalausky | "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. |
July 27, 2010 Re: D2 map trouble | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nick Sabalausky | On 28.07.2010 3:06, Nick Sabalausky wrote: > "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. > > > 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 Olshansky |
July 28, 2010 Re: D2 map trouble | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nick Sabalausky Attachments:
| 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...
> > 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.
>
>
>
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.
Philippe
|
July 28, 2010 Re: D2 map trouble | ||||
---|---|---|---|---|
| ||||
Posted in reply to Nick Sabalausky | 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);
|
July 28, 2010 Re: D2 map trouble | ||||
---|---|---|---|---|
| ||||
Posted in reply to Pelle Attachments:
| 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
|
July 28, 2010 Re: D2 map trouble | ||||
---|---|---|---|---|
| ||||
Posted in reply to Philippe Sigaud | 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 |
July 28, 2010 Re: D2 map trouble | ||||
---|---|---|---|---|
| ||||
Posted in reply to Philippe Sigaud | "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(...)". |
Copyright © 1999-2021 by the D Language Foundation