protocoled
protocoled copied to clipboard
Use macrocache module
By creating const registry of type CacheTable, the nesting can be avoided. But most importantly it'll allow declaring interface implementations across modules https://nim-lang.org/docs/macrocache.html
Also see: https://github.com/mratsim/trace-of-radiance/blob/master/trace_of_radiance/support/emulate_classes_with_ADTs.nim
Use new concept api once its finally merged: https://github.com/nim-lang/Nim/pull/15251
next gen syntax:
type
PExpr {.runtime.} = concept
proc eval(x: Self): int
impl PExpr:
type
PLiteral = ref object
x: int
proc newLit(x: int): PLiteral =
result = PLiteral(x: x)
proc eval(x: PLiteral): int = x.x
impl PExpr:
type
PPlusExpr = ref object
a, b: PExpr
proc newPlus(a, b: PExpr): PPlusExpr =
result = PPlusExpr(a: a, b: b)
proc eval(x: PPlusExpr): int = eval(x.a) + eval(x.b)
#Also valid:
type
PPlusExpr {.impl: PExpr.} = ref object
a, b: PExpr
proc eval(x: PLiteral): int {.impl: PExpr.} = x.x
#2 This is also valid:
type
PPlusExpr {.impl: PExpr.} = concept
var a, b: PExpr
proc newPlus(a, b: PExpr): PPlusExpr =
result = PPlusExpr(a: a, b: b)
proc eval(x: PPlusExpr): int = eval(x.a) + eval(x.b)