12
votes

Équivalent de python eval dans haskell

Il existe une fonction dans Python appelé eval code> qui prend l'entrée de chaîne et l'évalue.

>>> x = 1
>>> print eval('x+1')
2
>>> print eval('12 + 32')
44
>>>  


0 commentaires

5 Réponses :


1
votes

Il n'y a pas d'équivalent d'évaluation, HASKELL est une langue de compilée statiquement compilée, identique à celle C ou C ++ qui n'a pas d'évaluation ni.


7 commentaires

Ce n'est pas toujours compilé statiquement. Jetez un coup d'œil à ghci


Oui, mais vous ne pouvez pas intégrer facilement l'ensemble de GHCI Replé dans votre application autonome. Bien sûr, vous pouvez également utiliser TCC de C aussi, mais ce n'est pas la même chose que «eval» dans des langages dynamiques décentes, c'est toujours un piratage.


Être statiquement dactylographié n'est pas une barrière pour les métaprogramming d'exécution. Cela signifie simplement que votre fonction «eval» doit également faire une vérification de type. Que les plugins de haskell et les packages de conseil font. Métaprogrammation de l'exécution dactoriie.


J'ai dit «statiquement compilé», pas «typé statiquement». Et oui, il n'y a pas d'évaluation à Haskell. Ce n'est pas une langue dynamique avec un interprète intégré. Toutes les options disponibles invoquent un compilateur détaché sous une forme ou une autre, ou spécifique à la mise en œuvre.


Et, un autre point important: Haskell ne préserve aucune métadonnée dans un binaire compilé (oui, oui, c'est exactement ce que je voulais dire par une compilation statique, merci pour un bowvote). Votre simulation 'eval' ne sera jamais capable d'interagir avec un environnement environnant. Vous ne passerez pas une variable à celui-ci, ne vous ferez pas référence à un type de données existant, etc.


Être statiquement typé avec la sophistication de Haskell est en fait un avantage dans MetaProgramming d'exécution. À l'aide de Typeclasses, la bibliothèque d'évaluation pourrait recevoir des informations de type très précises sans le programmeur les indiquant explicitement, comme si elle est faite dans la bibliothèque POSIX.REGEX.


"Vous ne pouvez pas emballer facilement l'ensemble de GHCI Replé dans votre application autonome." - Est également faux, c'est ce que la bibliothèque d'indice fait - exporte GHCI en tant que module HASKELL. Lambdabot l'utilise, yi l'utilise, Riot l'a utilisé. L'intégration de l'interpréteur Haskell dans votre application Haskell n'est pas entièrement rare et il y a un soutien décent à le faire.



12
votes

Il n'a pas de fonction d'évaluation intégrée. Cependant, certains paquets sur Hackage qui peut faire le même type de chose . ( Docs ) . Merci à @Luqui Il y a aussi indice .


1 commentaires

Astuce est une version plus facile de la même chose: Hackage.hakell.org/package/hint



24
votes

Il est vrai que dans Haskell, comme dans Java ou C ++ ou des langues similaires, vous pouvez appeler appeler au compilateur, puis chargez de manière dynamique le code et l'exécuter. Cependant, c'est généralement un poids lourd et presque jamais pourquoi les gens utilisent eval () dans d'autres langues.

Les gens ont tendance à utiliser eval () dans une langue car étant donné que les installations de la langue, pour certaines classes de problème, il est plus facile de construire une chaîne de la part du programme qui ressemble à la langue elle-même, plutôt que d'analyser et d'évaluer directement l'entrée.

Par exemple, si vous souhaitez permettre aux utilisateurs de saisir non seulement des numéros dans un champ de saisie, mais des expressions arithmétiques simples, dans Perl ou Python, il va être beaucoup plus facile d'appeler eval () Sur l'entrée que d'écrire un analyseur pour la langue d'expression que vous souhaitez autoriser. Malheureusement, ce type d'approche entraîne presque toujours une mauvaise expérience utilisateur dans l'ensemble des utilisateurs (les messages d'erreur du compilateur n'étaient pas destinés aux non-programmeurs) et ouvrent des trous de sécurité. Résoudre ces problèmes sans utiliser eval () implique généralement un peu de code juste.

in Haskell, merci à des choses comme parsec , il est en fait très facile Écrire un analyseur et un évaluateur pour ces types de problèmes d'entrée et supprime considérablement le désir de eval .


1 commentaires

Cela peut tous être vrai, mais cela ne résout pas la question.



11
votes

Il n'y a pas de «eval» intégré dans la langue, bien que Mody Haskell permet une évaluation du temps de compilation.

Pour l'exécution 'EVAL' - I.E. METAPROGRAMMING DE RUNTIME - Il existe un certain nombre de packages sur Hackage qui importent essentiellement GHC ou GHCI, y compris l'ancien package HS-plugins et le package d'indice.


6 commentaires

Cela n'a rien en commun avec un eval de style Python. Vous n'aurez pas accès à vos métadonnées de votre code. De quoi vous parlez consiste simplement à construire un code Haskell de Haskell, il reste détaché. Le seul moyen d'avoir une évaluation appropriée pour une langue statique compilée (surtout s'il existe une compilation distincte) consiste à préserver toutes les métadonnées (types, tables de noms, etc.) et relier le compilateur ou l'interprète dans n'importe quel binaire.


BTW., Voir le premier exemple dans la question. Vous ne pouvez jamais faire cela à Haskell. Il n'est pas possible de transmettre les informations sur une liaison locale «X» dans votre fonction 'eval'.


Consultez le papier HS-Plugins pour la manière de préserver les métadonnées - il se fait via la capacité de réflexion de la compilation de Haskell (TH), associée au mécanisme de type dynamique data.dynamic pour les points d'épissure. CSE.unsw.edu.au/~dons/hs-plugins Réflexion + Génération de code d'exécution + Dynamique pour les points d'épissure vous donne un modèle de métaprogramming à plusieurs étages complet.


SK, ce n'est tout simplement pas vrai. Ce que Don dit, et jetez un coup d'œil au paquet d'indice, spécifiquement à la fonction "Interpre", ce qui apporte une valeur évaluée dans l'environnement actuel. En ce qui concerne l'introduction d'un «X» local dans la portée, simplement évaluer une fonction puis l'appliquer à x.


Bien qu'il soit vrai, qu'il existe des moyens d'atteindre les mêmes extrémités, et bien ils sont des moyens plus sûrs et plus contrôlés, @ SK-Logic a un point valide: Eval () dans Python propose une source de programme authentifiée au moment de l'exécution directe, Accès complet à l'environnement contenant l'EVAL () Même sans le programmeur l'intention . Dans HASKELL, vous devriez être très explicite sur ce que vous vouliez fournir l'accès au code d'exécution, qui est une bonne chose , mais différente de Eval () néanmoins.


La partie difficile est que comment amener l'environnement environnant en eval, il n'est pas difficile d'apporter la production d'Eval dans l'hôte.



4
votes

HS-plugins a System.eval.hakell .


0 commentaires