Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Perl misschien?.oisyn schreef op donderdag 16 april 2020 @ 14:27:
Kent iemand een dynamisch getypeerde taal met operator overloading?
Ik kan dat op 2 manieren implementeren: een andere functie aanroepen, bijvoorbeeld opAdditionR, of een extra parameter die aangeeft of this links of rechts stond. Een derde optie is natuurlijk gewoon beide operanden meegeven als parameter, waarbij een van de twee dan ook de this is. Eventueel kan die ook static zijn.
Brrr, niet snel een taal waar ik naar zou kijken als voorbeeld
Interessant, Python gaat dus voor de aanpak met een aparte functie voor de R-versie. Bovendien kun je NotImplemented returnen (waardoor hij bij a+b waarbij a wel een implementatie heeft alsnog bij b uit kan komen)
Ik kan zo snel niet vinden hoe Ruby bovenstaand probleem nou precies oplost... Hier zeggen ze niets meer dan "ja bij 3 + a krijg je een error" in een voetnoot, niet hoe je dat dan oplost

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
C# is statisch getypeerd dus kun je sowieso altijd de juiste implementatie erbij zoeken. Dat kan niet in een dynamisch getypeerde taal.Sebazzz schreef op donderdag 16 april 2020 @ 15:19:
In C# is operator overloading via een static method altijd. Dan hoef je ook niet te twijfelen over left/right.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Op punt van uitvoering weet je toch wat de operands zijn?.oisyn schreef op donderdag 16 april 2020 @ 15:21:
[...]
Dat kan niet in een dynamisch getypeerde taal.
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]
Oh ik snap nu wat je bedoelt.Sebazzz schreef op donderdag 16 april 2020 @ 15:32:
[...]
Op punt van uitvoering weet je toch wat de operands zijn?
Het punt is niet zozeer twijfel over wat wat is. Alle manieren die ik opnoemde zijn immers eenduidig. Maar in een dynamische taal heb je veel meer last van het feit dat 1 functie alle verschillende types moet afhandelen.
In C# heb je immers nog steeds een verschil tussen een operator+(Foo, Bar) en een operator+(Bar, Foo). Je hoeft niet in je functie types te testen, en bovendien kunnen beide kanten een implementatie toevoegen.
In een dynamische taal weet je hooguit alleen dat Foo en/of Bar een operator+ heeft. Maar je weet niet of Foo ook instances van Bar afhandelt in zijn operator+. Je kunt dan zeggen: de linkerkant bepaalt. Maar dan kom je weer in de knoei met built-in types, want die kun je niet overriden, dus dan bepaalt ineens de rechterkant. In het geval van een static op Foo met twee operands moet je dan ook nog eens gaan opzoeken welke van de twee de Foo is in dit verhaal. Een aparte functie voor als Foo rechts staat is dan wel prettig. Maar wel weer meer implementatiewerk.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Nadeel van C# is dat je niet kunt abstraheren over operators (bijv. een generieke functie voor alle typen T waarvoor optellen gedefinieerd is)..oisyn schreef op donderdag 16 april 2020 @ 15:21:
[...]
C# is statisch getypeerd dus kun je sowieso altijd de juiste implementatie erbij zoeken. Dat kan niet in een dynamisch getypeerde taal.
Wat als je nu operators als functies behandelt die toevallig een symbool als identifier hebben? Vervolgens zorg je dat je taal aan late-binding doet, zoals bijv. VB:.oisyn schreef op donderdag 16 april 2020 @ 14:46:
Ik heb operator overloading toegevoegd aan KolQ, maar ik zit met een design dilemma. Operator overloading werkt alleen op objects, niet op andere built-in types zoals numbers of strings.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| Module Program Sub Foo(x As String, y As String) Console.WriteLine("String,String") End Sub Sub Foo(x As String, y As Integer) Console.WriteLine("String,Int") End Sub Sub Foo(x As Integer, y As Integer) Console.WriteLine("Int,Int") End Sub Sub Foo(x As Integer, y As String) Console.WriteLine("Int,String") End Sub Sub Main(args As String()) Dim a As Object = 1 Dim b As Object = "2" Foo(a, b) 'prints: Int,String End Sub End Module |
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Ik zie niet helemaal wat het hebben van symbolen precies toevoegt in deze contextRayNbow schreef op donderdag 16 april 2020 @ 16:11:
Wat als je nu operators als functies behandelt die toevallig een symbool als identifier hebben?
Late-binding staat wel op mijn wishlist, maar dat wil ik tacklen dmv syntactische suiker en niet in de VM zelf, door een stub te genereren de de nodige tests doet en de offload naar de juiste implementatie.Vervolgens zorg je dat je taal aan late-binding doet, zoals bijv. VB
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Ik weet niet helemaal wat de mogelijkheden zijn in Python verder, maar KolQ is volledig dynamisch en je kunt dus ook gewoon on the fly de operator+ in Foo wrappen als je dat nodig acht. Op die manier voegt Bar dus functionaliteit toe aan Foo. Dat zou ongeveer zo gaan:
1
| Foo.@opAddition = with(old=Foo.@opAddition) => (x) => x is Bar ? AddFooBar(this,x) : old.call(this, x); |
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Dat was een bruggetje naar het stukje VB-code (in VB kan ik functies alleen alfanumerieke namen geven)..oisyn schreef op donderdag 16 april 2020 @ 16:30:
[...]
Ik zie niet helemaal wat het hebben van symbolen precies toevoegt in deze context
Op zich is Python wel aardig en dekt het veel gevallen af. Soms kun je, ook al is Foo van een derde partij, het in Python monkeypatchen en alsnog bijv. __add__ toevoegen aan Foo..oisyn schreef op donderdag 16 april 2020 @ 17:32:
Ik vind Python's oplossing op zich wel aardig, waarbij de left-hand-side (lhs) dus aangeeft dat hij het type niet support waarna de operator wordt geoffload naar de rhs. Dat is dus typisch voor de usecase dat je Foo+Bar wilt supporten terwijl jij Bar maakt en Foo van een derde partij is en die je dus niet aan kunt passen.
Waar Python tekort kan schieten is wanneer zowel Foo en Bar van een 3e partij zijn en niet te monkeypatchen is. In dat geval kun je noch __add__ toevoegen aan Foo, noch __radd__ aan Bar.
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Groovy?.oisyn schreef op donderdag 16 april 2020 @ 14:27:
Kent iemand een dynamisch getypeerde taal met operator overloading?
let the past be the past.
Doet Groovy meer dan single dispatch op de linker operand?
Ipsa Scientia Potestas Est
NNID: ShinNoNoir
Niet direct. Maar operator overloading is een vorm van polymorphisme, dus bv Smalltalk..oisyn schreef op donderdag 16 april 2020 @ 14:27:
Kent iemand een dynamisch getypeerde taal met operator overloading?
Mijn compiler-nerd-alert zou deze suggesteren.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.