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

Mr *_*ith 11 printf ocaml

在python中,可以使用"%"运算符的printf格式化:

"i am %d years old" % 99
Run Code Online (Sandbox Code Playgroud)

要么

"%s is %d years old" % ("bob", 101)
Run Code Online (Sandbox Code Playgroud)

对于任意数量的参数,有没有办法在Ocaml中获得相同的简洁语法?

对于单个参数,以下工作:

let (%) = Printf.sprintf in ... "i am %d years old" % 99
Run Code Online (Sandbox Code Playgroud)

有没有一种方法适用于任意数量的参数?

Nor*_*sey 8

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

  • 我不相信这是写在OCaml中的函数可以接受的方式和解压任意元数的元组(例如,都(1, "bob")和("joe", "bob", "briggs")).

  • 处理多个参数的Caml方式不是通过元组,而是通过currying.如果你愿意这样做,那么你可以使用Printf.sprintf.

  • 如果你真的想要一个中缀操作符,例如,类似的东西

    "%s-%s %s is the best movie reviewer" % "joe" "bob" "briggs"
    
    Run Code Online (Sandbox Code Playgroud)

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

    ("%s-%s %s is the best movie reviewer" % "joe") "bob" "briggs"
    
    Run Code Online (Sandbox Code Playgroud)

    但对我来说似乎有点不合适 - 不是你正在寻找的机器人.

所以如果你的问题是:

我可以在Objective Caml中定义一个接受任意数量参数的中缀版本sprintf吗?

答案是否定的.


小智 1

从理论上讲,使用格式来生成类型似乎并不(typ1 * typ2 * ... * typn) -> string比typ1 -> typ2 -> ... -> typn -> string. 也就是说,也许递归格式除外%( fmt %)。有人真正使用这些吗?

但在实践中,OCaml 实现者选择了后一种形式,并为该形式而不是前一种形式实现了类型系统黑客。所以恐怕答案是,如果不修补编译器,您就会陷入格式字符串替换的柯里化形式。