Как установить параметризацию по умолчанию для класса? - PullRequest
0 голосов
/ 13 января 2019

Метод ^parameterize позволяет параметризовать класс с некоторой заданной информацией, такой как роль.

my role A[::T = Mu] { }

my class B {
    method ^parameterize(Mu \base, Mu \type) {
        my \what := base.^mixin(A[type]);
        what.^set_name(base.^name ~ '[' ~ type.^name ~ ']');
        what
    }
}

dd B[Int];        # B[Int]
dd B[Int].^roles; # (A[Int],)

Однако я не смог найти способ сделать непараметризованную версию B для непараметризованной версии роли A.

dd B;        # B
dd B.^roles; # (), want to see (A[Mu],)

Я попытался добавить метод ^compose, но он вызывается только в случае параметризации класса.

Предложения очень приветствуются!

1 Ответ

0 голосов
/ 14 января 2019

Я пришел к выводу, что вы не можете (по крайней мере, в обозримом будущем). Поэтому я сделал шаг назад, чтобы увидеть, чего я на самом деле хотел достичь. И , что оказалось возможным:

my role A[::T] {
    method foobar() { T }
}

my class B {
    method foobar() { Mu }

    method ^parameterize(Mu \base, Mu \type) {
        my \what := base.^mixin(A[type]);
        what.^set_name(base.^name ~ '[' ~ type.^name ~ ']');
        what
    }
}

dd B.foobar;       # Mu
dd B[Int].foobar;  # Int

Метод foobar по умолчанию предоставляется классом B. Если один параметризует класс B, он будет смешан с другой версией метода foobar (который затеняет оригинальный метод), который возвращает тип, заданный параметризацией.

В конце концов, это дало мне основу для возможности параметризации QuantHash es, давнего моего собственного запроса и недавно других.

...