On 08/19/2012 07:07 AM, bearophile wrote:
Ali Çehreli:

Took me a while! Phew... :)

http://dpaste.dzfl.pl/6b362382

I have back-ported your changes to my version, and it works (with few
improvements, a larger Busy Beaver, etc):

http://dpaste.dzfl.pl/0791bea9

-----------------------

I have also tried to replace your code like this:

struct TypeListToArray(node : Cons!(value, tail), int value, tail) {
void opCall(ref int[] output) {
output ~= value;
TypeListToArray!tail tl2v;
tl2v(output);
}

static auto opCall() {
TypeListToArray!node tl2v;
return tl2v;
}
}

struct TypeListToArray(node : Repeat!value, int value) {
void opCall(ref int[] output) {
output ~= value;
}
}

import std.array;
void main() {
import std.stdio;
alias TuringMachine!(BusyBeaver2, Repeat!0, Repeat!0) tm;

int[] tape1;
TypeListToArray!(tm.finalLeft)()(tape1);
...


With a shorter template like:

template TypeListToArray(Node) {
static if (is(Node Repeat : Repeat!value, int value))
enum TypeListToArray = [value];

static if (is(Node Cons : Cons!(value, Tail), int value, Tail))
enum TypeListToArray = [value] ~ TypeListToArray!(Node.tail);
}

import std.array;
void main() {
import std.stdio;
alias TuringMachine!(BusyBeaver2, Repeat!0, Repeat!0) tm;

enum tape1 = TypeListToArray!(tm.finalLeft);
...

But it's not working. Do you know why?

Here is a reduced code:

template Foo(T)
{
    static if (is (T : int)) {
        enum Foo = [ T.init, T.init ];

    }

    static if (is (T : long)) {
        enum Foo = [ T.init ];

    }
}

void main()
{
    enum i = Foo!int;
    enum l = Foo!long;
}

Error: template instance deneme.Foo!(int) error instantiating

Works if the two 'static if' blocks are connected with an else:

    static if (is (T : int)) {
        enum Foo = [ T.init, T.init ];

    } else static if (is (T : long)) {  // <-- else makes it compile
        enum Foo = [ T.init ];
    }


Bye,
bearophile

Ali

Reply via email to