Pour être honnête..
5/24/2007 02:31:00 PM
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