@BlackJack Beispiel negativer Index-Zugriff:
Code: Alles auswählen
coffee> '12345'[1]
'2'
coffee> '12345'[1..]
'2345'
coffee> '12345'[-1]
undefined
coffee> '12345'[-1..]
'5'
Warum gibt es negative Ranges, aber keine negativen Indizes?!
Oder Beispiel Splicing mit negativen Indizes:
Code: Alles auswählen
coffee> a = [1, 2, 3, 4, 5]; a[1..3] = [10]; a
[ 1, 10, 5 ]
coffee> a = [1, 2, 3, 4, 5]; a[1..-2] = [10]; a
[ 1,
10,
2,
3,
4,
5 ]
Ich finde das konfus, und ich glaube nicht, dass der Versuch, einen ordentlichen Compiler zu schreiben, daran etwas ändert. Ist ja nicht so, als hätte es die Diskussionen darüber nicht schon im Issue Tracker gegeben, beispielsweise über das Scoping, doch der Entwickler von CoffeeScript
erkennt nicht einmal das Problem, hat also offensichtlich nicht einmal verstanden, warum es in Programmiersprachen überhaupt so etwas wie Namensräume gibt. Ich kann mir nicht helfen, ich fühle mich da an die allzu bekannte "Kompetenz" der PHP-Kernentwickler erinnert...
@webspider Sicher nicht. Diese Sprache ist genauso kaputt wie CoffeeScript. Aus der
Doku:
- "Added yes / on as aliases to true and no / off as aliases to false."
- "Dashes are now supported in identifiers, they get converted into camel case."
Derselbe Drang zu völlig überflüssigen Schlüsselwörtern und mehrdeutiger Syntax mit Hang zu ganz subtilen Bugs...
Das Ganze im Beispiel:
Code: Alles auswählen
livescript>spam-eggs
ReferenceError: spamEggs is not defined
livescript> spam -eggs
ReferenceError: eggs is not defined
livescript> spam- eggs
ReferenceError: spam is not defined
Man beachte, dass die exakte Position des Leerzeichens über die syntaktische Interpretation entscheidet. Die erste Eingabe ist ein Funktionsaufruf, die zweite eine Anwendung des binären Subtraktionsoperators, und die dritte wiederum ein Funktionsaufruf mit einem Argument, dem der unäre Negationsoperator voransteht. Wehe dem, der mal ein Leerzeichen vergisst... nicht einmal Ruby ist so zickig. Man beachte ferner, dass die Fehlermeldung der erste Eingabe den Namen
nach der Konvertierung enthält... sehr hilfreich.
Das bedeutet im Übrigen auch, dass Refactoring von CamelCase-Namen richtig Spaß macht, denn man darf sich auf die Suche nach gleich zwei Namensvarianten machen. Die dritte, Camel-Case mit Bindestrich, muss man "glücklicherweise" nicht berücksichtigen, denn diese Variante ist ironischerweise nicht erlaubt:
Code: Alles auswählen
livescript> spam-Eggs
ReferenceError: Inconsistent use of spamEggs as spam-Eggs on line 1
Danke, danke, gibt ja sonst keine anderen Probleme...
Die Begründung auf dieses Feature lautet übrigens: "Rationale: enable different styles which other people may enjoy. As in the lisp family of languages." Von LISP aber haben die Entwickler offensichtlich nicht den Hauch einer Ahnung, denn mit "Stil" hat das nichts zu tun. LISP's einzige Syntax sind S-Expressions (und einige syntaktische Symbole), mithin gibt es überhaupt keine Operatoren, und man kann Symbole benennen wie man lustig ist. Das dieses Prinzip nicht einfach so auf eine Sprache zu übertragen ist, die eine andere Syntax hat, insbesondere eine mit Infix-Operatoren, ist eigentlich offensichtlich... außer eben für die Livescript-Entwickler.
Dass die Livescript-Entwickler keine Ahnung von LISP haben, zeigt sich dann auch, wenn man den LISP-"Stil" konsequent auf Livescript übertragen möchte. Dann nämlich wird man bitter enttäuscht:
Code: Alles auswählen
livescript> spam+eggs
ReferenceError: spam is not defined
livescript> spam/eggs
ReferenceError: spam is not defined
Ganz großes Tennis.
Lessons learnt:
- Pattern Matching alleine macht noch keine gute Sprache.
- Nimm keine Sprachen als Vorbild, die Du nur von Wikipedia kennst.
Die Livescript-Entwickler haben diese Stunden wohl verschlafen.
Edit: Ich kannte diese Sprache vorher nicht, ich habe sie erst durch Deinen Beitrag kennengelernt. Es hat mich also weniger als eine halbe Stunde gekostet, in dieser mir völlig unbekannten Sprache einen derartigen Design-Fehler zu finden. Das hat nicht mal PHP geschafft.