www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Get body of a function as string

reply "John Colvin" <john.loughran.colvin gmail.com> writes:
Is there any way of getting the body of a function as a string? 
(Obviously only when the source code is available to the compiler)
Jun 28 2013
next sibling parent reply "bearophile" <bearophileHUGS lycos.com> writes:
John Colvin:

 Is there any way of getting the body of a function as a string? 
 (Obviously only when the source code is available to the 
 compiler)
I think that currently there isn't a simple way to do it. What is your use case? Bye, bearophile
Jun 28 2013
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Friday, 28 June 2013 at 13:18:39 UTC, bearophile wrote:
 John Colvin:

 Is there any way of getting the body of a function as a 
 string? (Obviously only when the source code is available to 
 the compiler)
I think that currently there isn't a simple way to do it. What is your use case? Bye, bearophile
I want to create a function with an identical body but different parameters: e.g. given a function int foo(int a){ return a+1; } automatically create a new function int foo(int a)(){ return a+1; } I'm trying to implement a sort of automatic compile-time currying.
Jun 28 2013
parent reply "Namespace" <rswhite4 googlemail.com> writes:
And why don't you call the function from your clone function?

Maybe this could help you: http://dpaste.1azy.net/fork/597affd2
I used it to generate my own rvalue functions because of the lack 
of rvalue references.
Jun 28 2013
parent reply "John Colvin" <john.loughran.colvin gmail.com> writes:
On Friday, 28 June 2013 at 13:55:54 UTC, Namespace wrote:
 And why don't you call the function from your clone function?
Because the body of the new function needs to see the parameters as known at compile-time.
 Maybe this could help you: http://dpaste.1azy.net/fork/597affd2
 I used it to generate my own rvalue functions because of the 
 lack of rvalue references.
Thanks, that was helpful for a few hints, but it doesn't fix this particular problem.
Jun 28 2013
next sibling parent "bearophile" <bearophileHUGS lycos.com> writes:
John Colvin:

 Because the body of the new function needs to see the 
 parameters as known at compile-time.
I think to curry a function all you need to know is its signature. And in std.traits probably there is all the functionality to see all kinds of function arguments, their names, tags, etc. Bye, bearophile
Jun 28 2013
prev sibling parent reply "monarch_dodra" <monarchdodra gmail.com> writes:
On Friday, 28 June 2013 at 20:50:55 UTC, John Colvin wrote:
 On Friday, 28 June 2013 at 13:55:54 UTC, Namespace wrote:
 And why don't you call the function from your clone function?
Because the body of the new function needs to see the parameters as known at compile-time.
 Maybe this could help you: http://dpaste.1azy.net/fork/597affd2
 I used it to generate my own rvalue functions because of the 
 lack of rvalue references.
Thanks, that was helpful for a few hints, but it doesn't fix this particular problem.
Oh, hey! I remember participating in writing some of that :) Yeah, with traits, you can get enough info to extract all the information you want about the function to redeclare it any way you want. The only thing you *can't* get is... the body! If you have access to the source code of the function, you could redeclare it as a token string? eg: before: int foo(int a) { return a+1; } after: enum fooString = q{ return a+1; }; int foo(int a){mixin(fooString);} int foo()(int a){mixin(fooString);} Yeah... not a great solution. -------- The only way I could see it happen would be with a compile __trait ? Does the compiler even have the info, or is it completely obliterated after the lex phase? The compiler *should* have the info, since it can pinpoint the coordinates of compilation errors. But I wouldn't know too much.
Jun 28 2013
parent "Namespace" <rswhite4 googlemail.com> writes:
 Oh, hey! I remember participating in writing some of that :)
Only Involved? You've written it. I've added only a few things. :)
Jun 29 2013
prev sibling parent reply Jacob Carlborg <doob me.com> writes:
On 2013-06-28 14:46, John Colvin wrote:
 Is there any way of getting the body of a function as a string?
 (Obviously only when the source code is available to the compiler)
I remember someone someone modified DMD and added a .codeof property or similar. It was fairly easy. -- /Jacob Carlborg
Jun 29 2013
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
Jacob Carlborg:

 I remember someone someone modified DMD and added a .codeof 
 property or similar. It was fairly easy.
If there are enough use cases for it, then perhaps it's worth putting both the enhancement request for ".codeof" and its relative patch in Bugzilla. Bye, bearophile
Jun 29 2013
parent "JS" <js.mdnq gmail.com> writes:
On Saturday, 29 June 2013 at 10:38:57 UTC, bearophile wrote:
 Jacob Carlborg:

 I remember someone someone modified DMD and added a .codeof 
 property or similar. It was fairly easy.
If there are enough use cases for it, then perhaps it's worth putting both the enhancement request for ".codeof" and its relative patch in Bugzilla. Bye, bearophile
There is, or at least there will be!
Jul 04 2013