Можно ли воспроизвести интерполяцию строки Python в ocaml? - PullRequest
10 голосов
/ 06 февраля 2010

В python можно использовать форматирование, аналогичное printf, с оператором "%":

"i am %d years old" % 99

или

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 06 февраля 2010

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

  • Я не верю, что есть способ написать в 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 infix версию sprintf, которая принимает произвольное число аргументов?

Ответ нет.

1 голос
/ 06 февраля 2010

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

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

0 голосов
/ 03 мая 2012

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

let (!%) = Printf.sprintf

Если вам нужен только краткий способ написания sprintf, этого достаточно.

Как упомянул Тобу, вам нужен P4, если вы хотите использовать Python как специальный синтаксис. Я считаю, что это должно быть слишком сложно.

0 голосов
/ 13 февраля 2010

Звучит как работа для Camlp4 !

...