import typetraits, option
type
DLList = ref object of RootObj
discard
Link[T] = ref object of DLList not nil
left, right: DLList
data: Option[T]
Nil = ref object of DLList not nil
discard
method data*[T](self: DLList): Option[T] = New_Option[T]()
method data*[T](self: Link[T]): Option[T] =
self.type.name.echo()
self.data
method sentinel*(self: DLList): bool = false
method sentinel*(self: Nil): bool = true
method test*[T](self: DLList): void = self.type.name.echo()
method test*[T](self: Linked[T]): void =
self.type.name.echo()
method push*[T](self: DLList): void = self.type.name.echo()
method push*[T](self: Linked[T]): void =
self.type.name.echo()
var list: DLList = Linked[float](left: Nil(), data: New_Option(546.0), right: Nil())
push[float](list)
data[float](list) /> option: option.value.echo()
Code to Option[T] here: https://github.com/alisa-dolinsky/Thirst/blob/master/src/option.nim
Right now it prints:
--- program start --- Link[system.float] Link[system.float] 546.0 --- program end ---
However when you comment the test methods out it prints (which of course implies breaking the dynamic dispatch):
--- program start --- DLList Link[system.float] 546.0 --- program end ---
It appears the Nim compiler just had a stroke lol.