2010-02-06 2 views
10

in Python, si può usare printf come la formattazione con l'operatore "%":è possibile riprodurre l'interpolazione delle stringhe di python in ocaml?

"i am %d years old" % 99 

o

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

C'è un modo per ottenere la stessa sintassi concisa in OCaml, per i numeri arbitrari di argomenti?

Per un singolo argomento, le seguenti opere:

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

C'è un modo che funziona per un numero arbitrario di argomenti?

risposta

1

In teoria, non sembra più difficile utilizzare un formato per produrre il tipo (typ1 * typ2 * ... * typn) -> string rispetto a typ1 -> typ2 -> ... -> typn -> string. Cioè, forse, ad eccezione dei formati ricorsivi %(fmt %). Qualcuno li usa davvero?

In pratica, tuttavia, gli implementatori di OCaml hanno scelto quest'ultima forma e implementato hack di tipo system per tale modulo, non per il precedente. Quindi temo che la risposta sia che a corto di patch del compilatore, sei bloccato con la forma di sostituzione della stringa di formato curried.

8

Dipende da cosa si intende per numero arbitrario di argomenti:

  • Non credo ci sia un modo per scrivere una funzione in OCaml che può accettare e decomprimere una tupla di arity arbitraria (ad esempio, sia (1, "bob") e ("joe", "bob", "briggs")).

  • Il modo Caml per la gestione di più argomenti è non tramite tuple ma mediante la conversione. Se sei disposto a farlo, allora puoi semplicemente usare Printf.sprintf.

  • Se si vuole veramente un operatore infisso, per esempio, qualcosa come

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

    allora sei fuori di fortuna, perché applicazione funzione si lega più stretto rispetto a qualsiasi operatore infisso. Si potrebbe scrivere

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

    ma a me che sembra tipo di accanto al punto di non — i droidi che stai cercando.

Quindi, se la tua domanda è:

posso definire, in Objective Caml, un infisso versione di sprintf che accetta un numero arbitrario di argomenti?

La risposta è no.

0

si può fare da un op prefisso, invece di infisso:

let (!%) = Printf.sprintf 

Se si desidera solo un modo conciso di scrivere sprintf, è sufficiente.

Come menzionato da Tobu, è necessario P4 se si desidera una sintassi speciale simile a Python. Credo che debba essere troppo complicato.