On Wed, Jul 28, 2010 at 01:06, Nick Sabalausky <a...@a.a> wrote: > "Nick Sabalausky" <a...@a.a> wrote in message > news:i2no7g$eu...@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