2013-08-31 2 views
6

Weil ich Lisp-Syntax und Python-Bibliotheken verwenden möchte.Gibt es ein Werkzeug, um Lisp-Code in Python zu übersetzen?

Vielleicht einige Tools wie Parenscript, aber generiert Python-Code anstelle von Javascript.

+0

Welche Lippen? Common Lisp, Scheme, elisp, autocad lisp? – lpapp

+0

Sie könnten es tun, aber es wäre eine schreckliche Sauerei. Der Code, den du schreiben würdest, wäre kein gutes Lisp * oder * gutes Python. Sie würden wahrscheinlich einen Stack-Überlauf erhalten, wenn Sie Lisp direkt übersetzen wollten, und Sie müssten Lisp-ähnliche Äquivalente aller Python-Kontrollfluss-Strukturen erfinden. – user2357112

+0

@LaszloPapp Beste gemeinsame Lisp sein. Und ich kann auch andere Dialekte akzeptieren. – SaltyEgg

Antwort

7

Ich habe ein wenig mit einem Lisp compiler targeting Python bytecode experimentiert.

Sie können eine small video here sehen.

Es ist nur ein Proof-of-Concept-Spielzeug, aber es ist IMO ein praktikabler Pfad und das Endergebnis wäre in der Lage, frei von Python aufrufen und aufgerufen werden (und es wäre mit jeder Python-Erweiterung Bibliothek kompatibel). All dies hält jedoch die Kraft von Makros (Metaprogrammierung ist wahrscheinlich der Bereich, in dem Python am weitesten von Lispeln entfernt ist). Der Python-Quellcode anzusteuern, ist eher ärgerlich, da explizite Syntaxeinschränkungen das Kompilieren von Lisp erschweren (zB Zuweisung ist kein Ausdruck, keine Anweisung ist in Lambda erlaubt, gefangene Variablen sind in Python 2 schreibgeschützt) .x).

Die VM-Laufzeit hat jedoch diese Einschränkungen nicht und Python-Bytecode ist einigermaßen nett.

Mein Spielzeug kann derzeit Python 2.x, Python 3.x und funktioniert sogar mit PyPy (so erhalten Sie auch einen JIT-Compiler).

Natürlich wäre das Ziel, eine vollständige konforme Common Lisp-Implementierung zu werden, aus technischer Sicht ein IMO-Nonsense, aber ein auf Python-Laufzeittypen basierender und mit Python-Objektsystemen kompatibler Dialekt könnte ein sinnvolles Werkzeug für praktische Anwendungen sein .

+0

Brilliantes Projekt! – SaltyEgg

+1

Schauen Sie sich auch mein [Psil] (https://github.com/ghewgill/psil) -Projekt an, an dem ich vor einigen Jahren gearbeitet habe, kompiliert es nach Python AST und verwendet dann den Python-Compiler, um Bytecode zu generieren. Es ist ein anderer Ansatz für das gleiche Problem. (Als Bonus gibt es sogar einen AST-zu-Source-Decompiler!) –

+0

@GregHewgill: aber wie kann man lesen/schreiben geschlossen über vars auf Python 2.x durch die AST gehen? Mit Bytecode-Level ist ok (die Laufzeit hat kein Problem damit), aber ich dachte, dass es unmöglich gewesen wäre, den AST-Level zu verwenden, weil "nonlocal" fehlt. – 6502

3

Ich glaube, dass Hy ist, was Sie suchen. Aus dem Tutorial:

Hy wandelt in Python eigenen abstrakten Syntaxbaum, so dass Sie bald beginnen werden feststellen, dass alle die bekannte Kraft des Pythons an Ihren Fingerspitzen.

Beachten Sie jedoch, dass Hy nicht Common Lisp ist, so dass Sie nicht ausschneiden und einfügen können.

+0

Das ist cool ~ Aber ich fand, dass clojure-py besser für mich geeignet ist, und ich suche immer noch nach besseren. – SaltyEgg

+1

Können Sie Hy-Code in Python konvertieren? – Zaz

+0

Die Website von Hy sagt, dass [ein Zitat funktioniert wie in den meisten Lisp-Dialekten] (http://docs.hylang.org/en/stable/language/api.html) und es scheint nicht, eine Quellübersetzungsfunktion zu sein. –

Verwandte Themen