2010-04-09 13 views
12

Czy istnieje odpowiednik F # eval? Moim zamiarem jest, aby moja aplikacja załadować małą próbkę kodu z pliku i zasadniczoF # odpowiednik Eval

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

Jestem nowy F # i próbuje dowiedzieć się, niektóre z ograniczeń zanim zastosować go do projektu.

Dziękujemy

+0

możliwy duplikat http://stackoverflow.com/questions/372043/how-can-evaluate-an-expression-stored-as-a-string-in-f – Brian

+0

Czy chcesz załadować kod F # z tego plik? – phimuemue

+0

Myślę, że ten post stawia nieco inne pytanie (choć technicznie związane). Wspomniany przez Briana pyta o proste wyrażenia, podczas gdy ten pyta o kompilację/ocenę pliku. Z technicznego punktu widzenia może to być to samo, ale prawdopodobnie jest to zupełnie inny przypadek użycia. –

Odpowiedz

13

Nie ma funkcji, która pozwoliłaby na wykonanie tej czynności bezpośrednio. Jednakże, gdy chcesz skompilować program źródłowy F # programowo, możesz wywołać kompilator F # z aplikacji. Najprostszym sposobem na to jest użycie dostawcy F # CodeDOM, który jest dostępny jako część F # PowerPack (w zestawie FSharp.Compiler.CodeDom.dll). Należy jednak pamiętać, że na komputerze użytkownika musi być zainstalowany kompilator F #.

Kod uruchomić kompilator będzie wyglądać mniej więcej tak:

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") 

Po kompilacji pliku źródłowego w zespole, musisz załadować montaż przy użyciu .NET refleksji i uruchomić jakąś konkretną funkcję lub klasa ze złożenia (możesz na przykład szukać funkcji o specjalnej nazwie lub oznaczonej jakimś atrybutem).

(Jak na marginesie, z wykorzystaniem cytatów lub pisanie własnego tłumacza jak wspomniano w related SO question może być opcja, jeśli kod źródłowy jest stosunkowo proste, ale prawdopodobnie nie, jeśli chcesz obsługiwać pełną moc F #)

+0

Nadal próbuję zrozumieć moją opinię na temat cytatów i metaprogramowania w ogóle. Jestem pewien, że jest to funkcja, której nie potrzebuję - ale myślałem o możliwościach dostarczenia niektórych przypadków testowych za pomocą zestawów danych w osobnych plikach, które mogłem załadować dynamicznie. CodeDom (ugh - pamiętaj, że wywalając tę ​​świnię w 2004ish w C#) z pewnością rozwiąże ten problem. Dziękuję za odpowiedź. – akaphenom

+2

** CodeDOM ** nie jest bardzo elegancką technologią, ale powinno wystarczyć, gdy wystarczy wywołać kompilator F # (generowanie kodu F # za pomocą CodeDOM jest również możliwe w teorii, ale ma pewne ograniczenia). ** Cytaty ** w języku F # są używane głównie do wykonywania kodu napisanego w języku F # w innym środowisku wykonawczym (jako SQL, jako JavaScript po stronie klienta, jako kod GPU), więc nie są przydatne, gdy masz jakiś program jako ciąg. –