2010-05-14 3 views
1

Je suis à la recherche d'un langage qui puisse facilement analyser des expressions mathématiques, mais aussi être capable d'appeler des fonctions et des variables de référence si nécessaire. Jeval semble être ce que je cherche, mais malheureusement je travaille en C#. Existe-t-il un .Net basé sur jeval?Y at-il quelque chose de similaire à jEval pour C#/.net?

+0

fait, quelqu'un sait plus sur l'évaluateur d'expression discuté ici: http://www.codeproject.com/KB/recipes/eval3.aspx? Cela peut suffire à mes besoins tant que je peux ajouter des macros et des fonctions d'appel. – Calvin

Répondre

2

En C# 4.0, il n'y a rien directement disponible pour vous. On s'attend à ce que dans C# 5.0, vous le voyiez, mais cela ne vous aide pas maintenant.

Il y a une alternative ... vous pouvez utiliser le code DOM pour compiler un code à la volée, puis exécutez: Quick example.

Il y a, malheureusement, quelques inconvénients importants à cette approche. D'abord, c'est lent. Sur une machine moderne, cela peut prendre jusqu'à un quart de seconde, juste pour compiler le plus petit extrait de code. Deuxièmement, vous créez en fait une nouvelle DLL chargée à chaque fois que vous le faites. Si vous avez un système qui aime beaucoup exécuter du code dynamique, vous aurez une tonne de DLL générées dynamiquement dans votre espace de travail. Pour résoudre ce problème, vous pouvez exécuter le code dynamique dans un domaine d'application distinct, mais vous commencez à devenir vraiment compliqué.

Ma recommandation: Utiliser un langage de script intégré, comme IronRuby et générer du code Ruby à la place. Vous pouvez évaluer les langages de script intégrés de manière beaucoup plus rapide que l'approche que je viens de décrire.

+0

Iron Python est un bon aussi. Surtout s'il connaît déjà Python. – marr75

+0

C'est une approche très dangereuse ... tout code valide entré par l'utilisateur pourrait être compilé et exécuté, et vous ne pouvez pas facilement vérifier que ce code est sûr. –

+0

Je considère l'approche ironpython, je ne suis pas trop inquiet au sujet des personnes modifiant potentiellement les fichiers de script.Je suis plus préoccupé par le fait d'avoir quelque chose qui peut sembler syntaxiquement assez simple, mais référence les variables et les fonctions facilement – Calvin

3

Vous pouvez utiliser un langage DLR comme IronRuby pour ce faire. Vous pouvez exécuter (eval) un fichier de script à partir d'une application C#.

0

Vous pouvez le faire avec la réflexion. Je n'ai pas les détails avec moi, mais j'ai utilisé la réflexion pour exécuter une chaîne contenant le nom d'un objet que je voulais utiliser.

0

Si JavaScript vous semble intéressant, jetez un oeil à Jint, un interpréteur JS pour .NET. Au lieu de compiler du code et de traiter avec AppDomains, Jint implémente réellement un interpréteur JS. Vous pouvez exposer des variables/méthodes de vos classes .NET à des scripts, et les scripts peuvent renvoyer des valeurs à votre application C#.

Vaut vraiment le détour.

0

Il y a un moyen facile de le faire, en utilisant la fonction JScript eval:

  • créer un fichier source JScript, JsMath.js:

    class JsMath 
    { 
        static function Eval(expression : String) : double 
        { 
         return eval(expression); 
        }; 
    } 
    
  • compilez à une DLL:

    > jsc /t:library JsMath.js 
    
  • dans votre projet C#, ajoutez une référence à JsMath.dll et appeler la méthode JsMath.Eval:

    double x = JsMath.Eval("2 + 3 * 4"); 
    
Questions connexes