Mantis Bug Tracker

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0000247OCamlOCaml generalpublic2000-12-14 18:082001-01-08 11:54
Reporteradministrator 
Assigned To 
PrioritynormalSeverityminorReproducibilityalways
StatusclosedResolutionno change required 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0000247: Bug avec les string et Printf
DescriptionFull_Name: Benjamin Monate
Version: 3.0
OS: Linux
Submission from: pc8-118.lri.fr (129.175.8.118)


Bonjour,
Il semble y avoir un problemes avec les chaines constantes utilisees plusieurs
fois:

> ocaml
        Objective Caml version 3.00

# List.iter (Printf.printf "a%sb") ["1";"2";"3"];;
a1b2b3b- : unit = ()
#

On attendrait evidemment: a1ba2ba3b

Merci




TagsNo tags attached.
Attached Files

- Relationships

-  Notes
(0002193)
administrator (administrator)
2000-12-14 19:54

> Full_Name: Benjamin Monate
> Version: 3.0
> OS: Linux
> Submission from: pc8-118.lri.fr (129.175.8.118)
>
>
> Bonjour,
> Il semble y avoir un problemes avec les chaines constantes utilisees plusieurs
> fois:
>
> > ocaml
> Objective Caml version 3.00
>
> # List.iter (Printf.printf "a%sb") ["1";"2";"3"];;
> a1b2b3b- : unit = ()
> #
>
> On attendrait evidemment: a1ba2ba3b
>
> Merci

Ce n'est pas un bug, mais une particularité de la fonction printf,
combinée à la sémantique habituelle du langage.

Printf.printf "a%sb" est une abréviation pour

print_string "a"; fun s -> print_string s; print_string "b"

Ce que vous observez en évaluant:

# Printf.printf "a%sb";;
a- : string -> unit = <fun>

Cela implique que vous ne faîtes qu'itérer la fonction
fun s -> print_string s; print_string "b" sur la liste de nombre.

Ainsi
 List.iter (Printf.printf "a%sb") ["1";"2";"3"];;
est équivalent à:

 print_string "a";
 List.iter (fun s -> print_string s; print_string "b") ["1";"2";"3"];;

qui imprime a1b2b3b, comme on s'y attend. D'ailleurs une décomposition
en deux phrases le rend évident:

# let f = Printf.printf "a%sb";;
aval f : string -> unit = <fun>

# List.iter f ["1";"2";"3"];;
1b2b3b- : unit = ()

Cordialement,

Pierre Weis

INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://cristal.inria.fr/~weis/ [^]



- Issue History
Date Modified Username Field Change
2005-11-18 10:13 administrator New Issue


Copyright © 2000 - 2011 MantisBT Group
Powered by Mantis Bugtracker