2010-02-06 34 views
10

Trong python, người ta có thể sử dụng printf như định dạng với "%" điều hành:là nó có thể tái tạo nội suy chuỗi python trong ocaml?

"i am %d years old" % 99 

hoặc

"%s is %d years old" % ("bob", 101) 

Có cách nào để có được những cú pháp ngắn gọn tương tự trong Ocaml, cho số tùy ý lập luận?

Đối với một đối số duy nhất, các công việc sau:

let (%) = Printf.sprintf in ... "i am %d years old" % 99 

Có cách nào mà làm việc cho số lượng tùy ý các đối số?

Trả lời

1

Về lý thuyết, có vẻ như không khó sử dụng định dạng để tạo kiểu (typ1 * typ2 * ... * typn) -> string hơn typ1 -> typ2 -> ... -> typn -> string. Tức là, có lẽ, ngoại trừ các định dạng đệ quy %(fmt %). Có ai thực sự sử dụng chúng không?

Trên thực tế, tuy nhiên, những người thực hiện OCaml chọn hình thức thứ hai, và thực hiện hệ thống kiểu hacks cho hình thức đó, không phải cho một cựu. Vì vậy, tôi sợ câu trả lời là ngắn vá các trình biên dịch, bạn đang mắc kẹt với các hình thức curried thay thế chuỗi định dạng.

8

Nó phụ thuộc những gì bạn có ý nghĩa bởi số tùy ý các đối số:

  • Tôi không tin rằng có một cách để viết một hàm trong OCaml có thể chấp nhận và giải nén một tuple của arity tùy ý (ví dụ, cả hai (1, "bob")("joe", "bob", "briggs")).

  • Cách thức xử lý nhiều đối số Caml là không phải thông qua bộ dữ liệu nhưng bằng cách pha cà ri. Nếu bạn sẵn sàng làm điều đó, thì bạn chỉ có thể sử dụng Printf.sprintf.

  • Nếu bạn thực sự muốn có một nhà điều hành ghi, ví dụ, một cái gì đó giống như

    "%s-%s %s is the best movie reviewer" % "joe" "bob" "briggs" 
    

    sau đó bạn đang trên may mắn, bởi vì ứng dụng chức năng gắn kết chặt chẽ hơn so với bất kỳ nhà điều hành ghi. Bạn có thể viết

    ("%s-%s %s is the best movie reviewer" % "joe") "bob" "briggs" 
    

    nhưng đối với tôi, có vẻ như bên cạnh điểm — không phải là droid bạn đang tìm kiếm.

Vì vậy, nếu câu hỏi của bạn là:

Tôi có thể xác định, trong Objective CAML, một phiên bản infix của sprintf chấp nhận một số bất kỳ các đối số?

Câu trả lời là không.

0

Đó là âm thanh như một công việc cho Camlp4!

0

Bạn có thể làm điều đó bởi một op tiền tố, thay vì ghi vào:

let (!%) = Printf.sprintf 

Nếu bạn muốn chỉ là một cách ngắn gọn viết sprintf, nó là đủ.

Như Tobu đã đề cập, bạn cần P4 nếu bạn muốn Python như cú pháp đặc biệt. Tôi tin rằng nó phải quá phức tạp.

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