Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

std.functional.memoize with types and static opCall #9911

Open
dlangBugzillaToGithub opened this issue Sep 13, 2011 · 0 comments
Open

std.functional.memoize with types and static opCall #9911

dlangBugzillaToGithub opened this issue Sep 13, 2011 · 0 comments

Comments

@dlangBugzillaToGithub
Copy link

bearophile_hugs reported this on 2011-09-13T04:18:51Z

Transfered from https://issues.dlang.org/show_bug.cgi?id=6662

CC List

Description

In the following D2 program only the Mfoo1 compiles:


import std.functional: memoize;
struct Foo1 {
    int x;
    static Foo1 opCall(int x_) {
        Foo1 f;
        f.x = x_;
        return f;
    }
}
struct Foo2 {
    int x;
}
struct Foo3 {
    int x;
    this(int x_) {
        this.x = x_;
    }
}
void main() {
    alias memoize!Foo1 Mfoo1;
    alias memoize!Foo2 Mfoo2;
    alias memoize!Foo3 Mfoo3;
}


DMD 2.055 gives errors like:

...\src\phobos\std\traits.d(128): Error: static assert  "argument has no return type"
...\src\phobos\std\functional.d(713):        instantiated from here: ReturnType!(Foo2)
test.d(21):        instantiated from here: memoize!(Foo2)

...\src\phobos\std\traits.d(128): Error: static assert  "argument has no return type"
...\src\phobos\std\functional.d(713):        instantiated from here: ReturnType!(Foo3)
test.d(22):        instantiated from here: memoize!(Foo3)


The static assert is in std.traits:

template ReturnType(/+@@@BUG4217@@@+/func...)
    if (/+@@@BUG4333@@@+/staticLength!(func) == 1)
{
    static if (is(FunctionTypeOf!(func) R == return))
        alias R ReturnType;
    else
        static assert(0, "argument has no return type");
}


I think Mfoo2 and Mfoo3 too should compile. Writing Foo2(5) is like calling the function Foo2 with argument x = 5, and returning a struct Foo2 result. I think this is a place where telling apart structs and functions is an artificial distinction that is the opposite of useful.


See one use case:
http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=144333
@LightBender LightBender removed the P4 label Dec 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants