2010-02-06 12 views
10

W Pythonie można użyć printf jak formatowanie z „%” operatora:czy możliwe jest odtworzenie interpolacji ciągów Pythona w ocaml?

"i am %d years old" % 99 

lub

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

Czy istnieje sposób, aby uzyskać ten sam zwięzły składnię w SML, dla dowolnych liczb argumenty?

Na jednym argumentem, następujące prace:

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

Czy istnieje sposób, że działa dla dowolnych liczb argumentów?

Odpowiedz

1

Teoretycznie używanie formatu nie wydaje się trudniejsze niż w przypadku modelu (typ1 * typ2 * ... * typn) -> string niż typ1 -> typ2 -> ... -> typn -> string. Być może z wyjątkiem formatów rekursywnych %(fmt %). Czy ktoś faktycznie z nich korzysta?

W praktyce jednak implementatorzy OCaml wybierali tę drugą formę, a dla tego formularza zaimplementowano hacki systemu typów, a nie dla poprzedniego. Obawiam się, że odpowiedź jest taka, że ​​bez łatania kompilatora utknąłeś z formą zastępowania ciągu formatów curried.

8

To zależy co masz na myśli przez arbitralne liczby argumentów:

  • nie wierzę, istnieje sposób, aby napisać funkcję w SML, który może akceptować i rozpakować krotki arbitralnej liczbę operandów (np. oba (1, "bob") i ("joe", "bob", "briggs")).

  • Caml sposób obsługi wielu argumentów jest nie przez krotki ale currying. Jeśli chcesz to zrobić, możesz po prostu użyć Printf.sprintf.

  • Jeśli naprawdę chcesz operatora Infix, na przykład coś takiego

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

    to jesteś pecha, bo aplikacja funkcja wiąże mocniej niż jakikolwiek podmiot Infix. Można napisać

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

    ale wydaje mi się, że rodzaj obok punktu — nie droidy których szukasz.

Więc jeśli pytanie brzmi:

mogę określić, w Celu Caml, takie Infix wersję sprintf który akceptuje dowolną liczbę argumentów?

Odpowiedź brzmi: nie.

0

Można to zrobić za pomocą op prefiksu, zamiast wrostkiem:

let (!%) = Printf.sprintf 

Jeśli chcesz tylko zwięzły sposób pisania sprintf, to wystarczy.

Jak wspomniał Tobu, potrzebujesz P4, jeśli chcesz mieć specjalną składnię Pythona. Uważam, że to musi być zbyt skomplikowane.

Powiązane problemy