È 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
.
Non è sempre compilato in modo statico. Dai un'occhiata a 'ghci' – Yacoby
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. –
... o addirittura Abbracci. – dave4420