1 2 3 4 5 6 7 | <?php a = 1; b = 2; c = a + b; a = 2; print(c); // prints 3 ?> |
1 2 3 4 5 6 7 | <?php a = 1; b = 2; c = a + b; a = 2; print(c); // prints 4 ?> |
Ja ik had al gezocht op "arithmetics by reference" maar met weinig resultaat tot dusver.quote:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php val c = new Something(); val a = new SomethingElse(); val aOldName = "phpIsAids"; a.name = aOldName ; c.mySomethingElse = a; val aNewName = "daaromIsDitPseudoCode"; a.name = aNewName; c.mySomethingElse.name == aOldName // false c.mySomethingElse.name == aNewName // true ?> |
Hm ja qua imperatieve talen vernoed ik ook niet dat er zo een bestaat die enige bekendheid geniet, hoe pointers en references werken weet ik verder wel redelijk.quote:Op donderdag 23 juli 2020 22:34 schreef 2thmx het volgende:
Het lijkt me stug dat er ook maar één programmeertaal is die conform voorbeeld twee werkt. 'a + b' is een expressie die evalueert tot een waarde en die waarde wijs je toe aan c. C 'is' dus die waarde (of c 'points' naar die waarde; verschilt per taal hoe je dit precies wil zien). Het is anders wanneer c een waarde 'heeft'. Dus als c een object is met een bepaald field en dat field kan van waarde veranderen. Iets als:
[ code verwijderd ]
Hoe zou je in een taal die conform voorbeeld twee werkt, het voor elkaar kunnen krijgen dat je a + b direct wil evalueren tot een nieuwe waarde? Dus hoe kan je in een taal die conform voorbeeld twee werkt code schrijven om het effect van voorbeeld één te krijgen?quote:Op donderdag 23 juli 2020 22:38 schreef FlippingCoin het volgende:
[..]
Hm ja qua imperatieve talen vernoed ik ook niet dat er zo een bestaat die enige bekendheid geniet, hoe pointers en references werken weet ik verder wel redelijk.
Maar wat voor nadelen zou de 2e versie precies met zich meebrengen?
1 2 3 4 5 6 7 | <?php var a = 1; val b = 2; val add = (x, y) -> x + y; a = 2; val c = add.apply(a,b) ?> |
Vroeger had je Lingo (van Adobe Director) dat zo werkte. Wilde je het zoals voorbeeld 1 dan moest je een kopie van de variabele maken. Zo niet dan was het slechts een alias.quote:Op donderdag 23 juli 2020 22:34 schreef 2thmx het volgende:
Het lijkt me stug dat er ook maar één programmeertaal is die conform voorbeeld twee werkt.
Daar zijn wel meerdere oplossingen voor je kan een andere operator of keyword defineren desnoods.quote:Op donderdag 23 juli 2020 22:45 schreef 2thmx het volgende:
[..]
Hoe zou je in een taal die conform voorbeeld twee werkt, het voor elkaar kunnen krijgen dat je a + b direct wil evalueren tot een nieuwe waarde? Dus hoe kan je in een taal die conform voorbeeld twee werkt code schrijven om het effect van voorbeeld één te krijgen?
Java/Kotlin werkt volgens voorbeeld één, en als ik voorbeeld twee wil, dan kan ik iets doen als:
[ code verwijderd ]
Cool ga ik ook eens naar kijken nooit van gehoord.quote:Op donderdag 23 juli 2020 22:50 schreef Tom_Ace het volgende:
[..]
Vroeger had je Lingo (van Adobe Director) dat zo werkte. Wilde je het zoals voorbeeld 1 dan moest je een kopie van de variabele maken. Zo niet dan was het slechts een alias.
Lingo was gebaseerd op Javascript, meen ik.
Het is vooral heel irritant. Wanneer gebruik je zoiets nou in de praktijk?quote:Op donderdag 23 juli 2020 22:54 schreef FlippingCoin het volgende:
Ben wel benieuwd naar wat de impact zou zijn als een programeertaal wel zoals het 2e voorbeeld zou werken.
Anders geformuleerd dan: wat zou 't type zijn van c in voorbeeld twee?quote:Op donderdag 23 juli 2020 22:54 schreef FlippingCoin het volgende:
[..]
Daar zijn wel meerdere oplossingen voor je kan een andere operator of keyword defineren desnoods.
En ja zo zou het idd kunnen met een late functie call en je zou ook het observer pattern kunnen toepassen of naar het reactive paradigma.
Ben wel benieuwd naar wat de impact zou zijn als een programeertaal wel zoals het 2e voorbeeld zou werken.
Kan me er weinig bij voorstellen. In een taal die werkt als voorbeeld twee zou `a + b` de syntax voor een functie-declaratie zijn, dus als je daar een kopie van maakt dan heb je nog steeds dezelfde functie. Heb je een code-voorbeeld anders?quote:Op donderdag 23 juli 2020 22:50 schreef Tom_Ace het volgende:
[..]
Vroeger had je Lingo (van Adobe Director) dat zo werkte. Wilde je het zoals voorbeeld 1 dan moest je een kopie van de variabele maken. Zo niet dan was het slechts een alias.
Lingo was gebaseerd op Javascript, meen ik.
Hmmm weet ik niet goed, bij het binden van user input aan program state bijvoorbeeld.quote:Op donderdag 23 juli 2020 22:57 schreef Tom_Ace het volgende:
[..]
Het is vooral heel irritant. Wanneer gebruik je zoiets nou in de praktijk?
Hmmm nou je kan de waarde toch gewoon een integer laten, dit is vooral aan de compiler dit zo te laten verlopen mocht je dit willen?quote:Op donderdag 23 juli 2020 22:59 schreef 2thmx het volgende:
[..]
Anders geformuleerd dan: wat zou 't type zijn van c in voorbeeld twee?
Een integer/number? Hoe kan de waarde dan later nog veranderen, zonder dat je c aan een andere waarde toewijst?
Een functie? Een functie heeft geen numerieke waarde (kan hooguit een numerieke waarde opleveren als de functie wordt geëvalueerd).
Dat zou hooguit (in theorie) kunnen als alle waarden op compile-time een constante waarde hebben. Als 'a' of 'b' op run-time een waarde krijgen, bijvoorbeeld als user-input, dan niet.quote:Op donderdag 23 juli 2020 23:07 schreef FlippingCoin het volgende:
[..]
Hmmm nou je kan de waarde toch gewoon een integer laten, dit is vooral aan de compiler dit zo te laten verlopen mocht je dit willen?
Waarom niet? Je hoeft het niet daadwerkelijk in n-bit op te slaan daar, je kan dan gewoon een reference naar een stuk geheugen opslaan of zo lijkt mij.quote:Op donderdag 23 juli 2020 23:45 schreef 2thmx het volgende:
[..]
Dat zou hooguit (in theorie) kunnen als alle waarden op compile-time een constante waarde hebben. Als 'a' of 'b' op run-time een waarde krijgen, bijvoorbeeld als user-input, dan niet.
Als c een integer is, dan kan je er alleen een numerieke waarde in opslaan. Eigenlijk wil je dat c een functie, (referenties naar) de argumenten van de functie en de waarde waar deze functie-aanroep naar evalueert tegelijkertijd is.quote:Op donderdag 23 juli 2020 23:50 schreef FlippingCoin het volgende:
[..]
Waarom niet? Je hoeft het niet daadwerkelijk in n-bit op te slaan daar, je kan dan gewoon een reference naar een stuk geheugen opslaan of zo lijkt mij.
Is afhankelijk van je implementatie van je compiler hoe je dat opslaat? Als jij er als ontwerper van een taal i.p.v. de numerieke waarde in binair formaat twee pointers naar een andere waarde opslaat zou dat toch gewoon moeten kunnen. En voor de programmeur gedraagt het zich door lazy evaluation gewoon als een integer wanneer deze waarde gebruijkt wordt.quote:Op vrijdag 24 juli 2020 00:28 schreef 2thmx het volgende:
[..]
Als c een integer is, dan kan je er alleen een numerieke waarde in opslaan. Eigenlijk wil je dat c een functie, (referenties naar) de argumenten van de functie en de waarde waar deze functie-aanroep naar evalueert tegelijkertijd is.
Het was volgens mij alleen bij arrays. Als je bijvoorbeeld dit deed:quote:Op donderdag 23 juli 2020 23:04 schreef 2thmx het volgende:
Kan me er weinig bij voorstellen. In een taal die werkt als voorbeeld twee zou `a + b` de syntax voor een functie-declaratie zijn, dus als je daar een kopie van maakt dan heb je nog steeds dezelfde functie. Heb je een code-voorbeeld anders?
Ah zo. Dat is in Java/Kotlin (en vast heel veel andere talen) ook zo. 'a' en 'b' wijzen immers naar hetzelfde object in dit voorbeeld.quote:Op vrijdag 24 juli 2020 11:21 schreef Tom_Ace het volgende:
[..]
Het was volgens mij alleen bij arrays. Als je bijvoorbeeld dit deed:
a = [1,2,3,4]
b = a
en je veranderde a, dan veranderde b mee.
Wilde je dat niet, dan moest je dit doen:
b = a.copy
1 2 3 4 | stack | heap --------------------------------------------------------------- a ---> geheugen-adres XYZ --> | array-object: [0,1,2,3] b ---> geheugen-adres XYZ |
1 2 3 4 | stack | heap --------------------------------------------------------------- a ---> geheugen-adres XYZ --> | array-object: [0,1,2,3] b ---> geheugen-adres PQR --> | array-object: [0,1,2,3] |
De twee pointers én de logica dat ze bij elkaar opgeteld moeten worden. Dus de functie en zijn argumenten. Het kan in theorie, maar het levert heel moeilijk leesbare code om iets voor elkaar te krijgen dat al kan met bestaande talen die leesbaarder zijn .quote:Op vrijdag 24 juli 2020 10:13 schreef FlippingCoin het volgende:
[..]
Is afhankelijk van je implementatie van je compiler hoe je dat opslaat? Als jij er als ontwerper van een taal i.p.v. de numerieke waarde in binair formaat twee pointers naar een andere waarde opslaat zou dat toch gewoon moeten kunnen. En voor de programmeur gedraagt het zich door lazy evaluation gewoon als een integer wanneer deze waarde gebruijkt wordt.
|
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |