Finde ich auch. Am schönsten sieht es immer noch so aus:jens hat geschrieben:[...]IMHO sind weder php, oder die c Variante wirklich schön gelöst.
Code: Alles auswählen
for i in xrange(10):
print i
Finde ich auch. Am schönsten sieht es immer noch so aus:jens hat geschrieben:[...]IMHO sind weder php, oder die c Variante wirklich schön gelöst.
Code: Alles auswählen
for i in xrange(10):
print i
Was meinst du? In einer Datei? Nein, natürlich nicht. Wäre zwar möglich, aber sehr unangenehm zu nutzen.sape hat geschrieben:Hmm, bin nicht sicher ob ich das verstehe. Du meinst also so einen Superinterpreter der "alle" Sprachen (die als Skins vorliegen) interpretieren kann und auch ein Mischmasch aus allen Sprachen in einem sourcecode vorkommen kann?
Nein, ich findesape hat geschrieben:Am schönsten sieht es immer noch so aus:Code: Alles auswählen
for i in xrange(10): print i
Code: Alles auswählen
for i in 0..9:
puts(i)
end
puts ist zumindest in Python keine Altlast, weil es das in Python gar nicht erst gibt. Aber gut, dann müssten wir die Funktion print mit puts überschreiben und fertig. Damit haben wir dann eine print-Funktion, die so in Python derzeit nicht einmal möglich ist.Y0Gi hat geschrieben:puts ist eine verdammte Altlast, die die Lesbarkeit vermindert. Und hast du nicht erst kürzlich gegen Altlasten gewettert?
Sowas vermisse ich für Listen Ich wünsche mir öfters sowas...Leonidas hat geschrieben:Nein, ich findesape hat geschrieben:Am schönsten sieht es immer noch so aus:Code: Alles auswählen
for i in xrange(10): print i
bis auf das 'end' klarer. Aber in Python gibt es keinen Syntactic Sugar für Range-Datentypen.Code: Alles auswählen
for i in 0..9: puts(i) end
Code: Alles auswählen
li = [1..100]
Code: Alles auswählen
li = [x for x in xrange(100)]
Nimm doch li = range(1, 101)sape hat geschrieben:Sowas vermisse ich für Listen Ich wünsche mir öfters sowas...anstat:Code: Alles auswählen
li = [1..100]
Code: Alles auswählen
li = [x for x in xrange(100)]
OK, aber was mache ich wenn ich a bis z haben will? li = [a..z] wäre da geil oder gleich li = [a..z..] + [A..Z] + [1..100]Leonidas hat geschrieben: Nimm doch li = range(1, 101)
Also so kompliziert ist das nun auch wieder nicht:sape hat geschrieben:OK, aber was mache ich wenn ich a bis z haben will? li = [a..z] wäre da geil oder gleich li = [a..z..] + [A..Z] + [1..100]
Code: Alles auswählen
import string
li = list(string.ascii_lowercase)
ls += list(string.ascii_uppercase) + range(1, 101)
Das funktioniert aber nicht wirklich, weil eine Sprache nicht nur aus Syntax, sondern eben auch aus Semantik besteht. Und die lässt sich bei unterschiedlichen Sprachen vielleicht noch in einen gemeinsamen Bytecode übersetzen, aber die Rücktransformierung in eine andere Sprache ist nicht immer möglich.cracki hat geschrieben:mit skin meine ich wie der code aussieht. mit AST meine ich die semantik des codes. der gleiche code kann in php so aussehen, in js anders und in python wieder ganz anders. so verstaendlich?
Solche Sprachen gibt's. Neben der Übergabe von Codeblöcken die erst in der aufgerufenen Funktion ausgewertet werden, kann man das auch per Metaprogrammierung lösen, also wirklich ein Makro das bei der Übersetzung ausgeführt und ersetzt wird. Mit Lisp oder Scheme kann man so etwas machen. Und bei D mit Templates oder dem ``lazy`` Schlüsselwort bei in der Argumentliste. Bei Nemerle ginge eine Makrolösung. Und in Io sieht die `while`-Schleife fast genau so aus. Io hat unheimlich wenige Schlüsselworte, alle Flusskontrollstukturen sind Methoden, die auf dem "Ur-Objekt" definiert sind. Hier ist die `while`-Schleife selbst implementiert:muss noch was loswerden. wenn man in einer sprache ausdruecken koennte, dass die argumente vor dem call nicht evaluiert werden sollen, sondern als callable oder AST, dann koennte man sowas machen:das bringt natuerlich wieder ganz andere probleme mit sich (bloecke muessten dann expressions sein, usw), ich weiss. waere aber ne ueberlegung wert, hm?Code: Alles auswählen
# macro() nimmt ne funktion, macht ein macro draus while = macro( (condition, block) { loop = { if (condition()) { block() loop() } } loop() }) a = 0 while(a < 10, print a**2 a += 1 )
Code: Alles auswählen
myWhile := method(
loop(
call evalArgAt(0) ifFalse(break)
call evalArgAt(1)
)
)
a := 0
myWhile(a < 10,
a pow(2) linePrint
a = a + 1
)
So eine Sprache die alle toll finden wird es auch in Zukunft nicht geben. Bzw. ist das was Du beschreibst, die Sprache für alles, eigentlich Assembler und die Skins sind Compiler für die verschiedensten Programmiersprachen.cracki hat geschrieben:was ich mit alledem eigentlich ausdruecken will:
es gibt keine sprache, die heute jeden menschen befriedigen kann. skins waeren eine moeglichkeit, eine sprache fuer alles zu erschaffen und diese dann fuer jeden anwendungsbereich zu verkleiden
Code: Alles auswählen
import std.stdio;
void myWhile(lazy bool test, void delegate () statement)
{
loop:
if (! test()) return;
statement();
goto loop;
}
void main()
{
ubyte a = 0;
myWhile(a < 10, { writefln(a); ++a; });
}
Ist übrigens inzwischen in Version 1.0 erschienen, grad heute auf Golem gelesen, nachdem sie hier in den letzten Tagen ein Thema war.BlackJack hat geschrieben:Hier nochmal Deine Idee von einer eigenen ``while``-Schleife in D:
1. Bin nicht dein Junge!Y0Gi hat geschrieben:RTFM, mein Junge
Schau dir mal die Konstanten im Modul `string` an.
Nicht ganz. Ich brauche wesentlich öfter Ranges mit Zahlen als mit Buchstaben. Vor allem geht es in a..z darum alle Kleinbuchstaben zu bekommen aber in 1..100 nicht darum alle Zahlen zu bekommen.sape hat geschrieben:4. [X..Y] wäre genauso "Sinnvoll" wie [1..100]
Hey, sind wir heute aggressiv? Ist irgendwie lächerlich, eine sachliche Diskussion auf ein Persönliches Flamen runterzuziehen.sape hat geschrieben:6. SELF OWNED! (Wo wir gerade dabei sind schwachsinnige Akronyme wie RTFM zu nutzen)
7. Ich denke es ist angekommen oder?