Re: Function parameters from TypeTuple

2014-10-17 Thread ketmar via Digitalmars-d-learn
On Fri, 17 Oct 2014 17:44:47 +
Tofu Ninja via Digitalmars-d-learn digitalmars-d-learn@puremagic.com
wrote:

 Basicly what I am trying to do is have a function template that 
 will generate its parameters to be arrays of the types of a type 
 tuple.
 
 So for instance the parameters of f!(int, char) would be (int[], 
 char[])...
 
 No matter what I try, the compiler vomits all over me...
i don't really understand what you want, sorry. can you show some more
code with use case you want to have?


signature.asc
Description: PGP signature


Re: Function parameters from TypeTuple

2014-10-17 Thread Tofu Ninja via Digitalmars-d-learn

On Friday, 17 October 2014 at 17:44:48 UTC, Tofu Ninja wrote:

Not sure if what I wrote made sense, instead I will just post the 
code that is vomiting on me...


template arrayType(T)
{
alias arrayType = T[];
}

template multiAccess(Args ...)
{
auto multiAccess(int i, staticMap!(arrayType, Args) args)
{
static if(args.length == 1) return Tuple!(args[0][i]);
		else return Tuple!(args[0][i], multiAccess!(Args[1 .. 
$])(args[1 .. $]));

}
}

void main(string[] args)
{
int[] a = [1,2];
int[] b = [5,6];
writeln(multiAccess!(int,int)(1, a,b));
}

but the compiler really does not like that at all... the error 
message are very unhelpful as well...


Generates 18 errors...

main.d(52): Error: variable _param_1 cannot be read at compile 
time
main.d(53): Error: variable _param_1 cannot be read at compile 
time
main.d(52): Error: variable _param_1 cannot be read at compile 
time
main.d(53): Error: variable _param_1 cannot be read at compile 
time

main.d(52): Error: tuple index 0 exceeds length 0
main.d(52): Error: tuple index 0 exceeds 0
main.d(52): Error: tuple index 0 exceeds length 0
main.d(52): Error: tuple index 0 exceeds 0
main.d(52): Error: tuple index 0 exceeds 0
main.d(53): Error: tuple index 0 exceeds length 0
main.d(53): Error: tuple index 0 exceeds 0
main.d(53): Error: tuple index 0 exceeds length 0
main.d(53): Error: tuple index 0 exceeds 0
main.d(53): Error: tuple index 0 exceeds 0
main.d(53): Error: slice [1..0] is out of range of [0..0]
main.d(53): Error: template instance main.multiAccess!() error 
instantiating

main.d(53):instantiated from here: multiAccess!int
main.d(25):instantiated from here: multiAccess!(int, int)
main.d(53): Error: template instance main.multiAccess!int error 
instantiating

main.d(25):instantiated from here: multiAccess!(int, int)
main.d(25): Error: template instance main.multiAccess!(int, int) 
error instantiating


Re: Function parameters from TypeTuple

2014-10-17 Thread Ali Çehreli via Digitalmars-d-learn

On 10/17/2014 10:44 AM, Tofu Ninja wrote:

Basicly what I am trying to do is have a function template that will
generate its parameters to be arrays of the types of a type tuple.

So for instance the parameters of f!(int, char) would be (int[], char[])...

No matter what I try, the compiler vomits all over me...


Perhaps string does not match cha[]? I made the elements const in the 
following code but you don't need them if you don't need to pass string:


void f(A, B)(const(A)[] as, const(B)[] bs)
{}

void main()
{
f!(int, char)([42], s);

// And you don't need to specify the template parameters yourself:
f([42], s);
}

Ali



Re: Function parameters from TypeTuple

2014-10-17 Thread Tofu Ninja via Digitalmars-d-learn

On Friday, 17 October 2014 at 17:55:14 UTC, Ali Çehreli wrote:
Yeah.. I dont think I was clear the first time...


Re: Function parameters from TypeTuple

2014-10-17 Thread Tofu Ninja via Digitalmars-d-learn

On Friday, 17 October 2014 at 17:57:58 UTC, Tofu Ninja wrote:

Also my inability to get this working is probably rooted in my 
lack of understanding of the differences between tuple vs Tuple 
vs TypeTuple vs expression tuples ...


Re: Function parameters from TypeTuple

2014-10-17 Thread ketmar via Digitalmars-d-learn
On Fri, 17 Oct 2014 17:57:57 +
Tofu Ninja via Digitalmars-d-learn digitalmars-d-learn@puremagic.com
wrote:

 On Friday, 17 October 2014 at 17:44:48 UTC, Tofu Ninja wrote:
 
 Not sure if what I wrote made sense, instead I will just post the 
 code that is vomiting on me...
still can't grasp what you want to achieve. do you want to build
accessor function, or template that returns another template, or what?


signature.asc
Description: PGP signature


Re: Function parameters from TypeTuple

2014-10-17 Thread Justin Whear via Digitalmars-d-learn
On Fri, 17 Oct 2014 17:44:47 +, Tofu Ninja wrote:

 Basicly what I am trying to do is have a function template that will
 generate its parameters to be arrays of the types of a type tuple.
 
 So for instance the parameters of f!(int, char) would be (int[],
 char[])...
 
 No matter what I try, the compiler vomits all over me...

This what you're thinking of?
http://dpaste.dzfl.pl/724bd2573e98


Re: Function parameters from TypeTuple

2014-10-17 Thread Tofu Ninja via Digitalmars-d-learn
On Friday, 17 October 2014 at 18:22:12 UTC, ketmar via 
Digitalmars-d-learn wrote:

On Fri, 17 Oct 2014 17:57:57 +
Tofu Ninja via Digitalmars-d-learn 
digitalmars-d-learn@puremagic.com

wrote:


On Friday, 17 October 2014 at 17:44:48 UTC, Tofu Ninja wrote:

Not sure if what I wrote made sense, instead I will just post 
the code that is vomiting on me...

still can't grasp what you want to achieve. do you want to build
accessor function, or template that returns another template, 
or what?


I am not even sure any more, I am starting to get lost in the 
tuple madness...


I think I am trying to create an expression tuple for multiple 
array accesses but I am starting to think that it is not even 
possible...


First let me ask another question... is it possible to create an 
expression tuple from an array access? TypeTyple!(a[1]) clearly 
does not work even though a[1] is an expression. It tries to 
evaluate the expression a[1] instead of creating an expression 
tuple from it.


Re: Function parameters from TypeTuple

2014-10-17 Thread Ali Çehreli via Digitalmars-d-learn

On 10/17/2014 11:35 AM, Tofu Ninja wrote:

 I am not even sure any more, I am starting to get lost in the tuple
 madness...

You want to write a function that takes an index and a number of arrays; 
and returns an N-ary Tuple where N matches the number arrays passed to 
the function: :p


  assert(multiAccess(0, [42], s) == Tuple!(int, char)(42, 's'));

And it should work with any number of parameters. Second elements of 
three arrays:


  assert(multiAccess(1, [42, 100], hello, world)
 == Tuple!(int, char, char)(100, 'e', 'o'));

Ali



Re: Function parameters from TypeTuple

2014-10-17 Thread anonymous via Digitalmars-d-learn

On Friday, 17 October 2014 at 17:57:58 UTC, Tofu Ninja wrote:

On Friday, 17 October 2014 at 17:44:48 UTC, Tofu Ninja wrote:

Not sure if what I wrote made sense, instead I will just post 
the code that is vomiting on me...


You forgot the imports.


template arrayType(T)
{
alias arrayType = T[];
}

template multiAccess(Args ...)
{
auto multiAccess(int i, staticMap!(arrayType, Args) args)
{
static if(args.length == 1) return Tuple!(args[0][i]);


`Tuple` is a type template. Use `tuple(foo, bar)` to build a
`Tuple!(typeof(foo), typeof(bar))`.

= return tuple(args[0][i]);

		else return Tuple!(args[0][i], multiAccess!(Args[1 .. 
$])(args[1 .. $]));


`Tuple!` - `tuple` again. Also, `multiAccess` needs `i` again.
And you want to `expand` the sub-result into the tuple so that
it's flat.

= return tuple(args[0][i], multiAccess!(Args[1 .. $])(i, args[1
.. $]).expand);


}
}

void main(string[] args)
{
int[] a = [1,2];
int[] b = [5,6];
writeln(multiAccess!(int,int)(1, a,b));
}

but the compiler really does not like that at all... the error 
message are very unhelpful as well...


Generates 18 errors...

main.d(52): Error: variable _param_1 cannot be read at compile 
time

[...]

This is about you trying to instantiate `Tuple` with the runtime
value that is `args[0][1]`.


main.d(52): Error: tuple index 0 exceeds length 0

[...]

I don't know where these come from. They don't show up for me.

main.d(53): Error: template instance main.multiAccess!() error 
instantiating

[...]

These are due to previous errors.


For style points you could

* Use the short form for function templates:

 auto multiAccess(Args ...)(int i, staticMap!(arrayType, Args)
args) {...}

* Take array types as template arguments instead of constructing
them. This allows them to be inferred (IFTI - Implicit Function
Template Instantiation):

 auto multiAccess(Args ...)(int i, Args args)
 /* Maybe put a template constraint here that forces Args
to be all arrays. */
 {
 import std.typecons: tuple;
 static if(args.length == 1) return tuple(args[0][i]);
 else return tuple(args[0][i], multiAccess(i, args[1 ..
$]).expand);
 }
 void main()
 {
 int[] a = [1,2];
 int[] b = [5,6];
 import std.stdio;
 writeln(multiAccess(1, a,b));
 }


Re: Function parameters from TypeTuple

2014-10-17 Thread Tofu Ninja via Digitalmars-d-learn

On Friday, 17 October 2014 at 19:03:42 UTC, anonymous wrote:

On Friday, 17 October 2014 at 17:57:58 UTC, Tofu Ninja wrote:

On Friday, 17 October 2014 at 17:44:48 UTC, Tofu Ninja wrote:

Not sure if what I wrote made sense, instead I will just post 
the code that is vomiting on me...


You forgot the imports.


template arrayType(T)
{
alias arrayType = T[];
}

template multiAccess(Args ...)
{
auto multiAccess(int i, staticMap!(arrayType, Args) args)
{
static if(args.length == 1) return Tuple!(args[0][i]);


`Tuple` is a type template. Use `tuple(foo, bar)` to build a
`Tuple!(typeof(foo), typeof(bar))`.

= return tuple(args[0][i]);

		else return Tuple!(args[0][i], multiAccess!(Args[1 .. 
$])(args[1 .. $]));


`Tuple!` - `tuple` again. Also, `multiAccess` needs `i` again.
And you want to `expand` the sub-result into the tuple so that
it's flat.

= return tuple(args[0][i], multiAccess!(Args[1 .. $])(i, args[1
.. $]).expand);


}
}

void main(string[] args)
{
int[] a = [1,2];
int[] b = [5,6];
writeln(multiAccess!(int,int)(1, a,b));
}

but the compiler really does not like that at all... the error 
message are very unhelpful as well...


Generates 18 errors...

main.d(52): Error: variable _param_1 cannot be read at compile 
time

[...]

This is about you trying to instantiate `Tuple` with the runtime
value that is `args[0][1]`.


main.d(52): Error: tuple index 0 exceeds length 0

[...]

I don't know where these come from. They don't show up for me.

main.d(53): Error: template instance main.multiAccess!() error 
instantiating

[...]

These are due to previous errors.


For style points you could

* Use the short form for function templates:

 auto multiAccess(Args ...)(int i, staticMap!(arrayType, 
Args)

args) {...}

* Take array types as template arguments instead of constructing
them. This allows them to be inferred (IFTI - Implicit Function
Template Instantiation):

 auto multiAccess(Args ...)(int i, Args args)
 /* Maybe put a template constraint here that forces 
Args

to be all arrays. */
 {
 import std.typecons: tuple;
 static if(args.length == 1) return tuple(args[0][i]);
 else return tuple(args[0][i], multiAccess(i, args[1 ..
$]).expand);
 }
 void main()
 {
 int[] a = [1,2];
 int[] b = [5,6];
 import std.stdio;
 writeln(multiAccess(1, a,b));
 }


I had the imports, I just didn't post them. My problem is most 
likely that I used Tuple! instead of tuple... which is probably 
because the differences between the like 20(exaggeration) 
different types of tuples in D are confusing as hell...


Re: Function parameters from TypeTuple

2014-10-17 Thread anonymous via Digitalmars-d-learn

On Friday, 17 October 2014 at 19:18:29 UTC, Tofu Ninja wrote:
I had the imports, I just didn't post them. My problem is most 
likely that I used Tuple! instead of tuple... which is probably 
because the differences between the like 20(exaggeration) 
different types of tuples in D are confusing as hell...


You've seen the rest of my message, right?


Re: Function parameters from TypeTuple

2014-10-17 Thread Justin Whear via Digitalmars-d-learn
On Fri, 17 Oct 2014 11:56:31 -0700, Ali Çehreli wrote:

 You want to write a function that takes an index and a number of arrays;
 and returns an N-ary Tuple where N matches the number arrays passed to
 the function: :p

http://dlang.org/phobos/std_range.html#transversal


Re: Function parameters from TypeTuple

2014-10-17 Thread Tofu Ninja via Digitalmars-d-learn

On Friday, 17 October 2014 at 19:32:40 UTC, anonymous wrote:

On Friday, 17 October 2014 at 19:18:29 UTC, Tofu Ninja wrote:
I had the imports, I just didn't post them. My problem is most 
likely that I used Tuple! instead of tuple... which is 
probably because the differences between the like 
20(exaggeration) different types of tuples in D are confusing 
as hell...


You've seen the rest of my message, right?


Yeah, the part that fixed it was Tuple! to tuple. Thanks for the 
help. I think this fixes my problem.