Я хотел бы сгенерировать функции для класса, принимающего параметр типа 1, который заключает в себе значение по имени.
class C[T](_t: => T) {
def t: T = _t
}
Функции, которые я хотел бы генерировать, получены функциями, доступными в T
.
Что бы я хотел, это получить все функции, доступные для T
, изменить их контракт и реализацию программным способом и сделать ихдоступно для C
.
Под изменением их контракта я подразумеваю изменение их подписи, чтобы они возвращали C[R]
, где R
обозначает тип возврата исходной функции.
Под изменением их реализации я подразумеваю оборачивание результата в C
перед его возвратом.
например.
def +(that: Int): Int =
this + that
станет доступным для C[Int]
как
def +(that: Int): C[Int] =
C(this.t + that)
Это будет сделано для того, чтобы убрать шаблон необходимости переноса внутри C
вычисления, чтобы не оценивать его.
напр.
val c1 = new C(1)
val c2: C[Int] = C(c1.t + 1)
c2.t == 2
woВы также можете быть выражены также как
val c2: C[Int] = c1 + 1
c2.t == 2
Как я могу достичь этого с помощью макросов Scala 2 или dotty?Или это может быть достигнуто по-другому?