2010-04-09 40 views
12

Có F # tương đương với eval không? Mục đích của tôi là phải có ứng dụng của tôi tải một mẫu mã nhỏ từ một tập tin và về cơ bảnF # tương đương với số

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

Tôi mới đến F # và cố gắng tìm ra một số những hạn chế trước khi tôi áp dụng nó cho một dự án.

Cảm ơn bạn

+0

bản sao có thể có của http://stackoverflow.com/questions/372043/how-can-evaluate-an-expression-stored-as-a-string-in-f – Brian

+0

Bạn có muốn tải mã F # từ đó không tập tin? – phimuemue

+0

Tôi nghĩ bài đăng này sẽ hỏi một câu hỏi khác (mặc dù về mặt kỹ thuật có liên quan). Người được Brian đề cập hỏi về các biểu thức đơn giản, trong khi người này hỏi về việc biên dịch/đánh giá một tệp. Về mặt kỹ thuật, điều này có thể giống nhau, nhưng nó có thể là trường hợp sử dụng khá khác nhau. –

Trả lời

13

Không có chức năng nào cho phép bạn thực hiện việc này trực tiếp. Tuy nhiên, khi bạn muốn biên dịch một tệp nguồn F # theo lập trình, bạn có thể gọi trình biên dịch F # từ ứng dụng của bạn. Cách dễ nhất để làm điều này là sử dụng nhà cung cấp F # CodeDOM, có sẵn như là một phần của F # PowerPack (trong assembly FSharp.Compiler.CodeDom.dll). Tuy nhiên, lưu ý rằng bạn cần cài đặt trình biên dịch F # trên máy của người dùng.

Các mã để chạy trình biên dịch sẽ trông gần như thế này:

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

Khi bạn biên dịch tập tin nguồn thành một assembly, bạn sẽ cần phải tải lắp ráp sử dụng .NET Reflection và chạy một số chức năng cụ thể hoặc lớp học từ assembly (bạn có thể tìm kiếm một hàm với một số tên đặc biệt hoặc được đánh dấu bằng một số thuộc tính).

(Lưu ý bên cạnh, sử dụng các trích dẫn hoặc viết thông dịch viên của riêng bạn như được đề cập trong related SO question có thể là một tùy chọn nếu mã nguồn của bạn tương đối đơn giản, nhưng có thể không nếu bạn muốn hỗ trợ toàn bộ F #)

+0

Tôi vẫn cố gắng để có được đầu của tôi xung quanh trích dẫn và metaprogramming nói chung. Tôi khá chắc chắn đây là chức năng tôi sẽ không cần - nhưng đã nghĩ đến việc có thể cung cấp một số trường hợp thử nghiệm thông qua bộ dữ liệu trong các tệp riêng biệt mà tôi có thể tải động. CodeDom (ugh - nhớ tuốt lấy con lợn đó vào năm 2004 trong C#) sẽ dứt khoát làm trò lừa. Cảm ơn bạn đã phản hồi. – akaphenom

+2

** CodeDOM ** không phải là công nghệ rất thanh lịch, nhưng nó nên làm thủ thuật khi bạn chỉ cần gọi trình biên dịch F # (tạo mã F # sử dụng CodeDOM cũng có thể trong lý thuyết, nhưng nó có một số hạn chế). ** Báo giá ** trong F # chủ yếu được sử dụng để thực thi mã được viết bằng F # trong một số môi trường thực thi khác nhau (như SQL, như JavaScript ở phía máy khách, dưới dạng mã GPU), vì vậy chúng không thực sự hữu ích khi bạn có một số chương trình như một chuỗi. –

Các vấn đề liên quan