That still doesn't solve the issue of backwards compatibility. It's times like this that make me wish we could put some sort of header on top of files, that tell the compiler what version of Nim the files were written in. It might help a great deal with backwards compatibility.
We're too concerned with preserving backwards compatibility IMO for pre 1.0
Totally agree! And guys, destructors are not enough for good RAII =). E.g. we need to customise copy operations, to implement wrappers to refcountable C objects.
So let's look at the advantages/disadvantages:
proc deepCopy(x: Obj): Obj {.override.}
proc destroy(x: Obj) {.override.}
vs.
proc deepCopy(x: Obj): Obj
proc destroy(x: Obj)
Variant 2 saves typing and removes a source of errors: Forgetting to write .override. Variant 1 is explicit and users of Nim which do not know every detail of the manual can easily see "wait a minute, something special happens here" and then they can lookup override in the manual. Variant 2 removes another source of errors: The programmer used the destroy identifier by chance without any intention of it having special semantics. Also explicit invocation of destructors has to be allowed, you cannot simply disallow it to prevent this mistake.
I prefer the .override way, but both ways have its advantages. Another option is to use = for assignment overloading, ~ for destructor and perhaps =!! for deepCopy but then we have really the same problems as operators are not special in the language.
EDIT Well since [] and () etc already have special meaning, somewhat different than e.g. +, using operators instead seems to be the way to go.
proc `~`(a: var MyObject) = close(a.file)
But ~ is too nice for user defined operators, so perhaps ~!! or ~destroy or whatever.