2010-04-09 23 views
12

¿Hay un F # equivalente a eval? Mi intención es hacer que mi aplicación se carga una pequeña muestra de código de un archivo y, esencialmente,F # equivalente a Eval

let file = "c:\mysample" 
let sample = loadFromFile file 
let results = eval(sample) 

Soy nuevo en F # y tratando de averiguar algunas de las limitaciones antes de aplicarlo a un proyecto.

Gracias

+0

posible duplicado de http://stackoverflow.com/questions/372043/how-can-evaluate-an-expression-stored-as-a-string-in-f – Brian

+0

¿Desea cargar el código F # de esa ¿archivo? – phimuemue

+0

Creo que esta publicación hace una pregunta un poco diferente (aunque técnicamente relacionada). El mencionado por Brian pregunta sobre expresiones simples, mientras que este pregunta sobre compilar/evaluar un archivo. Técnicamente, esto puede ser lo mismo, pero probablemente sea un caso de uso bastante diferente. –

Respuesta

13

No hay una función que permitirá hacer esto directamente. Sin embargo, cuando desee compilar programáticamente un archivo fuente F #, puede invocar el compilador F # desde su aplicación. La forma más fácil de hacerlo es usar el proveedor F # CodeDOM, que está disponible como parte de F # PowerPack (en el ensamblaje FSharp.Compiler.CodeDom.dll). Sin embargo, tenga en cuenta que necesita tener el compilador F # instalado en la máquina del usuario.

El código para ejecutar el compilador se vería más o menos así:

open Microsoft.FSharp.Compiler.CodeDom 

let provider = new FSharpCodeProvider() 
let compiler = provider.CreateCompiler() 

let parameters = new CompilerParameters 
    (GenerateExecutable = true, OutputAssembly = "file.exe") 
let results = icc.CompileAssemblyFromFile(parameters, "filename.fs") 

Una vez que se compila el archivo fuente en una asamblea, que tendrá que cargar el ensamblado utilizando la reflexión .NET y ejecutar alguna función específica o clase del ensamblado (puede, por ejemplo, buscar una función con algún nombre especial o marcada con algún atributo).

(Como nota al margen, utilizar citas o escribir su propio intérprete como se menciona en related SO question puede ser una opción si su código fuente es relativamente simple, pero probablemente no si desea admitir la potencia completa de F #)

+0

Todavía estoy tratando de ponerme a la altura de las citas y la metaprogramación en general. Estoy bastante seguro de que esta es una funcionalidad que no necesitaré, pero estaba pensando en poder proporcionar algunos casos de prueba a través de conjuntos de datos en archivos separados que podría cargar dinámicamente. CodeDom (ugh, recuerda recordar sacar ese cerdo en 2004ish en C#) definitivamente hará el truco. Gracias por su respuesta. – akaphenom

+2

** CodeDOM ** no es una tecnología muy elegante, pero debería ser el truco cuando solo necesitas invocar el compilador F # (generar código F # usando CodeDOM también es posible en teoría, pero tiene algunas limitaciones). ** Las citas ** en F # se utilizan principalmente para ejecutar código escrito en F # en algún entorno de ejecución diferente (como SQL, como JavaScript en el lado del cliente, como código GPU), por lo que no son realmente útiles cuando tienes algún programa como una cadena. –

Cuestiones relacionadas