Re: Compile-time reflection and templates

2017-09-28 Thread Jacob Carlborg via Digitalmars-d

On 2017-09-27 21:47, Jean-Louis Leroy wrote:

I'd like to go further: find the template arguments 


There was a pull request that implemented this [1]. But it was closed, 
added to many new traits.


[1] https://github.com/dlang/dmd/pull/5201

--
/Jacob Carlborg


Re: Compile-time reflection and templates

2017-09-27 Thread jmh530 via Digitalmars-d
On Wednesday, 27 September 2017 at 21:18:54 UTC, Jean-Louis Leroy 
wrote:


I am aware of these but TemplateArgsOf takes a template 
*instantiation* and returns the arguments. I want to reflect 
the *template*.


Yeah, I had kind of realized the point about instantiate mid-post.


Re: Compile-time reflection and templates

2017-09-27 Thread Jean-Louis Leroy via Digitalmars-d

On Wednesday, 27 September 2017 at 20:04:42 UTC, jmh530 wrote:
On Wednesday, 27 September 2017 at 19:47:32 UTC, Jean-Louis 
Leroy wrote:


I'd like to go further: find the template arguments and the 
function arguments and return types. Looking at __traits and 
std.traits, it doesn't seem feasible, but maybe I overlooked 
something?


You can use TemplateArgsOf
https://dlang.org/phobos/std_traits.html#TemplateArgsOf
to get the template arguments.

For the stuff below, I think you can't just use foo, it has to 
be a specific foo!T.


You can test if it's a function
https://dlang.org/phobos/std_traits.html#isFunction

You can get the Parameter and Return types
https://dlang.org/phobos/std_traits.html#Parameters
https://dlang.org/phobos/std_traits.html#ReturnType

You can get the names of parameters
https://dlang.org/phobos/std_traits.html#ParameterIdentifierTuple


I am aware of these but TemplateArgsOf takes a template 
*instantiation* and returns the arguments. I want to reflect the 
*template*.


Here what I am trying to achieve (for openmethods). Given:

  Matrix!T times(T, virtual!(Matrix!T));

...inject, at compile time (in 'mixin(registerMethods)'), the 
following code:


  Matrix!T times(T)(T s, Matrix!T m) {
return Method!("times", "deallocator", Matrix!T, T, 
virtual!(Matrix!T)).dispatcher(s, m);

  }

  Method!("times", "deallocator", Matrix!T, T, 
virtual!(Matrix!T)) times(T)(MethodTag, T s, Matrix!T m);






Re: Compile-time reflection and templates

2017-09-27 Thread jmh530 via Digitalmars-d
On Wednesday, 27 September 2017 at 19:47:32 UTC, Jean-Louis Leroy 
wrote:


I'd like to go further: find the template arguments and the 
function arguments and return types. Looking at __traits and 
std.traits, it doesn't seem feasible, but maybe I overlooked 
something?


You can use TemplateArgsOf
https://dlang.org/phobos/std_traits.html#TemplateArgsOf
to get the template arguments.

You can test if it's a function
https://dlang.org/phobos/std_traits.html#isFunction

You can get the Parameter and Return types
https://dlang.org/phobos/std_traits.html#Parameters
https://dlang.org/phobos/std_traits.html#ReturnType

You can get the names of parameters
https://dlang.org/phobos/std_traits.html#ParameterIdentifierTuple


Re: Compile-time reflection and templates

2017-09-27 Thread jmh530 via Digitalmars-d
On Wednesday, 27 September 2017 at 19:47:32 UTC, Jean-Louis Leroy 
wrote:


I'd like to go further: find the template arguments and the 
function arguments and return types. Looking at __traits and 
std.traits, it doesn't seem feasible, but maybe I overlooked 
something?


You can use TemplateArgsOf
https://dlang.org/phobos/std_traits.html#TemplateArgsOf
to get the template arguments.

For the stuff below, I think you can't just use foo, it has to be 
a specific foo!T.


You can test if it's a function
https://dlang.org/phobos/std_traits.html#isFunction

You can get the Parameter and Return types
https://dlang.org/phobos/std_traits.html#Parameters
https://dlang.org/phobos/std_traits.html#ReturnType

You can get the names of parameters
https://dlang.org/phobos/std_traits.html#ParameterIdentifierTuple


Compile-time reflection and templates

2017-09-27 Thread Jean-Louis Leroy via Digitalmars-d

I can identify the templates in a module:

  module modtemp;

  import std.stdio;
  import std.traits;

  void foo(T)(T x) {}

  void main()
  {
foreach (m; __traits(allMembers, modtemp)) {
  if (__traits(isTemplate, mixin(m))) {
mixin("alias F = " ~ m ~ ";");
writeln(m);
  }
}
  }
  // output:
  // foo

I'd like to go further: find the template arguments and the 
function arguments and return types. Looking at __traits and 
std.traits, it doesn't seem feasible, but maybe I overlooked 
something?