2013-08-31 10 views
6

Perché voglio utilizzare la sintassi di Lisp e le librerie di Python.C'è qualche strumento per tradurre il codice Lisp in Python?

Forse alcuni strumenti come Parenscript ma generano codice Python invece di Javascript.

+0

Quali labbra? Common Lisp, Scheme, elisp, autocad lisp? – lpapp

+0

Potresti farlo, ma sarebbe un pasticcio terribile. Il codice che avresti finito di scrivere non sarebbe un buon Lisp * o * buon Python. Probabilmente otterresti un overflow dello stack se provassi a tradurre direttamente Lisp e avresti bisogno di inventare equivalenti simili a Lisp di tutte le strutture di flusso di controllo Python. – user2357112

+0

@LaszloPapp Meglio essere Common Lisp. E posso accettare anche altri dialetti. – SaltyEgg

risposta

7

Ho sperimentato un po 'con un Lisp compiler targeting Python bytecode.

È possibile vedere uno small video here.

È solo un giocattolo proof-of-concept ma è IMO un percorso percorribile e il risultato finale sarebbe in grado di chiamare ed essere chiamato da python liberamente (e sarebbe compatibile con qualsiasi libreria di estensioni python). Tutto questo mantenendo comunque la potenza delle macro (metaprogramming è probabilmente l'area in cui Python è il più lontano dal lisp).

Targeting del codice sorgente Python è invece molto più fastidioso da fare perché esistono limitazioni di sintassi esplicite che rendono difficile la compilazione del Lisp (ad esempio l'assegnazione non è un'espressione, nessuna istruzione è consentita in lambda, le variabili acquisite sono di sola lettura in Python 2 .X).

Il runtime VM tuttavia non presenta queste limitazioni e il bytecode Python è abbastanza bello.

Attualmente il mio giocattolo può utilizzare Python 2.x, Python 3.x e funziona anche con PyPy (così si ottiene anche un compilatore JIT).

Naturalmente puntare a diventare un'implementazione Common Lisp completa compatibile sarebbe IMO senza senso dal punto di vista tecnico, ma un dialetto lisp basato su tipi di runtime di Python e compatibile con il sistema di oggetti Python potrebbe invece essere uno strumento ragionevole con applicazioni pratiche .

+0

Progetto brillante! – SaltyEgg

+1

Dai anche un'occhiata al mio progetto [Psil] (https://github.com/ghewgill/psil) su cui ho lavorato alcuni anni fa, che compila su Python AST e poi usa il compilatore Python per generare bytecode. È un approccio diverso allo stesso problema. (Come bonus c'è anche un decompilatore AST-source sepolto lì!) –

+0

@GregHewgill: ma come si può ottenere la lettura/scrittura chiusa su vars su python 2.x passando per l'AST? Con il livello bytecode è ok (il runtime non ha problemi con esso) ma ho pensato che sarebbe stato impossibile usare il livello AST a causa della mancanza di 'nonlocal'. – 6502

3

Credo che Hy sia quello che stai cercando. Dal tutorial:

Hy converte al proprio albero di sintassi astratta di pitone, quindi è presto iniziare per scoprire che tutto il potere familiare di pitone è a portata di mano.

Tuttavia, notare che Hy non è Common Lisp, quindi non è possibile tagliare e incollare.

+0

Questo è bello ~ Ma ho trovato che clojure-py è più adatto per me, e sto ancora cercando quelli migliori. – SaltyEgg

+1

Puoi convertire il codice Hy in Python? – Zaz

+0

Il sito di Hy dice che [la citazione singola funziona come nella maggior parte dei dialoghi Lisp] (http://docs.hylang.org/en/stable/language/api.html) e sembra che non ci sia una funzione di traduzione della fonte. –