prototype schreef op vrijdag 05 september 2008 @ 23:08:
Mag ik vragen welke alternatieven je hebt gebruikt? Een taal als ruby of python vind ik namelijk nog steeds shitloads beter in elkaar steken dan PHP. Niet alleen van een technisch implementatie standpunt (zoals ik die al hier heb genoemd in dit topic) maar ook vanuit een design standpunt (zoals we hier ook al hebben aangekaart).
Dat talen beter zijn maakt ze nog geen betere alternatieven voor php

Anyways, 'k heb even vandaag gewerkt aan een voorstel voor een betere PHP: i.e. een taal die lijkt op PHP, maar stiekem alle awesome features van smalltalk/ruby/python heeft. Hier kunnen denk ik de meeste PHP'ers wel kaas van maken neem ik aan

Het is natuurlijk interessant om zoiets te maken. Maar het zal natuurlijk wel heel veel beter in elkaar moeten steken dan php en dan moet je je niet alleen richten op het 'de code is netter' punt, want dat kan de meeste php-coders waarschijnlijk niet zo veel schelen. Dat de rariteiten van php weg zijn is ook niet zo interessant, de meeste loop je maar zelden tegenaan in je code.
Wat ze wel kan schelen is als ze met minder, maar even duidelijke syntax dezelfde functionaliteit kunnen bereiken. En een deel zal geinteresseerd zijn in betere performance, een statefull omgeving, minder geheugenoverhead en dat soort dingen die nu in php nog missen of echt ondermaats zijn.
* Denoting the end of a statement can be done with
* either a newline or a ;
Ik vind het hele 'een newline eindigt je statement' tamelijk waardeloos. Vooral omdat ik te vaak regels heb gezien van meer dan 80 karakters lang, waarvan het best prettig is om ze over meerdere regels te verdelen zonder ze op te splitsen in meerdere statements (voor zover mogelijk). Sowieso is whitespace verder nergens van betekenis in je taal, dus waarom een newline ineens wel?
private a;
# Sugar: Object#attr_reader :a
# Note: omitting qualifier <=> module public
function a {
return this.a
}
# Sugar: Object#attr_writer :a
public function a=(v) {
this.a = v
}
Dit zijn dus wrappers rond een call naar 'object.a' in je code? Een beetje het idee van C++ waar je de = kan herdefinieren?
/**
* Note that the ? is a valid trailing identifier
* Its semantics will be given to predicates.
*/
private function contains?(Object o) {
return super.contains?(o)
}
En wat voegt die ? toe, behalve verwarring? Of is dat een isset-methode, waardoor je if(object.o) {...} kan aanroepen?
# What about array() you're probably wondering? Well, we could do that retarded way as well

function array(args...) {
return args;
}
some_array = array("haiz", "kthnxbyez")
De array is natuurlijk wel wat krachtiger dan dat in php he? Het is tegelijkertijd een hashmap en list. En hoewel het niet altijd prettig is om die twee gemixed te hebben (door de gigantische geheugenoverhead) heeft het ook weer zijn voordelen. Maar let er iig op dat je dergelijke datastructuren triviaal aan je gebruiker aanbiedt, ipv dat je ze dwingt ze zelf te definieren als het wat moeilijker moet zijn dan [a, b, c] of je {:bla ...}.
map = {:foo => "bar", :dude => "sweet"}
map << (:foooooo, "baz") # equivalent to statement below (based on formal definition of map)
map << {:blaat => "aap"} # equivalent to statement above
map.each function(key, value) {
println(key)
println(value)
}
symbol = :foo
a = :foo
b = :foo
Is dat nou perl-style een referentie naar het laatst geopende relevante object? Of had het map:foo moeten zijn?
func = foo_instance.something(0, 0)
x,y = func.call()
Die impliciete list() is wel handig idd. Is het niet handiger om gewoon standaard func() te kunnen aanroepen?
/**
* The language should be completely object oriented, i.e. elements that are considered by other
* languages to be literals are in fact, flyweight objects in our language.
* The following yields "NullClass"
*/
print(null.class)
Is alles dan per definitie niet alleen een instanceof 'Object' maar ook van 'NullClass' ? Aka, als je een functie-definitie opgeeft ala 'function bla(SomeType x)' mag ik dat dan aanroepen met 'bla(null)' zoals in Java of krijg ik dan zoals in php een foutmelding (tenzij je 'function bla(SomeType x=null)' definieert

)
# Regular expressions will get syntactic sugar as well through / /.
# The following should yield RegEx
print(/^haiz$/i.class)
Worden de regexp's duidelijker in de taal geintegreerd dan in perl? Want hoewel het hip is dat het er compleet in geintegreerd zit bij perl, vind ik de manieren van php, Javascript en Java toch eenvoudiger te begrijpen.
# Now for some of the exciting stuff, let's talk about co-routines.
# You may already know of this concept under the name of fibers.
x = new Coroutine function() {
i = 0
while(true) {
i++
Coroutine.yield(i)
}
}
println(x.resume) # Prints out 1
println(x.resume) # Prints out 2
println(x.resume) # Prints out 3
# etc...
Wat je dus zo in php zou kunnen implementeren?
PHP:
1
2
3
4
5
| function x_resume()
{
static $i = 0;
return ++$i;
} |
Of natuurlijk gewoon met een normale klasse.
Maar is het echt verstandig om op zo'n manier de control-structure over meerdere delen van je code te splitsen? Je kan er vast hele krachtige dingen mee doen, maar er bestaan al in de normale syntax voldoende methoden om iig jouw voorbeeld te bereiken. Wat voegt het toe, waarbij het echt beter is om deze aanpak te gebruiken?
Feedback is altijd welkom

Bij deze wat puntjes
Overigens is .oisyn in de eerdere discussie nog een punt vergeten bij zijn 0 == 'blaat' bij php hetze

Want dit is toch wel een belangrijke reden waarom deze keuze raar is:
PHP:
1
2
3
4
5
| $a = 'blaat';
$b = 0;
if($a == $b){echo 'a == b';} // true
if($a){ echo 'a == true';} // true
if($b){ echo 'b == true';} // false |
Het ergste hierbij is niet eens dat $a naar true evalueert in het tweede statement, maar dat je van $b eigenlijk niet zo eenvoudig kan controleren of het een integer is waarbij 0 ook een geldige waarde is. Kwa aangeboden mogelijkheden komt is_numeric in de buurt, maar een float is geen integer. En domweg casten naar int en kijken of er een integer is, is ook raar want een string is geen int.
Gelukkig is dit met name relevant bij het controleren van user-input en dat doe je doorgaans maar een maal in je script-executie, waardoor je er een regexp of iets in die geest op los kan laten, zonder dat het te duur wordt.