2012-09-07 29 views
5

Tôi đang chuyển đổi một số mô-đun dựa trên OCaml thành F #. Tôi có mã được chuyển đổi và chạy trong F #, tuy nhiên kết quả của hàm cuối cùng trong F # không giống như kết quả của hàm cuối cùng trong OCaml. Vì vậy, rõ ràng là tôi phải làm theo các cuộc gọi hàm để tìm ra hàm nào trả về kết quả sai.Chuyển đổi OCaml thành F #: Có cách nào đơn giản để mô phỏng #trace cấp cao nhất OCaml trong F #

OCaml có chỉ thị cấp cao nhất để truy tìm đầu vào và đầu ra của hàm, tức là #trace.

Tôi đã tìm kiếm các phương pháp debugtrace của F # và gần nhất tôi nhận được là thiết bị mã bằng phương pháp Trace.Write nhưng phải mất vài dòng cho mỗi phương pháp.

ví dụ:

gốc

let fun001 parm001 = 
    parm001 * 10 

instrumented

let fun001 parm001 = 
    // For VS 2010, this trace output will be sent to Output window. 
    System.Diagnostics.Trace.WriteLine("function001 <--");  
    System.Diagnostics.Trace.WriteLine(sprintf "%A" parm001);  
    let result = parm001 * 10 
    System.Diagnostics.Trace.WriteLine("function001 -->"); 
    System.Diagnostics.Trace.WriteLine(sprintf "%A" result); 
    result 

Liệu F # có chức năng tương tự như OCaml #trace rằng tôi đã bỏ lỡ khi tìm kiếm?

Nếu bạn chắc chắn câu trả lời là không, đó là tất cả những gì tôi cần. Tôi biết mọi người cau mày về câu trả lời ngắn, nhưng đó là tất cả những gì tôi cần nếu câu trả lời là không.

EDIT

Đối với các phương pháp phức tạp hơn nơi chụp kết quả sẽ phát triển thay đổi sâu rộng vào mã

gốc

let func001 parm001 parm002 = 
    match parm001 with 
    | pattern001 -> func002 parm002 
    | head :: tail -> 
     func003 head 
     func001 tail 
    | [] -> failwith "failed" 

instrumented

let func001org parm001 parm002 = 
    match parm001 with 
    | pattern001 -> func002 parm002 
    | head :: tail -> 
     func003 head 
     func001 tail 
    | [] -> failwith "failed" 
and fun001 parm001 parm002 = 
    // For VS 2010, this trace output will be sent to Output window. 
    System.Diagnostics.Trace.WriteLine("function001 <--");  
    System.Diagnostics.Trace.WriteLine(sprintf "%A, %A" parm001 parm002);  
    let result = func001org parm001 parm002 
    System.Diagnostics.Trace.WriteLine("function001 -->"); 
    System.Diagnostics.Trace.WriteLine(sprintf "%A" result); 
    result 

EDIT

PostSharp không hỗ trợ F #. Xem: Using PostSharp with F# - Need documentation with working example

Trả lời

3

Không (mặc dù tôi rất muốn có cơ sở như vậy trong F #).

5

Không có tính năng tích hợp cho tính năng này trong F #, nhưng tôi tin rằng bạn có thể đạt được điều đó bằng cách sử dụng công cụ của bên thứ ba.

Một cách tiếp cận có thể là sử dụng PostSharp. Đây là một công cụ để lập trình hướng-khía cạnh (đó là một kiểu mà bạn đính kèm một số thao tác bổ sung vào các phương thức nhất định). Nó được thực hiện như một bộ xử lý hậu cần có một assembly được biên dịch và bổ sung một số hoạt động cho mỗi phương thức. Tôi không chắc chắn nếu nó đã được thử nghiệm với F #, nhưng tôi tin rằng nó sẽ làm việc.

Sử dụng PostSharp, bạn có thể triển khai khía cạnh ghi lại thông tin về cuộc gọi phương thức (giống như lệnh #trace trong OCaml) và sau đó sử dụng cấu hình chung để đính kèm nó vào tất cả các phương pháp. Bài viết Non-Invasive Tracing & Logging trên trang web của họ thực hiện chính xác điều này (và theo cách linh hoạt và mạnh mẽ hơn nhiều).

+0

Có vẻ thú vị. Tôi đã sửa lỗi của mình, x% y phải là y% x. Tôi sẽ ghi nhớ điều này trong lần tiếp theo khi tôi gặp phải một lỗi mất hơn một giờ để tìm. –

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