FYI: The support for variant function (aka polymorphic overloading)
has now reached a semi-useable state in Pike 7.9:
| Pike v7.9 release 5 running Hilfe v3.5 (Incremental Pike Frontend)
| > class foo {
| >> variant int bar(int a) { return a*2; }
| >> variant string bar(string s) { return "FOO" + s + "FOO"; }
| >> variant string bar() { return "FOO"; }
| >> }
| > typeof(foo()->bar);
| (1) Result: function( : string) | function(int : int) | function(string :
string)
| > foo()->bar(17);
| (2) Result: 34
| > foo()->bar("BAR");
| (3) Result: "FOOBARFOO"
| > foo()->bar();
| (4) Result: "FOO"
| > foo()->bar(1.2);
| Compiler Error: 1: Bad argument 1 to bar.
| Compiler Error: 1: Expected: string | int.
| Compiler Error: 1: Got : float.
| > foo()->bar((mixed)1.2);
| Invalid arguments to bar()!
| HilfeInput:1: HilfeInput()->foo()->bar(1.2)
| HilfeInput:1: HilfeInput()->___HilfeWrapper()
I would appreciate feedback especially regarding the expected
semantics for:
* When the variants have different modifiers (protected, private, etc).
* When there's a function without the variant keyword.
* When the types for the variants aren't disjunct.
* When overriding X from an inherit with a variant function.
- A non-variant function.
- A variant function with a new definition with the same type.
- A variant function with a new definition with a different type.
* Should the previous definition be accessible in any of the above
cases, or only if there's an explicit trampoline?
* Multiple inherits of variant functions.
- With the same types.
- With different types.
I've probably forgotten or not thought of some cases, please mention
the expected semantics for these as well.
/grubba