Thread overview
D2 map trouble
Jul 27, 2010
Nick Sabalausky
Jul 27, 2010
Nick Sabalausky
Jul 27, 2010
Dmitry Olshansky
Jul 28, 2010
Philippe Sigaud
Jul 28, 2010
Nick Sabalausky
Jul 28, 2010
Pelle
Jul 28, 2010
Philippe Sigaud
Jul 28, 2010
bearophile
July 27, 2010
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
"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
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
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
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
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
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
"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(...)".