digitalmars.D.learn - Function names and lambdas
- Russel Winder via Digitalmars-d-learn (17/17) Apr 06 2017 I am used to a function name being a reference to the function body,
- Adam D. Ruppe (5/8) Apr 06 2017 Try
- Russel Winder via Digitalmars-d-learn (15/29) Apr 07 2017 No don't I look like a real idiot. Of course I should have known that.
- =?UTF-8?Q?Ali_=c3=87ehreli?= (22/29) Apr 06 2017 I think it's just a design choice. C implicitly converts the name of the...
- Russel Winder via Digitalmars-d-learn (21/49) Apr 07 2017 [=E2=80=A6]
- Yuxuan Shui (2/27) Apr 07 2017 Main reason is probably UFCS.
- =?UTF-8?Q?Ali_=c3=87ehreli?= (5/40) Apr 07 2017 Main reason for D not supporting the name-to-pointer mapping? I don't
- Jacob Carlborg (6/9) Apr 08 2017 More likely due to properties, i.e. calling functions without
I am used to a function name being a reference to the function body, cf. lots of other languages. However D rejects: iterative as a thing can put in an array, it requires: (n) =3D> iterative(n) Presumably this introduces inefficiency at run time? I.e. the extra level of indirection is not compiled away? --=20 Russel. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.winder ekiga.n= et 41 Buckmaster Road m: +44 7770 465 077 xmpp: russel winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder
Apr 06 2017
On Thursday, 6 April 2017 at 18:37:51 UTC, Russel Winder wrote:I am used to a function name being a reference to the function body, cf. lots of other languages. However D rejects: iterativeTry &iterative The compiler would probably optimize out a trivial thing anyway, but &foo should work too in most cases.
Apr 06 2017
On Thu, 2017-04-06 at 18:45 +0000, Adam D. Ruppe via Digitalmars-d- learn wrote:On Thursday, 6 April 2017 at 18:37:51 UTC, Russel Winder wrote:No don't I look like a real idiot. Of course I should have known that. :-) It works exactly as required. --=20 Russel. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.winder ekiga.n= et 41 Buckmaster Road m: +44 7770 465 077 xmpp: russel winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winderI am used to a function name being a reference to the function=C2=A0 body, cf. lots of other languages. However D rejects: =20 iterative=20 Try =20 &iterative =20 =20 =20 The compiler would probably optimize out a trivial thing anyway,=C2=A0 but &foo should work too in most cases.
Apr 07 2017
On 04/06/2017 11:37 AM, Russel Winder via Digitalmars-d-learn wrote:I am used to a function name being a reference to the function body, cf. lots of other languages. However D rejects: iterative as a thing can put in an array, it requires: (n) => iterative(n) Presumably this introduces inefficiency at run time? I.e. the extra level of indirection is not compiled away?I think it's just a design choice. C implicitly converts the name of the function to a pointer to that function. D requires the explicit & operator: alias Func = int function(int); int foo(int i) { return i; } void main() { Func[] funcs = [ &foo ]; } Close to what you mentioned, name of the function can be used as an alias template parameter: void bar(alias func)() { func(42); } int foo(int i) { return i; } void main() { bar!foo(); } Ali
Apr 06 2017
On Thu, 2017-04-06 at 11:45 -0700, Ali =C3=87ehreli via Digitalmars-d-learn wrote:=20[=E2=80=A6]I think it's just a design choice. C implicitly converts the name of the=C2=A0 function to a pointer to that function. D requires the explicit & operator:One of the dangers of being a bit like and a replacement for another language is that often people carry ideas over incorrectly, as I have here.alias Func =3D int function(int); =20 int foo(int i) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return i; } =20 void main() { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Func[] funcs =3D [ &foo ]; }I just did: immutable funcs =3D [tuple(&foo, "foo")]; as I don't need the name of the type, but I do need a string form of the name of the function.Close to what you mentioned, name of the function can be used as an=C2=A0 alias template parameter: =20 void bar(alias func)() { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0func(42); } =20 int foo(int i) { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return i; } =20 void main() { =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bar!foo(); }Good to know but for situation here the &foo was what was needed. --=20 Russel. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.winder ekiga.n= et 41 Buckmaster Road m: +44 7770 465 077 xmpp: russel winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder
Apr 07 2017
On Thursday, 6 April 2017 at 18:45:26 UTC, Ali Çehreli wrote:On 04/06/2017 11:37 AM, Russel Winder via Digitalmars-d-learn wrote:Main reason is probably UFCS.[...]I think it's just a design choice. C implicitly converts the name of the function to a pointer to that function. D requires the explicit & operator: alias Func = int function(int); int foo(int i) { return i; } void main() { Func[] funcs = [ &foo ]; } Close to what you mentioned, name of the function can be used as an alias template parameter: void bar(alias func)() { func(42); } int foo(int i) { return i; } void main() { bar!foo(); } Ali
Apr 07 2017
On 04/07/2017 11:19 AM, Yuxuan Shui wrote:On Thursday, 6 April 2017 at 18:45:26 UTC, Ali Çehreli wrote:Main reason for D not supporting the name-to-pointer mapping? I don't think so because as far as I know this has been the case since very early on but UFCS came very much later. AliOn 04/06/2017 11:37 AM, Russel Winder via Digitalmars-d-learn wrote:Main reason is probably UFCS.[...]I think it's just a design choice. C implicitly converts the name of the function to a pointer to that function. D requires the explicit & operator: alias Func = int function(int); int foo(int i) { return i; } void main() { Func[] funcs = [ &foo ]; } Close to what you mentioned, name of the function can be used as an alias template parameter: void bar(alias func)() { func(42); } int foo(int i) { return i; } void main() { bar!foo(); } Ali
Apr 07 2017
On 2017-04-07 23:05, Ali Çehreli wrote:Main reason for D not supporting the name-to-pointer mapping? I don't think so because as far as I know this has been the case since very early on but UFCS came very much later.More likely due to properties, i.e. calling functions without parentheses. It's more difficult to know if the function should be called or if the address of the function should be taken. -- /Jacob Carlborg
Apr 08 2017