2010-02-06 42 views
10

在Python中,可以用printf喜欢用“%”操作符相同:是否有可能在ocaml中重现python的字符串插值?

"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实现者选择了后一种形式,并且实现了该形式的类型系统hack,而不是前者。所以恐怕答案是缺少修补编译器的问题,你坚持使用格式化字符串替换的格式。

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" 
    

    但对我来说,似乎一点—不是你要找的机器人旁边的那种。

所以,如果你的问题是:

能否定义,在客观CAML,一个版本的sprintf接受的参数任意数量?

答案是没有。

0

您可以通过一个前缀运做,而不是中缀:

let (!%) = Printf.sprintf 

如果你想要写的sprintf只是一种简洁的方式,这就够了。

由于Tobu提到你需要P4,如果你想Python就像特殊的语法。我相信它一定是太复杂了。