You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Original bug ID: 769 Reporter: administrator Status: closed Resolution: not a bug Priority: normal Severity: minor Category: ~DO NOT USE (was: OCaml general)
Bug description
(réponse au bug report 765 de David Monniaux, suivi d'une suggestion)
Salut David,
le comportement est surprenant, mais ce n'est pas vraiment un bug.
En fait, les fonctions *printf ne devraient pas être partiellement
appliquée, parce que la sémantique n'est pas spécifiée dans ce cas.
En particulier, sprintf opère de la manière suivante: on commence par
allouer un Buffer.t et on parse la chaine "format"; dès que l'on tombe
sur un %..., on suspend en attendant l'argument correspondant; quand on
arrive à la fin de la chaine, on renvoie le contenu du Buffer.
Il se trouve que dans la version courante, le buffer est également
vidé quand on extrait son contenu, et donc ça donne:
let f = Printf.sprintf "Bla %s";;
val f : string -> string =
f "A";;
: string = "Bla A" (et le buffer interne est vide)
f "B";;
: string = "B"
Dans les vieilles versions d'OCaml (par exemple avec OCaml 2.02), le
buffer n'était pas vidé et on obtenait "Bla AB", ce qui n'est pas mieux !
Remarque que même avec Printf.printf, il faut se méfier:
let f = Printf.printf "Bla %s\n";;
Bla val f : string -> unit =
f "A";;
A
: unit = ()
f "B";;
B
: unit = ()
Bref, SUGGESTION (d'où le Cc: caml-bugs): ne serait-ce pas une bonne
idée d'empecher statiquement les applications partielles pour les
fonctions à la printf (il y a de toute manière une règle de typage
ad hoc) ?
--
Alain
The text was updated successfully, but these errors were encountered:
Original bug ID: 769
Reporter: administrator
Status: closed
Resolution: not a bug
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)
Bug description
(réponse au bug report 765 de David Monniaux, suivi d'une suggestion)
Salut David,
le comportement est surprenant, mais ce n'est pas vraiment un bug.
En fait, les fonctions *printf ne devraient pas être partiellement
appliquée, parce que la sémantique n'est pas spécifiée dans ce cas.
En particulier, sprintf opère de la manière suivante: on commence par
allouer un Buffer.t et on parse la chaine "format"; dès que l'on tombe
sur un %..., on suspend en attendant l'argument correspondant; quand on
arrive à la fin de la chaine, on renvoie le contenu du Buffer.
Il se trouve que dans la version courante, le buffer est également
vidé quand on extrait son contenu, et donc ça donne:
let f = Printf.sprintf "Bla %s";;
val f : string -> string =
f "A";;
f "B";;
Dans les vieilles versions d'OCaml (par exemple avec OCaml 2.02), le
buffer n'était pas vidé et on obtenait "Bla AB", ce qui n'est pas mieux !
Remarque que même avec Printf.printf, il faut se méfier:
let f = Printf.printf "Bla %s\n";;
Bla val f : string -> unit =
f "A";;
A
f "B";;
B
Bref, SUGGESTION (d'où le Cc: caml-bugs): ne serait-ce pas une bonne
idée d'empecher statiquement les applications partielles pour les
fonctions à la printf (il y a de toute manière une règle de typage
ad hoc) ?
--
Alain
The text was updated successfully, but these errors were encountered: