Sto abbozzando un progetto di qualcosa (machine learning di funzioni) che preferibilmente vorrà un linguaggio di programmazione funzionale, e anche l'introspezione, in particolare la possibilità di esaminare il codice del programma in qualche formato piacevolmente trattabile, e preferibilmente anche la possibilità di ottenere il codice generato dalla macchina compilato in fase di runtime, e mi chiedo quale sia il linguaggio migliore per scriverlo. Lisp ha ovviamente potenti capacità di introspezione, ma i linguaggi tipizzati staticamente hanno anche dei vantaggi; quelli che sto considerando sono:
Non si può semplicemente analizzare il codice sorgente come un normale interprete o compilatore? Perché hai bisogno di introspezione?
F # - la piattaforma .Net ha una buona storia qui, è possibile leggere il codice byte in fase di esecuzione e anche emettere il codice byte e ottenerlo compilato; Presumo che non ci siano problemi ad accedere a queste strutture da F #.
F # ha un meccanismo di quotazione rudimentale ma è possibile solo citare alcune espressioni e non altri tipi di codice, in particolare definizioni di tipo. Inoltre, il suo meccanismo di valutazione è di ordine di grandezza più lento della compilazione originale, quindi è fondamentalmente completamente inutile. È possibile utilizzare la riflessione per analizzare le definizioni dei tipi, ma, ancora una volta, è abbastanza rudimentale.
È possibile leggere il codice byte ma è stato compilato in modo da perdere molte informazioni e strutture.
F # ha anche la tecnologia di lexing e parsing (in particolare fslex, fsyacc e FParsec) ma non è maturo come OCaml.
Haskell, Ocaml - hanno strutture simili, tramite codice byte o albero di analisi?
Haskell ha Template Haskell ma non ho mai sentito di nessuno che lo usi (abandonware?).
OCaml ha il suo sistema macro Camlp4 e alcune persone lo usano ma è poorly documented.
Come per il lexing e l'analisi, Haskell ha alcune librerie (in particolare Parsec) e OCaml ha many libraries.
Ci sono altre lingue che dovrei anche guardare?
I linguaggi di riscrittura a termine come Mathematica sarebbero una scelta ovvia perché rendono banale la manipolazione del codice. La lingua Pure potrebbe essere di interesse.
Si potrebbe anche considerare MetaOCaml per le sue funzionalità di compilazione in fase di esecuzione.
Perché hai bisogno di introspezione? –
Dal lato della lettura, è essenziale perché una caratteristica centrale del sistema immaginato è la capacità di analizzare il codice scritto umano. Dal lato della scrittura, non essenziale ma piacevole, perché nei casi in cui un codice generato dalla macchina viene spesso eseguito, la sua compilazione lo renderà più veloce. – rwallace
Bella domanda, di recente mi sono interrogato su questo. Il mio lavoro diurno è un comune gioco di parole e ho fatto alcune cose per generare automaticamente graficamente call graphviz usando l'introspezione e mi sono chiesto se haskell ha qualcosa di abbastanza potente per fare qualcosa di simile. – asm