2010-03-18 4 views

risposta

1

Non esiste un equivalente eval, Haskell è un linguaggio compilato staticamente, uguale a C o C++ che non ha né eval.

+1

Non è sempre compilato in modo statico. Dai un'occhiata a 'ghci' – Yacoby

+1

Sì, ma non è possibile incorporare facilmente l'intero ghci nella tua applicazione standalone. Ovviamente puoi, ad esempio, usare TCC anche da C, ma non è lo stesso di "eval" in linguaggi dinamici decenti, è sempre un hack. –

+1

... o addirittura Abbracci. – dave4420

25

È vero che in Haskell, come in Java o C++ o lingue simili, è possibile chiamare nel compilatore, quindi caricare dinamicamente il codice ed eseguirlo. Tuttavia, questo è generalmente pesante e quasi mai perché la gente usa eval() in altre lingue.

Le persone tendono a utilizzare eval() in una lingua perché, date le funzionalità di quella lingua, per alcune classi di problemi, è più semplice costruire una stringa dall'input del programma che assomiglia al linguaggio stesso, piuttosto che analizzare e valutare direttamente l'input. Ad esempio, se si desidera consentire agli utenti di immettere non solo numeri in un campo di input, ma semplici espressioni aritmetiche, in Perl o Python sarà molto più semplice chiamare semplicemente eval() sull'input che scrivere un parser per la lingua dell'espressione che si desidera consentire. Sfortunatamente, questo tipo di approccio porta quasi sempre a una scarsa esperienza utente (i messaggi di errore del compilatore non erano pensati per i non programmatori) e apre buchi di sicurezza. Risolvere questi problemi senza usare eval() generalmente richiede un bel po 'di codice.

In Haskell, grazie a cose come Parsec, in realtà è molto semplice scrivere un parser e un analizzatore per questi tipi di problemi di input e rimuove considerevolmente il desiderio di eval.

+0

Potrebbe essere vero, ma non risponde alla domanda. –

10

Non esiste un 'eval' incorporato nella lingua, sebbene Template Haskell consenta la valutazione del tempo di compilazione.

Per runtime 'eval', ad esempio metaprogrammazione runtime, ci sono numerosi pacchetti su Hackage che importano essenzialmente GHC o GHCi, incluso il vecchio pacchetto hs-plugins e il pacchetto hint.

+4

Questo non ha nulla in comune con un'eval in stile Python. Non avrai accesso ai metadati del codice. Quello di cui stai parlando è solo la costruzione del codice Haskell all'interno di Haskell, rimane scollegato. L'unico modo per avere un'eval corretta per un linguaggio compilato staticamente (specialmente se esiste una compilazione separata) è quello di conservare tutti i metadati (tipi, tabelle dei nomi, ecc.) E collegare il compilatore o l'interprete in qualsiasi binario. –

+2

Btw., Vedere il primo esempio nella domanda. Non puoi mai farlo in Haskell. Non è possibile passare le informazioni su una "x" vincolante locale nella funzione "eval". –

+5

Vedere il documento hs-plugins su come conservare i metadati - è fatto tramite la capacità di riflessione in fase di compilazione (TH) di Haskell, combinata con il meccanismo di tipo dinamico Data.Dynamic per i punti di giuntura. http://www.cse.unsw.edu.au/~dons/hs-plugins/ Riflessione + generazione del codice di runtime + dinamica per i punti di giuntura fornisce un modello di metaprogrammazione multistadio completo. –