D2 map trouble

Philippe Sigaud philippe.sigaud at gmail.com
Wed Jul 28 06:20:18 PDT 2010


On Wed, Jul 28, 2010 at 01:06, Nick Sabalausky <a at a.a> wrote:

> "Nick Sabalausky" <a at a.a> wrote in message
> news:i2no7g$euv$1 at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d-learn/attachments/20100728/01c09ed5/attachment.html>


More information about the Digitalmars-d-learn mailing list