Mee eens! ?: rulez. Goed, je code wordt niet echt leesbaar als je alle if-else vervangt door ?: maar dat heet job security.
Eerlijk gezegd dacht ik niet gelijk aan het ietwat cryptische ?: , maar de echte syntax is een detail waar je later lang over kunt discussieren. Belangrijkste punt is dat er geen verschil zou moeten zijn tussen een conditionele expressie en een conditionele expressie en zeker niet in de syntax.
Dat werkt alleen (efficient) als de lvalue opnieuw kan worden bepaald zonder dure operatie. Dus ik ben nog niet overtuigd dat dit overall een verbetering is.
De efficientie hiervan is inderdaad een goed punt, maar voor vele gevallen (zoals deze simpele assignment) is dit geen enkel probleem en kan de compiler deze optimalisatie uitstekend zelf uitvoeren.
Die's mooi. Misschien kunnen we'm beter try?(expr1):expr2 noemen, waarbij expr1 altijd wordt geevalueerd en expr2 alleen als expr1 throw'ed.
Die try-catch is inderdaad erg verbose, maar ik ben ook wel bang voor een te cryptische syntax. In Stratego combineer je twee strategien met de <+ operator als je de linker strategie voorrang wilt geven: in "s1 <+ s2" zal er eerst gekozen worden voor s1 en pas als deze faalt zal s2 worden gekozen. Deze syntax staat mij eigenlijk wel aan.
code:
1
| int x = doSomethingDangerous() <+ 13 |
Probleem is alleen dat hier geen onderscheid meer is tussen verschillende vormen van exceptions. Juist de introductie hiervan zorgt voor onduidelijke code.
[expressie blocken als function bodies] Het nut hievan ontgaat me.
Mij ook

. Het zou goed passen in de filosofie van expressie blocken en waarom dus een andere taal-constructie gebruiken voor iets wat in wezen gezien kan worden als een expressie-block?
Dit is een bijzonder geval van een geparmeteriseerd type. Optional<T> heeft waardes { null, { waardes(T) } }. Het voordeel hiervan is dat Optional<Optional<T> > gebruikt kan worden om twee singuliere waarden met T te associeren.
Inderdaad, zo zie je het ook terug in veel functioneel achtige talen. In Stratego bijvoorbeeld ook:
code:
1
2
| Some: a -> Option(a)
None: Option(a) |
Deze vorm van werken is echter een vrij verbose manier van werken. Bovendien kan je alleen maar door statements controleren dat T niet alsnog de waarde null heeft. Bovendien is er helemaal geen methode om aan te geven dat iets
niet null mag zijn. Een compacte syntax zoals in Nice vind ik buitengewoon fraai en een hele waardevolle toevoeging.
[checks]Nee. Een snelle taal zonder checks kun je veilig maken door checks toe te voegen. Andersom gaat niet.
Ach, over het belang van dergelijke features kan je heel lang discussieren

. Ik zou in het voordeel van dergelijke checks kunnen aanvoeren dat ik gevallen (of dit nu vaak of zelden is, zal sterk per applicatie verschillen) bounds checks geelimineerd kunnen worden door de compiler.
Dat is commercieel onhaalbaar. Er is binnen de C++ commissie (uiteraard) hierover gefilosofeerd, maar de kosten om zoiets in een commerciele compiler toe te voegen zijn onhaalbaar hoog cq. deze taal/compiler wordt links en recht ingehaald door andere talen/compilers waar het geld besteed is aan nuttigere features.
Tja, ook daar valt weer flink over te discussieren. Een deel van de compactheid van veel functioneel achtige talen is toch wel terug te voeren op de syntax voor lijsten. Als ik in Stratego wil controleren of het eerste en het laatste element van een lijst aan bepaalde voorwaarde 's' moet voldoen schrijf ik:
In een taal als Java ben je toch al snel een aardig aantal regels kwijt om hetzelfde te doen. Dit komt uiteraard niet alleen door de lijst-syntax, maar voor een deel wel. Een ingebouwde syntax voor lijsten en tuples zou ook een algebraische manier van werken bevorderen, wat wellicht de duidelijkheid en correctheid van veel applicaties ten goede zou komen.
Ik begrijp je argument uiteraard verder wel en helaas heb je ook wel gelijk

.
[:=] De winst?
Het is grappig om te zien dat in vrijwel elk illustratief taaltje := wordt gebruikt ipv = voor assignment. Dit wordt ervaren als duidelijker omdat = snel wordt geassocieerd met equivalentie. Deze discussie of := gebruikt zou moeten worden voor assignment, staat eigenlijk los van verschillen tussen =, == , .equals enz... Voordeel van het gebruik van := is dat de = vrijkomt voor de pool van equivalentie operatoren

.
Ten eerste omdat dit slecht samen gaat met generieke functies - het vinden van een overload wordt rampzalig moeilijk als elke template instantiatie een pattern oplevert ipv een enkele functie - en ten tweede omdat forwarder functies een redelijk deel van deze capaciteiten kunnen leveren.
Het conflict is duidelijk: ik wil functionalit die abstraheert, ook al gaat dit ten koste van de performance. Jij wilt gewoon een efficientie, compacte en minimale taal zonder flauwekul. Voor beide ideeen valt denk ik wel het een en ander te zeggen. Leukere pattern matching zie je op dit moment vrijwel alleen nog maar in functionele en andere declaratievere talen. Ik denk dat de introductie van dergelijke functionaliteit in imperatieve talen ook geen kwaad zou kunnen.
Tsja, geval van zelf opgelegde beperking van C++ (minder nieuwe keywords = betere compabiliteit met C) die zeker niet gevolgd had moeten worden in compleet nieuwe talen. Dit is duidelijk een gemiste kans om ten opzichte van C++ te verbeteren.
Zeker, helemaal mee eens... Helaas zie je nog veel van dergelijke naweeen terug in Java en C#: neem bijvoorbeeld eens de ";" als type-dec die de beste C++ programmeur zo enorm zou helpen bij het programmeren in Java

. Laten we het nog maar niet hebben over alle array varianten bij variabelen en methode delcaraties in Java.
[final parameters] Waarom? Laat de compiler de consequenties ervan bepalen. Ik mis eerlijk gezegd het probleem.
Zie de refactoring "Remove Assignments to Parameters" op blz 131 in het boek van Martin Fowler. De redenatie daar is de onduidelijkheid tussen pass by value en pass by reference. Verder is het duidelijker als een parameter gedurende de gehele methode dezelfde waarde behoudt: het is iets wat je meegeeft, niet iets wat je gebruikt om mee te rekenen.
Klopt. Stroustrup is in dit verband bezig met XDR, wat een dermate simpele representatie van C++ programma's is dat elke HBO'er in z'n eerste jaar de XDR code kan parsen. XDR is makkelijk door compilers te genereren, en ook makkelijk terug te converteren naar C++. Voor Java zou zo'n dergelijke representatie taal mogelijk nog makkelijker en effectiever zijn.
Hum, dat klinkt leuk. Ik heb nog nooit van XDR gehoord. Ik zal eens rondkijken op het web of ik iets leuks kan vinden. Voor Java is het inderdaad vrij eenvoudig om een duidelijke subset te maken. Ik ben zelf de laatste tijd veel met meta-tools bezig en kom hier steeds dergelijke problemen tegen. Het verbaast mij dat met dergelijke problemen niet beter rekening is gehouden bij het ontwerp van de moderne talen. Zeker bij Java is het in feite rampzalig...