PyScript

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Aza Raskin findet (zurecht), dass JavaScript eine hässliche, Java-artige (bzw. C-artige) Syntax hat und hat daher PyScript, einen syntaktischen Zuckerguss in Form eines Quellcodetransformators gebaut: http://www.azarask.in/blog/post/making- ... -not-suck/

Es ist noch nicht lange her, da hat Jeremy Ashkenas mit CoffeeScript ebenfalls so einen Zuckerguss vorgestellt: http://jashkenas.github.com/coffee-script/

CoffeeScript geht deutlich weiter und als ich da zuerst drauf geschaut hatte, benutzte es noch die Konvention von Potion (einer unvollständigen experimentellen Sprache von _why), Blöcke mit einem ":" zu beginnen und mit einem "." zu beenden. Nun scheint aber auch CoffeeScript wie PyScript Einrückung zur Blockbildung zu nutzen.

Azas Version ist ein Zwitter aus Python und JavaScript. Er benutzt z.B. "function" statt "def" und muss Variablen explizit mit "var" definieren, fühlt sich also weder wie Python noch wie JavaScript an. CoffeeScript ist "dank" ":" für Zuweisungen sowieso fremdartig (wenn auch konsequent).

Man könnte natürlich auch ein JavaScript-kompatibles Subset von Python bauen. So schwer wäre das IMHO auch nicht, die Herausforderung an einen Parser bzw. Scanner ist sowieso das Einrücken, nicht die restlichen Transformationen. Allerdings: Azas Variante ist so ähnlich zu JavaScript dass er u.U. ganz ohne AST-Parser nur mit einem kleinen Scanner, der passend Klammern einfügt, auskommt.

Was meint ihr? Python-Syntax für "das Web"? Oder sind { } doch die besseren Blöcke? Zumindest kann man derartige Blöcke auch inline (z.B. als Attributwerte) benutzen.

Stefan
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Für mich fühlt sich die Einrück-Regel von Python in den meisten Fällen richtig, manchmal aber auch gezwungen an. Zum Beispiel bei Code mit sehr vielen sehr kleinen Blöcken, die aber mehr als ein Statement enthalten und daher nicht problemlos hinten an gestellt werden können (if a=b: c=a; i+=1). Hier würde ich gerne auf eine Art und Weise programmieren, die mir sauber und übersichtlich erscheint, kann es aber nicht, da Python so etwas verbietet.

Zu den wichtigsten JavaScript-Features und am häufigsten benutzten Code-Konstrukten, die in Python unmöglich sind, zähle ich auch die mehrzeiligen Lambdas (anonyme Funktionsblöcke). JavaScript arbeitet sehr viel mit Events und Callback-Funktionen. Da macht es einfach Sinn, Funktionsblöcke direkt als Parameter zu übergeben, ohne sie vorher definiert haben zu müssen.

Außerdem wird JavaScript oft in HTML eingebettet, was die Einrückung zum Teil abhängig vom umliegenden Code werden lässt. Einrückung im onclick-Attribut eines HTML-Elements ist zum Beispiel nicht möglich.

Daher meine ich, das eine Python-for-the-web Variante einen alternativen Syntax für explizite Blöcke braucht oder eher die Einrück-Regel fallen lassen sollte. Ich persönlich finde folgende Variante am besten:

Code: Alles auswählen

def block1(parameter):
    statement1; statement2
    statement3
end

block2 = def(paramenet):
    statement
end

value = block1(def(parameter): statement1; statement2; end)
Also: Einrückung ist irrelevant. Blöcke werden mit ':' begonnen und 'end' beendet. Mehrere Statements pro Zeile werden mit ';' getrennt. Ein ';' am Ende der Zeile ist nicht nötig. Das def-Keyword funktioniert auch ohne Funktionsnamen und gibt dann eine anonyme Funktion zurück.

Und wenn wir schon mal dabei sind: Jeder Block ist automatisch auch ein Try-Block:

Code: Alles auswählen

def do_something(x):
    ...
    return x
except SomeError, e:
    return None
end
*edit* Genau betrachtet kann man das auch so zusammen fassen: Ruby wäre besser geeignet als Python.
Bottle: Micro Web Framework + Development Blog
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

sma hat geschrieben:Azas Version ist ein Zwitter aus Python und JavaScript. Er benutzt z.B. "function" statt "def" und muss Variablen explizit mit "var" definieren, fühlt sich also weder wie Python noch wie JavaScript an. CoffeeScript ist "dank" ":" für Zuweisungen sowieso fremdartig (wenn auch konsequent).
[...]

Was meint ihr? Python-Syntax für "das Web"? Oder sind { } doch die besseren Blöcke? Zumindest kann man derartige Blöcke auch inline (z.B. als Attributwerte) benutzen.
Mir gefällt von den beiden spontan CoffeeScript besser. Aber so wirklich begeistern tut mich das nicht, da fällt mir auch unweigerlich wieder Cappuccino ein und deswegen kann ich dazu nur sagen: Lieber ein vernünftiger Smalltalk-Dialekt fürs Web, als noch eine halbgare Sprache. Davon gibts ja sowieso schon genug.
Defnull hat geschrieben:Für mich fühlt sich die Einrück-Regel von Python in den meisten Fällen richtig, manchmal aber auch gezwungen an. Zum Beispiel bei Code mit sehr vielen sehr kleinen Blöcken, die aber mehr als ein Statement enthalten und daher nicht problemlos hinten an gestellt werden können (if a=b: c=a; i+=1). Hier würde ich gerne auf eine Art und Weise programmieren, die mir sauber und übersichtlich erscheint, kann es aber nicht, da Python so etwas verbietet.
Ich verstehe jetzt dein Problem nicht. Das geht doch in Python.
Daher meine ich, das eine Python-for-the-web Variante einen alternativen Syntax für explizite Blöcke braucht oder eher die Einrück-Regel fallen lassen sollte. Ich persönlich finde folgende Variante am besten:
Nee danke, dann hat man wieder solche hübschen Ruby-Konstrukte:

Code: Alles auswählen

# code ...
      end
    end
  end
end
Dann lieber {}.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Auf Code in HTML-Attributen oder in tiefer eingerückten SCRIPT-Elementen könnte man ja verzichten. Da es ist IMHO sowieso besserer Stil, den vom HTML zu trennen.

Dennoch, wirklich überzeugend ist das alles nicht...

Hier http://paste.pocoo.org/show/166283/ sind ein paar Syntaxbeispiele für einen Ausdruck einer Art, wie ich sie gerade letzte Woche benutzt habe. Drei verschachtelte Funktionen.

Ich muss sagen, CoffeeScript ist kompakt, auch wenn eigentlich nur "function" durch "=>" ersetzt wird. Bei allen folgenden Varianten beginnt das API nicht mehr so recht zu passen. JQuery nutzt (wie viele andere JS-Bibliotheken) aus, dass man bei Funktionen das implizite "this" überschreiben kann. Das ist weder bei Smalltalk noch bei Ruby oder Python möglich bzw. guter Stil. Daher muss da jeweils der innerste Block das Element explizit übergeben bekommen. Für die Python Variante habe ich angenommen, mit "do:" kann man (auch) mehrzeilige Blöcke definieren.

Stefan
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wäre schon cool, wenn man JavaScript mit Python Syntax hätte. (Ich mag Semikolon und Eckige Klammern nicht). Doch ein "compilieren" von Python Syntax in JavaScript ist IMHO viel zu umständlich.
Aber nettes proof of concept.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lunar

@Defnull: "In the face of ambiguity, refuse the temptation to guess." :)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich sehe, man löst ein Problem und macht zehn neue auf.

Ich fänds trotzdem schick. 8)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

jens hat geschrieben:Doch ein "compilieren" von Python Syntax in JavaScript ist IMHO viel zu umständlich.
Eigentlich gar nicht, angenommen, ich schreibe in mein HTML solche Blöcke: <script type="text/sma">...</script>, dann kann ich mit folgendem kleinen Codeschnipsel diese "on the fly" übersetzen, wenn der Browser die Seite lädt:

Code: Alles auswählen

$(function(){
  $("script[type=text/sma]").each(function(){
    $(this).replaceWith("<script>" + translate(this.text) + "<\/script>");
  });
});
Ohne JQuery ist es nur wenig aufwendiger und natürlich muss man jetzt `translate()` passend implementieren. Für einfache syntaktische Transformationen a la PyScript und wahrscheinlich auch a la CoffeeScript sollte das nicht so aufwendig sein.

Stefan
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wenn das funktioniert wäre es wirklich brauchbar! (btw. jQuery nutzte ich eh)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Cool!

Jetzt brauchen wir nur noch eine Python Implementierung in JavaScript :twisted:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ruby ist dort imho deutlich besser geeignet, es sei den man verändert Python dafür, dann stellt sich die Frage ob dass noch Python ist.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Den ganze try..except import Kram, hab ich mal abgetrennt: http://www.python-forum.de/topic-21604.html

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten