2010-02-06 1 views
10

В Python, можно использовать Printf как форматирование с «%» оператора:Можно ли воспроизвести интерполяцию строк python в ocaml?

"i am %d years old" % 99 

или

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

Есть ли способ, чтобы получить тот же лаконичный синтаксис OCaml, для произвольных чисел аргументы?

Для одного аргумента, следующие работы:

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

Есть ли способ, который работает для произвольных чисел аргументов?

ответ

1

Теоретически, не представляется более сложным использовать формат для создания типа (typ1 * typ2 * ... * typn) -> string, чем typ1 -> typ2 -> ... -> typn -> string. То есть, возможно, за исключением рекурсивных форматов %(fmt %). Кто-нибудь на самом деле их использует?

На практике, однако, разработчики OCaml выбрали последнюю форму и внедрили системные хаки для этой формы, а не для прежней. Поэтому я боюсь, что ответ заключается в том, что, не исправляя компилятор, вы застряли в форме замены строки формата curried.

8

Это зависит от того, что вы подразумеваете под произвольным количеством аргументов:

  • Я не верю, что есть способ, чтобы написать функцию в OCaml, который может принимать и распаковывать кортеж произвольной арности (например, (1, "bob") и ("joe", "bob", "briggs")).

  • Caml Способ обработки нескольких аргументов не через кортежи, а путем каррирования. Если вы готовы это сделать, вы можете просто использовать Printf.sprintf.

  • Если вы действительно хотите инфиксный оператор, например, что-то вроде

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

    то вам не повезло, потому что функция приложения связывает сильнее, чем любой инфиксной оператора. Вы можете написать

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

    , но мне кажется, что-то рядом с точкой — не дроидов вы ищете.

Так что, если ваш вопрос:

Могу ли я определить, в Objective Caml, в инфиксную версию sprintf, которая принимает произвольное число аргументов?

Ответ нет.

0

Вы можете сделать это с помощью префикса оп, вместо инфиксом:

let (!%) = Printf.sprintf 

Если вы хотите просто краткий способ написания Sprintf, достаточно.

Как отметил Тобу, вам нужен P4, если вы хотите, чтобы Python был особым синтаксисом. Я считаю, что это слишком сложно.