Pour être honnête..

J'ai critiqué ici Python et Javascript.. Je vous ai déja dit que Caml aussi avait quelques comportements décevants, à la limite du bug ?
Et grosse dédicace à Romain qui se met à OCaml pour de bon!
# let f () =
let s = "abc" in
s.[0] <- char_of_int (1 + int_of_char s.[0]) ;
s ;;
val f : unit -> string = <fun>
# f () ;;
- : string = "bbc"
# f () ;;
- : string = "cbc"
let s = "abc" in
s.[0] <- char_of_int (1 + int_of_char s.[0]) ;
s ;;
val f : unit -> string = <fun>
# f () ;;
- : string = "bbc"
# f () ;;
- : string = "cbc"
Et grosse dédicace à Romain qui se met à OCaml pour de bon!
6 commentaires:
ce bug est-il addressé au moins dans le tracker?!!
Par
Anonyme, Ã 28/7/07 23:01
Moralement, je devrais vérifier, mais je pense que ce truc est connu. A mon avis "ce n'est pas un bug", c'est un effet de l'optimisation qui consiste à allouer statiquement les strings, comme en C.
Par
mrpingouin, Ã 30/7/07 08:35
Les strings c'est comme les tableaux, ça fait partie des objets mutables. Oui, ces petites choses qui se manient très mal dans ce fameux style dénotationel... et cela même en Caml. Mais point de bug ici ! Il s'agit de la philosophie même du langage, qui a voulu marier les deux...
Par
Anonyme, Ã 5/9/07 17:40
Non non ce n'est pas pareil!
# let f () = let s = [|0|] in s.(0) <- 1 + s.(0) ; s ;;
val f : unit -> int array = <fun>
# f () ;;
- : int array = [|1|]
# f () ;;
- : int array = [|1|]
Par
mrpingouin, Ã 5/9/07 18:03
Ce que je veux dire c'est que "abc" désigne un unique objet mutable.
Et si quelqu'un l'a caché sous un nom plus habituel:
let platypus = "abc";;
Le monsieur qui fait sa fonction f,
let f () = let s = platypus in s.[0] <- char_of_int (1 + int_of_char s.[0]); s ;;
il a très des surprises.
Après on sait que la syntaxe de Caml est un peu farfelue, et tu as raison, [|0|] est un constructeur alors que "abc" est juste un nom, mais s'il n'y avait que ça... ;)
Par
Anonyme, Ã 5/9/07 18:30
Disons que si on voulait être intégriste, il faudrait interdire s = "foo" et autoriser uniquement s = String.copy "bla" ;-)
Par
Anonyme, Ã 12/1/08 06:05
Un commentaire ?
< Accueil