是否有可能在ocaml中重现python的字符串插值?

时间:2010-02-06 15:12:34

标签: ocaml printf

在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 个答案:

答案 0 :(得分:8)

这取决于你的意思是任意数量的论点:

  • 我不相信有一种方法可以在OCaml中编写一个函数来接受并解包一个任意arity的元组(例如,(1, "bob")和{{ 1}})。

  • 处理多个参数的Caml方法是通过元组而不是,而是通过currying。如果您愿意这样做,那么您可以使用("joe", "bob", "briggs")

  • 如果你真的想要一个中缀运算符,例如

    Printf.sprintf

    然后你运气不好,因为函数应用程序比任何中缀运算符都更紧密。你可以写

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

    但对我而言似乎并非如此 - 而不是你正在寻找的机器人。

所以如果你的问题是:

  

我可以在Objective Caml中定义一个 infix 版本的("%s-%s %s is the best movie reviewer" % "joe") "bob" "briggs" ,它接受​​任意数量的参数吗?

答案是否。

答案 1 :(得分:1)

理论上,使用格式生成(typ1 * typ2 * ... * typn) -> string类型而不是typ1 -> typ2 -> ... -> typn -> string似乎并不困难。也许,除了递归格式%( fmt %)之外。有人真的使用那些吗?

但实际上,OCaml实现者选择了后一种形式,并为该形式实现了类型系统黑客,而不是前者。所以我担心的答案是,如果没有修补编译器,你就会遇到格式字符串替换的curried形式。

答案 2 :(得分:0)

这听起来像是Camlp4的工作!

答案 3 :(得分:0)

你可以用前缀op代替infix:

let (!%) = Printf.sprintf

如果你只想简单地编写sprintf,那就足够了。

正如Tobu所说,如果你想让Python像特殊语法那样需要P4。我认为它必须太复杂。