2010-02-06 41 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就像特殊的語法。我相信它一定是太複雜了。

相關問題