Forwarded from marcov@stack.nl (Marco van de Voort):
In gmane.comp.compilers.gpc, you wrote:
Frank Heckenbach wrote:
begin bla:=xx.methodname; end;
So IIUC, the difference to Markus' way is that here the procedural variable also contains the object, while there it only points to the method, and can be applied to any object (of matching type), right?
Yes, though object-instance might be a better phrasing. It works though with uninitialised objects too as long as you don't actually "use" (dereference) self:
{$mode delphi}
type tmyobject = class function bla ( x: integer):integer; end;
tmethodvar = function (x:integer):Integer of object;
function tmyobject.bla(x:integer):Integer; begin writeln(x, ' ', PtrInt(self)); // ptrint is guaranteed pointer size compat end;
var x : TMyobject; y : tMethodVar;
begin x:=nil; // if you can detect uninitialised vars, this is not necessary. y:=x.bla; y(5); end.
will write
5 0
I'm a bit worried that this syntax is a bit focused on object types that are already (implicitely) a pointer, like Delphi.
If this is possible with (one of ) your object models, better warn if you try to assign a methodvar to a method of an object that is on the stack instead of on the heap.