Documentos de Académico
Documentos de Profesional
Documentos de Cultura
en VB .Net
Contenido
Introducción
La clase Evaluador
El método PrecompilarAssembly
El método Evaluar
Implementado Evaluador
Conclusión
Referencias
Introducción
Recuerdo con nostalgia cuando, con GWBasic, aprendí un artilugio que consistía en que
nuestro código creara un archivo secuencial (con extensión .bas) que contuviera el código
de una función, y dentro de esta función escribiéramos la expresión que queríamos
evaluar. Claro, esto era posible pues GW era un lenguaje interpretado y no existía un
compilador que generara un ejecutable.
oSC.Language = "VBScript"
MsgBox oSC.Eval(expToEval)
Esta técnica, aunque resulta muy útil y en algunos casos soluciona nuestros problemas,
está limitada a que sólo podemos usar objetos y/o funciones definidas por VBScript
dentro del parámetro Expression del método Eval.
Todo esto ha servido para que reflexione sobre cuán viejo soy, aunque éstas no son las
técnicas de reflexión que se usan en VS .Net. De éstas vamos a hablar más adelante.
Crearemos entonces una clase Evaluador. Esta creará un assembly con el código que
deseamos ejecutar, en este caso un método o función con la expresión a evaluar. Luego,
usando la reflexión invocará este método y obtendremos los resultados. Suena sencillo…
¡Realmente lo es!
La clase Evaluador
Imports System.Text
Imports System.CodeDom.Compiler
Imports System.Collections.Specialized
End Sub
El método PrecompilarAssembly
Imports System.Math
Vemos que existen tres factores cambiantes: la expresión, los parámetros del método
Eval y los namespaces. Por lo tanto nuestro método Precompilarfuncion recibirá tres
parámetros, correspondientes a esos elementos. Veamos entonces el método
PrecompilarAssembly:
mParametros = Trim(mParametros)
If mParametros.Length > 0 Then
mParametros = Trim(Mid(mParametros, 2))
End If
El método Evaluar
Implementado Evaluador
Veamos ahora cómo usar nuestra clase Evaluador. En el ejemplo se evaluara la
expresión z(x,y) = Log(x) + y; con x = 100, y=3.
Conclusión
Hemos utilizado las técnicas de compilar mediante código para crear un assembly en
memoria y luego, mediante la reflexión, invocar sus métodos. Se me ocurren en este
momento no menos de 10 mejoras que se pueden hacer a la clase Evaluador. Sin
embargo, la he construido con un propósito específico: crear una clase Graficador que
implementará la clase Evaluador para graficar funciones matemáticas y para este fin,
está más que bien como está ahora.