Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1760 connectés 

 


Combien d'intervenants dans cette cat ?


 
27.5 %
 11 votes
1.  1 (Masklinn)
 
 
25.0 %
 10 votes
2.  5 ou moins (Masklinn et ses amis)
 
 
10.0 %
 4 votes
3.  Environ une dizaine
 
 
2.5 %
    1 vote
4.  Environ une centaine
 
 
25.0 %
 10 votes
5.  Environ une centaine de multis de stiffler
 
 
10.0 %
 4 votes
6.  Obiwan n'a pas besoin de langage pour être fonctionnel
 

Total : 40 votes (0 vote blanc)
Ce sondage est clos, vous ne pouvez plus voter
 Mot :   Pseudo :  
 
 Page :   1  2  3  4  5  6  7
Auteur Sujet :

blabla@fonctionnel : Taiche ne sert à rien

n°1710377
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:22:07  profilanswer
 

Reprise du message précédent :
Si tu veux jouer dans IO, il faut utiliser les liftM* (ou, ici, `ap` qui suffit largement, voir hoogle pour les signatures)

 
Code :
  1. > let s = return (formatTime defaultTimeLocale "%D %T" ) `ap` getCurrentTime
  2. > s
  3. "03/31/08 13:21:18"


Message édité par masklinn le 31-03-2008 à 15:22:18

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
mood
Publicité
Posté le 31-03-2008 à 15:22:07  profilanswer
 

n°1710380
lorill
Posté le 31-03-2008 à 15:22:47  profilanswer
 

j'ai pas testé mon copier coller, mais dans mon code, c'était dans une monade a l'origine.
 

Code :
  1. runAndLoop cmd = do
  2.   time <- formatTime defaultTimeLocale "%D %T" getCurrentTime
  3.   putStrLn "relance: "
  4.   system cmd
  5.   --runAndLoop cmd


boom
 

Code :
  1. runAndLoop cmd = do
  2.   t <- getCurrentTime
  3.   time <- formatTime defaultTimeLocale "%D %T" t
  4.   putStrLn "relance: "
  5.   system cmd
  6.   --runAndLoop cmd


boom.
 
j'ai l'impression que c'est le let qui me manquait, je l'ai pas encore vu celui la :o
 

n°1710381
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:23:11  profilanswer
 

Note finale, si tu veux commencer à jouer avec haskell, je ne peux que te conseiller d'aller dans #haskell@irc.freenode.net, les gens y sont très sympa :o


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1710389
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:25:27  profilanswer
 

lorill a écrit :

j'ai pas testé mon copier coller, mais dans mon code, c'était dans une monade a l'origine.

 
Code :
  1. runAndLoop cmd = do
  2.   time <- formatTime defaultTimeLocale "%D %T" getCurrentTime
  3.   putStrLn "relance: "
  4.   system cmd
  5.   --runAndLoop cmd


boom

 
Code :
  1. runAndLoop cmd = do
  2.   t <- getCurrentTime
  3.   time <- formatTime defaultTimeLocale "%D %T" t
  4.   putStrLn "relance: "
  5.   system cmd
  6.   --runAndLoop cmd


boom.

 

j'ai l'impression que c'est le let qui me manquait, je l'ai pas encore vu celui la :o

 



Ah non là tu fais plein de bêtises :o

 

"<-" c'est pour "unboxer", pour sortir un truc d'une monade (tout en restant dans un contexte monadique). Donc pour l'appel à getCurrentTime c'est nécessaire, histoire de sortir ton UTCTime de IO.

 

Donc t <- getCurrentTime est ok, et t va être de type UTCTime, pas IO UTCTime

 

Par contre formatTime defaultTimeLocale "%D %T" ne vit pas dans IO (voir son type: FormatTime -> String, un truc du style) donc tu peux pas utiliser <- avec, sauf à le lifter (avec liftM ou ap).

 

Dans ton 2e test, remplace simplement time <- formatTime defaultTimeLocale "%D %T" t par let time = formatTime defaultTimeLocale "%D %T" t et ça devrait rouler

Message cité 1 fois
Message édité par masklinn le 31-03-2008 à 15:26:18

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1710393
lorill
Posté le 31-03-2008 à 15:28:17  profilanswer
 

j'ai pas irc au taff, et j'ai autre chose a faire a la maison  :o
 
faudrait que je lise plus de doc, mais comme j'avais un petit besoin immediat, je me suis dit que j'allais le faire avec haskell plutot qu'en shell, pour jouer :o

n°1710397
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:30:48  profilanswer
 

lorill a écrit :

j'ai pas irc au taff


Bah installe un client, ça prend 2mn et franchement le channel #haskell est une ressource qui facilite grandement la découverte.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1710399
lorill
Posté le 31-03-2008 à 15:31:54  profilanswer
 

masklinn a écrit :


Dans ton 2e test, remplace simplement time <- formatTime defaultTimeLocale "%D %T" t par let time = formatTime defaultTimeLocale "%D %T" t et ça devrait rouler


C'est ce que j'ai fini par faire. Ca marche tant que j'essaye pas de m'en servir plus tard.
 
la, time est de type IO(), alors que ca devrait être une chaine, et je vois pas comment passer de l'un a l'autre.
 
le but evidemment, c'est de faire cette bidouille :
 

Code :
  1. runAndLoop cmd = do
  2.   t <- getCurrentTime
  3.   let time = formatTime defaultTimeLocale "%D %T" t
  4.   putStrLn "relance: " ++ time
  5.   system cmd
  6.   --runAndLoop cmd

n°1710401
lorill
Posté le 31-03-2008 à 15:32:26  profilanswer
 

masklinn a écrit :


Bah installe un client, ça prend 2mn et franchement le channel #haskell est une ressource qui facilite grandement la découverte.


ce que je voulais dire par la, c'est que le proxy n'autorise que le http, et qu'en plus les sites sont filtrés.

n°1710403
lorill
Posté le 31-03-2008 à 15:33:31  profilanswer
 

si y'a pas de réponse simple, laisse tomber, je continuerais ma lecture de la doc, ca devrait m'éclaircir.

n°1710407
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:35:12  profilanswer
 

lorill a écrit :


C'est ce que j'ai fini par faire. Ca marche tant que j'essaye pas de m'en servir plus tard.
 
la, time est de type IO(), alors que ca devrait être une chaine, et je vois pas comment passer de l'un a l'autre.


Non, avec ce que je t'ai donné, time est de type String


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
mood
Publicité
Posté le 31-03-2008 à 15:35:12  profilanswer
 

n°1710410
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:38:06  profilanswer
 

Par contre, une fonction binde plus fortement qu'un opérateur, et putStrLn est une fonction, si ton erreur est un truc du style Couldn't match expected type `[a]' against inferred type `IO ()' le problème vient de là. Mets des parenthèses autour de ton "++" ou bien ajoutes un "$" après putStrLn


Message édité par masklinn le 31-03-2008 à 15:38:11

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1710411
lorill
Posté le 31-03-2008 à 15:38:52  profilanswer
 

mais ouais, je suis trop con, je viens de le voir.
ca m'apprendra a mieux lire les messages d'erreur.

n°1710412
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:39:56  profilanswer
 

lorill a écrit :

mais ouais, je suis trop con, je viens de le voir.
ca m'apprendra a mieux lire les messages d'erreur.


Bof :o

 

D'un autre côté les messages d'erreur de ghc sont pas nécessairement les plus clairs du monde non plus :o


Message édité par masklinn le 31-03-2008 à 15:40:17

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1710418
lorill
Posté le 31-03-2008 à 15:44:16  profilanswer
 

En l'occurence, il l'était. La preuve, c'est que j'ai fini par trouver tout seul :

 
Citation :

   Couldn't match expected type `[a]' against inferred type `IO ()'
    In the first argument of `(++)', namely `putStrLn "relance: "'
    In the expression: putStrLn "relance: " ++ time
    In a 'do' expression: putStrLn "relance: " ++ time

Message cité 1 fois
Message édité par lorill le 31-03-2008 à 15:44:59
n°1710419
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:44:53  profilanswer
 

lorill a écrit :

En l'occurence, il l'était. La preuve, c'est que j'ai fini par trouver tout seul :
 

Citation :

   Couldn't match expected type `[a]' against inferred type `IO ()'
    In the first argument of `(++)', namely [color=red]`putStrLn "relance: "'[/color]
    In the expression: putStrLn "relance: " ++ time
    In a 'do' expression: putStrLn "relance: " ++ time



Oui mais je tentais de ménager ta sensibilité :o


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1710420
lorill
Posté le 31-03-2008 à 15:45:33  profilanswer
 

l'ego, c'est pour les faibles :o

n°1710422
masklinn
í dag viðrar vel til loftárása
Posté le 31-03-2008 à 15:46:23  profilanswer
 

lorill a écrit :

l'ego, c'est pour les faibles :o


Ok, ben t'as loosé comme un gros moisi, faudrait que tu songes à retourner faire du PHP :o

Spoiler :

mieux?


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1710435
lorill
Posté le 31-03-2008 à 16:01:10  profilanswer
 

masklinn a écrit :


Ok, ben t'as loosé comme un gros moisi


:jap:
 

masklinn a écrit :


faudrait que tu songes à retourner faire du PHP :o


je suis une brele en php, a part faire un include et 2/3 bricoles, je sais plus du tout comment ca marche.
 

Spoiler :


m'en fous, j'ai fait mon premier programme utile, ca change des exercices de manipulations de listes a la con

n°1713212
lorill
Posté le 05-04-2008 à 20:28:05  profilanswer
 

bon, encore un truc pas clair dans ma tête.
 
Le contexte : un jeu de plateau, avec des unités, qui ont un etat (points de vie, point de deplacement, ...).
 
Est-ce que mes unités doivent être un type, et chaque fonction de modif d'état doit renvoyer un nouvelle unité, ou est-ce que je suis censé faire en sorte que mon unité soit une monade ?

n°1713258
masklinn
í dag viðrar vel til loftárása
Posté le 05-04-2008 à 23:56:54  profilanswer
 

1 je dirais, plus du conserves de pureté et plus c'est facile de raisonner. En bonus, ça facilite des trucs genre tests, et ça évite que tout ton code soit dans une monade.


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°1716561
IrmatDen
Posté le 11-04-2008 à 23:09:16  profilanswer
 

Allez hop, up en moins d'une semaine. Inutile mais up quand même:
qtHaskell ==  [:cerveau delight]  
 
J'en suis qu'à porter les tutos de la doc, mais ça fleure bon d'avance...

n°1716584
KangOl
Profil : pointeur
Posté le 12-04-2008 à 01:28:25  profilanswer
 

lorill a écrit :


ce que je voulais dire par la, c'est que le proxy n'autorise que le http, et qu'en plus les sites sont filtrés.


http://www.mibbit.com/

n°1718651
BenO
Profil: Chercheur
Posté le 16-04-2008 à 16:06:09  profilanswer
 

proot :o


---------------
Python Python Python
n°1719170
lorill
Posté le 17-04-2008 à 13:01:10  profilanswer
 

ca revient, mauvais bouton.


Message édité par lorill le 17-04-2008 à 13:01:23
n°1719173
lorill
Posté le 17-04-2008 à 13:06:11  profilanswer
 

Bon, j'ai réussi a faire ce que je voulais, mais ca me semble super compliqué par rapport a ce que j'avais a l'origine en java. J'imagine qu'on peut faire mieux.

 

Donc j'ai une carte, qui ressemble à ca :

 


TTT.............O......................
..TT............O......................
.TT.............O....X.........T.......
................O.....X.......TT.......

 

Mes chateaux sont représentés par des T. Je cherche a trouver toutes les cases qui font partie d'un chateau donné.

 

J'ai fait comme ca :

Code :
  1. type Coord = (Int, Int)
  2. data Map = Map { mapdata :: [[Char]] }
  3. -- snip
  4. data Castle = Castle { coords :: [Coord] }
  5. buildCastle :: Map -> Castle -> Coord -> Castle
  6. buildCastle m c xy
  7.   | not (isCastle m xy) = c
  8.   | xy `elem` (coords c) = c
  9.   | otherwise = foldl (buildCastle m) c' (near xy)
  10.   where
  11.     c' = Castle (xy:(coords c))
  12.     variations x = [x-1, x, x+1]
  13.     near (x, y) = [(a, b) | a <- variations x, b <- variations y, (a, b) `isInMap` m && (a, b) /= (x, y)]
 

Mon main me calcule le chateau qui contient (0, 0) :
Castle {coords = [(2,1),(2,2),(1,3),(1,2),(0,2),(0,1),(0,0)]}

 

Ca marche bien, mais c'est bof.
Le point qui m'embete le plus, c'est que je me réappelle pour des coordonnées que j'ai déjà traité.

 

Des idées pour améliorer ca ?

 

Edit: erreur de copier/coller dans le code, ajout de gardes pour simplifier


Message édité par lorill le 17-04-2008 à 13:26:45
n°1719265
nraynaud
lol
Posté le 17-04-2008 à 15:57:13  profilanswer
 

lorill> la mémoïsation / programmation dynamique consiste à cacher les résultats pour que quand tu traites un truc déjà vu tu ne re-descende pas la branche.


---------------
trainoo.com, c'est fini
n°1719301
IrmatDen
Posté le 17-04-2008 à 16:52:23  profilanswer
 

Je vais peut-être dire une grosse bêtise, mais au moins je le saurais :)
 
Pourquoi ne pas passer par une fonction d'implémentation qui prend en paramètre un tableau des coordonnées déjà testées? Tu peux ajouter la non-appartenance de la coordonnée au dit tableau dans la garde de la génération du tableau pour éviter de repasser dessus?
 
Genre:

Code :
  1. buildCastle :: Map -> Castle -> Coord -> Castle
  2. buildCastle = buildCastle' []
  3.              where buildCastle' :: [Coord] -> Map -> Castle -> Coord -> Castle
  4.                     buildCastle' vc m c xy
  5.                       | not (isCastle m xy) = c
  6.                       | xy `elem` (coords c) = c
  7.                       | otherwise = foldl (buildCastle' (xy:vc) m) c' (near xy)
  8.                       where
  9.                         c' = Castle (xy:(coords c))
  10.                         variations x = [x-1, x, x+1]
  11.                         near (x, y) = [(a, b) | a <- variations x, b <- variations y,
  12.                                                 (a, b) `isInMap` m && (a, b) /= (x, y) && not((a,b) `elem` vc)]


(disclaimer: non testé etc... :/)

n°1719328
lorill
Posté le 17-04-2008 à 17:25:50  profilanswer
 

ce n'est pas nécéssaire en fait, puisque ton vc, je le retrouve dans c.
 
par contre je peux effectivement rajouter un  

Code :
  1. (a, b) `notElem` (coords c)


dans la construction de liste dans "near".

n°1719351
IrmatDen
Posté le 17-04-2008 à 17:51:11  profilanswer
 

Ah ok, j'avais pas percuté... S'il y a autre chose je vois pas alors :/

n°1719962
lorill
Posté le 18-04-2008 à 15:57:07  profilanswer
 

bon ben je me suis bien amusé :
 
http://images.imagehotel.net/kiqugchlgh.png
 
dommage que les paquets de Gtk2Hs soient foireux sous ubuntu...

n°1721476
lorill
Posté le 22-04-2008 à 10:25:43  profilanswer
 

bon, je vais être obliger de passer par des IORef pour gérer mes modifications d'état.
 
Il vaut mieux un seul IORef avec une grosse structure dedans, ou plein d'IORefs avec a chaque fois un élément plus simple ?

n°1721583
IrmatDen
Posté le 22-04-2008 à 11:14:45  profilanswer
 

Le problème principal de plusieurs IORef, c'est la verbosité de la déclaration. A part ça, je préfère partir sur l'utilisation d'IORef sur des types de base pour l'instant.

 

Je préfére, par exemple:
xy <- readIORef $ coords castle
que
c <- readIORef castle
let xy = coords c

 

J'imagine aussi que tu gardes la possibilité de conserver un peu de pureté dans les fonctions s'appliquant à un type dont certains des attributs sont en IORef. Après s'ils le sont tous, je dirais que ça relève d'une préférence syntaxique.

Spoiler :

Y'a plus qu'a attendre le bash de masklinn parce que j'ais raté quelque chose d'important :D


Message édité par IrmatDen le 22-04-2008 à 11:15:17
n°1721600
lorill
Posté le 22-04-2008 à 11:22:20  profilanswer
 

je ne serais pas descendu jusqu'au type de base, en fait.
si j'ai ces types :
 

Code :
  1. data Unit = Unit { archetype :: Archetype, movePoints :: Int, hitPoints :: Int, coords :: Coords }
  2. data Army = Army { name :: String, units :: [Unit] }


 
mes unités sont mutables (points de vie & deplacement, coordonnées)
mes armées sont mutables (unités recrutés, unités mortes)
 
je peux faire :
* un ioref par unité + un ioref par armée
* un ioref par armée
* un ioref unique pour toutes les armées
 
les autres types sont immutables.

n°1721639
IrmatDen
Posté le 22-04-2008 à 11:44:03  profilanswer
 

Je dirais solution 1 (le max d'IORef). Mais tant que tu es dans le code du gameplay, tu peux pas te permettre de t'en passer?

n°1721696
lorill
Posté le 22-04-2008 à 13:07:21  profilanswer
 

je ne pense pas, parce que comme je fais du gtk, mes fonctions sont appelées par gtk directement, donc mes parametres sont fixes.
 
ou alors j'ai zappé un truc, ce qui est aussi fort possible.

n°1721884
IrmatDen
Posté le 22-04-2008 à 15:02:33  profilanswer
 

Ah oui forcément. J'ai le même dilemne avec Qt... Et la meilleure chose que j'ai trouvée, c'est de trimballer un type normal embarqué dans un IORef, eg:

Code :
  1. data Unit = Unit { archetype :: Archetype, movePoints :: Int, hitPoints :: Int, coords :: Coords }
  2. type UnitRef = IORef Unit -- ou UnitPtr, chacun sa notation :)


Mais ça revient à la première solution... Avoir un data type propre te permet tout de même de gérer les fonctions du gameplay de façon pure, et c'est juste les fonctions côté GUI qui gère la mise à jour de la variable.
 
Bref, je ne vois (pour l'instant du moins) rien de plus propre.


Message édité par IrmatDen le 22-04-2008 à 15:03:03
n°1721931
lorill
Posté le 22-04-2008 à 15:26:23  profilanswer
 

en fait, ca ne m'aide pas a choisir, parce que je peux avoir mon gameplay pur peu importe ce que je mets en ioref, mon callback fait le readIORef, appelle la/les fonctions pures, et fait le writeIORef derriere.
 
donc de ce coté là, que je mettes juste mes unités en ioref, ou les armées en ioref (qui contiennent donc les unités), ou tout l'état du jeu dans une  seule ioref, ca ne change rien par rapport a ca.
 
je tourne en rond en fait, parce que les 3 sont possibles, mais je n'arrive pas a voir lequel est le "mieux" [:gratgrat]

n°1721950
IrmatDen
Posté le 22-04-2008 à 15:40:48  profilanswer
 

Euh, joker :D
Je pense que prendre la bonne décision nécessite une meilleure connaissance d'haskell que ce que j'ai... Si t'as accès à irc, tu peux toujours demander sur #haskell tu obtiendras sans doute des réponses fondées voire argumentées :)

n°1721953
lorill
Posté le 22-04-2008 à 15:42:12  profilanswer
 

j'ai pas.
 
je pense que je vais mettre les armées uniquement en ioref, et il sera toujours temps de changer si c'est trop pénible à l'usage.  
 
merci de tes réponses en tout cas :jap:

n°1721955
IrmatDen
Posté le 22-04-2008 à 15:45:25  profilanswer
 

Avec plaisir; tiens nous (moi? je sais pas si y'a des lurkeurs ici :D) au courant, ton expérimentation me sera d'une grande aide quand je me déciderais à lâcher un peu l'apprentissage d'haskell en mode console...

n°1722909
lorill
Posté le 23-04-2008 à 15:29:23  profilanswer
 

bon, j'ai un doute sur ce que je fais, je crains un peu pour les perfs, parce que je ne comprends pas ce qui se passe derrière :
 
J'ai toujours mes mêmes types :

Code :
  1. type Coords = (Int, Int)
  2. data Unit = Unit { archetype :: Archetype, movePoints :: Int, hitPoints :: Int, coords :: Coords }
  3. data Army = Army { name :: String, units :: [U.Unit] }


 
J'ai ce code (le U, c'est le module Unit, qui contient mon type & quelques bricoles)

Code :
  1. updateUnit :: (U.Unit -> U.Unit) -> Army -> Coords -> Army
  2. updateUnit f army coords = Army (name army) (updateUnit' (units army))
  3.   where
  4.     updateUnit' [] = []
  5.     updateUnit' (u:us) = (if U.coords u == coords then f u else u):(updateUnit' us)
  6.                                
  7. updateArmyUnit :: (U.Unit -> U.Unit) -> [Army] -> Coords -> [Army]                               
  8. updateArmyUnit f [] _ = []
  9. updateArmyUnit f (a:as) coords = (updateUnit f a coords):(updateArmyUnit f as coords)
  10. hit :: Int -> Unit -> Unit
  11. hit amount unit = Unit (archetype unit) (movePoints unit) ((hitPoints unit)-amount) (coords unit)


 
et a l'utilisation, si l'unité en (x, y) se fait attaquer, j'ai ca

Code :
  1. Army.updateArmyUnit (hit 1) armies (x, y)


 
Et si j'imagine bien ce qui se passe, je n'arrete pas de reconstruire mes listes et mes Army, non ?
ou alors le compilateur est vraiment très fort ?

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7

Aller à :
Ajouter une réponse
 

Sujets relatifs
Rien ne s'afficheRien n'apparait sur IE..
[SQL Server 2005] Full-Text Index n'indexe rien[XPATH] Chemin fonctionnel
Est ce qu'un serveur CVS sert bien a cela?[MySQL] a quoi sert l'interclassement ?
Php ne renvoi rien au navigateurca veut rien dire (req VBA)
Je ne comprend rien au PHP[HTML - CSS] Problème avec la balise <a>href="#">blabla</a>
Plus de sujets relatifs à : blabla@fonctionnel : Taiche ne sert à rien


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)