60

(enfin, on peut imbriquer hein évidemment)

expériences réussies, ça se comporte comme prévu cheekyn>
 :# module Asm = struct type statement = {label : int} end;;
module Asm : sig type statement = { label : int; } end
# module C = struct type statement = {label : bool} end;;
module C : sig type statement = { label : bool; } end
# open Asm;;
# let f s = s.label;;
val f : Asm.statement -> int = <fun>
# open C;;
# let f s = s.label;;
val f : C.statement -> bool = <fun>
# open Asm;;
# let f s = s.label;;
val f : Asm.statement -> int = <fu
grin (bon c'était pour rire faut pas faire ça hein ^^)
Sinon c'est vrai bien sûr que ça pose problème si tu veux utiliser les deux dans un même namespace. Mais bon utiliser des modules disjoints n'est pas si lourd que ça (je crois que dans le très inachevé othello_klein j'ai utilisé au moins deux modules différents pour un fichier vraiment pas très gros ^^). En fait ce n'est lourd que si tu donne des noms longs à tes modules, mais s'ils sont locaux tu peux faire court a priori ^^
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

61

Ce Pollux, quel bot mal programmé! C'est vraiment trop facile de le faire entrer dans une boucle infinie....

A tous les coups, il est programmé en C... tsss
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

62

Bon c'est tout pourri et complètement inachevé, mais c'est pour montrer à Pollux à quoi ça ressemble (ce fut fait en une ou deux soirées je crois) :[nosmile]
type couleur = Blanc | Noir | Aucun
let autre_couleur = function Blanc -> Noir | Noir -> Blanc | _ -> invalid_arg "autre_couleur"

module Plateau : sig
  type case
  type direction
  type t
  val cree : unit -> t
  val clone : t -> t
  val directions : direction list
  val neg_dir : direction -> direction
  val avance_dir : case -> direction -> case
  val mult_dir : int -> direction -> direction
  val contenu_case : plateau: t -> case: case -> couleur
  val set_contenu_case : plateau: t -> case: case -> couleur: couleur -> unit
  val iter_cases : (case: case -> unit) -> unit
  type event = Case of case | Clic | Quit
  val init_dessin : unit -> unit
  val redessine : case: case -> couleur: couleur -> unit
  val attend_clic : unit -> event
end = struct
  type case = int * int
  type direction = int * int
  type t = couleur array array
  let cree () =
    let plateau = Array.make_matrix 8 8 Aucun
    in plateau.(0).(0) <- Blanc; plateau.(7).(7) <- Noir;
    plateau.(7).(0) <- Noir; plateau.(0).(7) <- Blanc; plateau
  let clone plateau = Array.map Array.copy plateau
  let directions = [0, 1 ; 1, 0 ; 1, 1; 1, -1]
  let neg_dir (a, b) = -a, -b
  let mult_dir i (a, b) = i * a, i * b
  let reduit (x, y) = (if y land 8 = 0 then x else lnot x) land 7, y land 7
  let avance_dir (a, b) (c, d) = reduit (a + c, b + d)
  let contenu_case ~plateau ~case:(x, y) = plateau.(x).(y)
  let set_contenu_case ~plateau ~case:(x, y) ~couleur = plateau.(x).(y) <- couleur
  let iter_cases f = for x = 0 to 7 do for y = 0 to 7 do f ~case:(x,y) done done
  open Graphics
  type event = Case of case | Clic | Quit
  let redessine ~case:(x, y) ~couleur =
    (match couleur with
      Blanc -> set_color white
    | Noir -> set_color black
    | _ -> set_color red); 
    fill_circle (x * 22 + 11) (y * 22 + 11) 9;
    fill_circle (x * 22 + 189) (y * 22 + 11) 9;
    fill_circle ((7 - x) * 22 + 11) (y * 22 + 189) 9;
    fill_circle ((7 - x) * 22 + 189) (y * 22 + 189) 9
  let init_dessin () =
    open_graph " 355x355+20+20"; (* " 363x382+20+20" pour win2k *)
    set_window_title "Othello en bouteille de Klein";
    set_color (rgb 0 128 64);
    fill_rect 0 0 354 354;
    set_color black;
    let quadrille i =
      moveto i 0;
      lineto i 355;
      moveto 0 i;
      lineto 355 i;
    in for i = 0 to 8 do
      quadrille (i * 22);  
      quadrille (178 + i * 22)
    done;
    quadrille 177;
    redessine ~case:(0,0) ~couleur:Blanc;
    redessine ~case:(0,7) ~couleur:Blanc;
    redessine ~case:(7,0) ~couleur:Noir;
    redessine ~case:(7,7) ~couleur:Noir
  exception Rien
  let rec attend_clic () =
    let status = wait_next_event [Button_down; Key_pressed] in
    if status.key = 'q' then Quit
    else if status.button = true then
      let reduit coord =
        if coord < 0 || coord > 354 then raise Rien
        else if coord < 176 then coord / 22, false
        else if coord < 178 then raise Rien
        else (coord - 178) / 22, true in
      try
        let y, neg = reduit status.mouse_y
        in let x, _ = reduit status.mouse_x
        in Case (if neg then (7 - x, y) else (x,y))
      with Rien -> Clic
    else attend_clic ()
end

let (+:) = Plateau.avance_dir
let ( *: ) = Plateau.mult_dir

module Coups : sig
  type coup
  val case : coup -> Plateau.case
  val trouve : couleur: couleur -> plateau: Plateau.t -> coup list
  val joue : coup: coup -> couleur: couleur -> plateau: Plateau.t -> unit
end = struct
  type ligne = Simple | Double | Non
  type coup = Plateau.case * (Plateau.direction * int) list
  let case = fst
  let trouve_ligne case_depart ~direction ~couleur ~plateau =
    let case = case_depart +: direction in
    if Plateau.contenu_case ~plateau ~case <> autre_couleur couleur then Non, 0
    else
      let rec continue i nombre =
        let case = case_depart +: i *: direction in
        if case = case_depart then Double, nombre
        else
          let pion = Plateau.contenu_case ~plateau ~case in
          if pion = couleur then Simple, nombre
          else if pion = Aucun then Non, 0
          else continue (i + 1) (nombre + 1)
      in continue 2 1
        
  let trouve_coup ~case ~couleur ~plateau =
    let directions_trouvees = ref [] in
    let cherche_lignes direction =
      let (ligne, nombre) = trouve_ligne case ~direction ~couleur ~plateau in
      if ligne <> Non then
        directions_trouvees := (direction, nombre) :: !directions_trouvees;
      if ligne <> Double then
        let dir = Plateau.neg_dir direction in
        let (ligne, nombre) = trouve_ligne case ~direction:dir ~couleur ~plateau in
        if ligne <> Non then
          directions_trouvees := (dir, nombre) :: !directions_trouvees;
    in List.iter cherche_lignes Plateau.directions; match !directions_trouvees with
      [] -> None
    | directions -> Some (case, directions)
          
  let trouve ~couleur ~plateau =
    let resultat = ref [] in
    let ajoute_coup ~case =
      if Plateau.contenu_case ~case ~plateau = Aucun then
        match trouve_coup ~case ~couleur ~plateau with
          Some coup -> resultat := coup :: !resultat
        | _ -> ()
     in Plateau.iter_cases ajoute_coup; !resultat
            
  let joue ~coup:(case, directions) ~couleur ~plateau =
    Plateau.set_contenu_case ~case ~couleur ~plateau;
    let retourne (direction, nombre) =
       for i = 1 to nombre do
         Plateau.set_contenu_case ~case:(case +: (i *: direction)) ~couleur ~plateau
       done
     in List.iter retourne directions
end

let compte_tout plateau =
  let noirs = ref 0 and blancs = ref 0 in
  let compte ~case = match Plateau.contenu_case ~plateau ~case with
    Blanc -> incr blancs
  | Noir -> incr noirs
  | _ -> ()
  in Plateau.iter_cases compte;
  if !blancs > !noirs then print_endline "Blanc gagne."
  else if !noirs > !blancs then print_endline "Noir gagne."
  else print_endline "Partie nulle.";
  ignore (Plateau.attend_clic ())

let attend_coup couleur coups_possibles plateau =
  let rec boucle () = 
    match Plateau.attend_clic () with
      Plateau.Quit -> exit 0
    | Plateau.Case case ->
        (try Coups.joue ~couleur ~plateau
            ~coup:(List.find (fun coup -> Coups.case coup = case) coups_possibles)
        with Not_found -> boucle ())
    | _ -> boucle ()
  in boucle ()
let _ =
  Random.self_init ();
  let plateau = Plateau.cree () in
  Plateau.init_dessin();
  let rec boucle couleur coups_possibles =
    if couleur = Blanc then (
      let n = List.length coups_possibles in
      let coup = List.nth coups_possibles (Random.int n) in
      Plateau.redessine ~case:(Coups.case coup) ~couleur:Aucun;
      Plateau.attend_clic ();
      Coups.joue ~couleur ~plateau ~coup)
    else attend_coup couleur coups_possibles plateau;
    let redessine_cqui_faut ~case =
      if Plateau.contenu_case ~plateau ~case = couleur
      then Plateau.redessine ~case ~couleur
    in Plateau.iter_cases redessine_cqui_faut;
    let coul = autre_couleur couleur in
    let possibles = Coups.trouve ~couleur:coul ~plateau in
    if possibles = [] then (
      let re_possibles = Coups.trouve ~couleur ~plateau in
      if re_possibles = [] then compte_tout plateau else (
      print_endline ("Le joueur " ^ (match couleur with
        Blanc -> "Noir "
      | Noir -> "Blanc "
      | _ -> "") ^ "passe son tour");
      boucle couleur re_possibles))
    else boucle coul possibles
  in boucle Noir (Coups.trouve ~couleur:Noir ~plateau)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

63

Je précise que si ça a l'air bizarre, c'est parce qu'il y a une esquisse de généricité vu que j'avais l'intention (je l'ai toujours d'ailleurs cheeky) de proposer plusieurs types de plateaux différents, et pas seulement la bouteille de Klein ^^
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

64

./60> à quelle condition un module est local ? s'il a un nom différent de celui du fichier ?

./61> meuh non, je suis écrit en assembleur auto-modifiant...

./62>
!slap les gens qui écrivent du code sale qui fait des warnings :p (mais merci, je vais regarder ^^)
• Pollux slaps les gens qui écrivent du code sale qui fait des warnings :p (mais merci, je vais regarder ^^) around a bit with a large trout !

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

65

à quelle condition un module est local ? s'il a un nom différent de celui du fichier ?
ben en fait un fichier forme forcément un module (la signature est dans le mli et la structure est dans le ml) ; les modules qui sont déclarés dans le fichier sont donc des sous-modules (donc accessibles de l'extérieur seulement par Machin.Truc). Ils peuvent éventuellement ne pas être accessibles du tout s'ils ne sont pas déclarés dans le mli (comme pour tout).
euh ça fait des warnings mon code ? ça m'étonne mais bon c'est pas impossible (et il est vrai que c'est assez sale, mais ça marche quand même car telle est la puissance de caml cheeky)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

66

Ah ok c'est ce warning insupportable ^^ je compile toujours avec -ws ça saoule sinon smile
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

67

Bon, je commence à écrire un peu de code en OCaml, et voilà sur quoi je suis tombé : j'ai
let temp = Printf.sprintf ("%+1.19e") f in
et je veux mettre ça dans une fonction où le "19" peut varier. Pas de problème, je tente :
let temp = Printf.sprintf ("%+1."^(string_of_int n)^"e") f in
Et ça compile pas tritop

Ca veut dire que les gens de OCaml se sont amusés à hardcoder les chaînes de caractères spéciales pour printf dans le parseur du langage, pour leur donner un type particulier laught Y a pas à dire, OCaml c hyper bien conçu lolpaf

Bon là je vais pouvoir m'en sortir en faisant une disjonction de cas parce que n ne peut prendre que 2 ou 3 valeurs, mais attention, la disjonction de cas doit se faire _autour_ de l'appel à sprintf, pas juste dans l'argument tripaf

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

68

faut mettre format_of_string c'est tout smilelet temp = Printf.sprintf (format_of_string ("%+1."^(string_of_int n)^"e")) f in
cf. http://caml.inria.fr/ocaml/htmlman/libref/Pervasives.html#TYPEformat
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

69

Et comment il fait pour convertir automatiquement la chaîne en format dans les autres cas ? sick Une surcharge builtin dans le compilo ? tritop

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

70

Euh j'ai dû me planter dans ce que j'ai posté... ça s'appelle format_of_string mais ça prend pas en argument un string ????? je comprends rien grin
j'essaye d'élucider ça et je te tiens au courant ^^
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

71

ce topic est tritop love

ce serait trop dommage qu'il ne ressurgisse pas dans vos sujets grin

caml powaaaaaaaaaaa

72

Tiens, il paraît que Xavier Leroy a dit que l'orientation objet d'ocaml, ct juste du sucre syntaxique pour être à la mode et que ça apportait rien ^^ (et c vrai que bon, c suffisamment lourd pour qu'on s'en serve pas et qu'on reste aux trucs de merde de Caml Light -- surtout que la lib standard n'est pas du tt orientée objet...)

Donc en plus mes critiques sur Caml Light sont tjs valables tongue

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

73

Bah regarde lablgtk et imagine la même chose en caml light couic (et l'extension objet c'est justement tout sauf lourd triso, enfin tu dirais que c'est pas aussi puissant que les objets d'un vrai langage OO je comprendrais (enfin c'est surtout pas de l'orienté-objet au sens strict), mais « lourd » c'est la critique la plus absurde qu'on puisse faire...)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

74

enfin lourd = chiant à utiliser, pas lourd au niveau de l'implémentation, évidemment ^^
si tu veux faire un champ public dans un objet, tu dois te taper déclaration du chp statique (avec son type trigic) + déclaration d'une méthode get + déclaration d'une méthode set...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

75

pourquoi avec son type trifus
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

76

Avec une valeur par défaut non polymorphe, ce qui revient exactement au même happy

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

77

Pollux
: Tiens, il paraît que Xavier Leroy a dit que l'orientation objet d'ocaml, ct juste du sucre syntaxique pour être à la mode et que ça apportait rien ^^

Ah ben tiens, il a raison, et d'ailleurs de façon générale l'objet est un truc à la mode qui n'apporte rien. cheeky
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

78

Mais oui, c clair que GTC a un code bien plus compact et lisible que mon désassembleur/analyseur en C# trigic (et c même pas la faute de la garbage-collection, puisqu'il n'y a aucune libération explicite de mémoire dans GTC)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

79

la garbage-collection, çà poutre !

80

c pas un troll, ça tongue

(quoique, ça sux qd même au niveau de la localité des accès sick)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

81

bon alors : la garbage-collection de caml elle poutre et d'ailleurs caml powaaaaaaaaaaaaaaa !!

C'est mieux ? grin en fait non, c'est pas mieux, caml powaaaa c'est pas un troll, c'est une évidence

82

Oui happy
Il paraît que le gc d'ocaml sux complètement, faudrait que je fasse des bench pour voir à quel point c'est pourri tongue

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

83

79> Tsss, ne fais pas l'ignorant, on fait des gc qui règlent ce problème, de nos jours tongue

77> Bah ça c'est pas la faute de l'objet, c'est les langages que tu utilises qui suxx.
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

84

82/79> url ?

82/77> bah oué, donc montre-moi un langage non-objet qui suxx pas...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

85

Caml-Light love tritop

86

camel%20in%20sunset.jpg

87

Quelle prestance...
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou

88

cay la classe tripo

89

Attention, question piège : Parmi ces quatres êtres vivants, lequel est le plus fort ?
a) Le chameau
b) L'hippopotame
c) L'ohmu
d) Le troll

|EDIT : typo]
avatar
I'm on a boat motherfucker, don't you ever forget

90

Ce sont des synonymes.
Les droits inaliénables du troll :
1) le droit d'avoir raison
2) le droit d'être péremptoire
3) le droit de ne pas lire
4) le droit de ne pas répondre
5) le droit d'être de mauvaise foi
6) Autant pour moi / Faignant / Vivent Tintin et Milou