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