30

love
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#

31

lol Moumou ^^ cela dit, c clair que C sux parce qu'il y a pas de garbage collection, mais en C# ça poutrerait carrément plus happy

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

32

28> love
C sux parce qu'il y a pas de garbage collection

Finalement tu n'es pas inaccessible à la Raison cheeky
C# ça poutrerait

Même s'il reste encore des progrès à faire 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

33

J'ai dit où que la GC n'était pas bien ? Je ne crois pas avoir dit non plus qu'à choisir entre C et OCaml, je prendrais le C... En tout cas je trouve que plein de choix architecturaux d'OCaml sont complètement débiles (à commencer par le typage auto happy).

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

34

Mais lol, pollux !!
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

35

- Pourquoi? C'est au contraire une force!
- Comment pourrait il en être autrement? (sans abandonner la sécurité!)
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

36

Mais de quoi il parle ? confus

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

37

du typage auto, bien sûr.
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

38

Ah OK je pensais que les tirets voulaient dire que tu répondais à 2 trucs différents embarrassed

Hippopotamu
: - Pourquoi? C'est au contraire une force!

Ca pourrait alléger la syntaxe, mais ça rajoute tellement de contraintes sur le langage (suffit de voir comme il est pourri) que j'en viens à me demander si le jeu en vaut vraiment la chandelle...
- Comment pourrait il en être autrement? (sans abandonner la sécurité!)

Depuis quand le typage statique ne peut se faire qu'avec un typage à la Caml confus

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

39

Ca pourrait alléger la syntaxe, mais ça rajoute tellement de contraintes sur le langage (suffit de voir comme il est pourri) que j'en viens à me demander si le jeu en vaut vraiment la chandelle...

rotfllaughtrotfl
- syntaxe mille fois plus légère, comme tu dis.
- abstraction propre et sécurité (le programmeur ne peut pas aller écrire un int là où il y a un float, ce qui serait tout de même atrocesick)

Ca ne rajoute pas la moindre contrainte, mais au contraire des avantages : propreté, sécurité.
Depuis quand le typage statique ne peut se faire qu'avec un typage à la Caml

Si tu veux un typage sûr et strict, il est inutile de se passer du typage auto puisque le typage manuel donnerait le même résultat.
Si tu veux un typage pas sûr ou pas strict, alors abandonne les langages d'3l33t comme le caml et va programmer en scilab, barbare! couic
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

40

Le typage manuel est tout à fait possible en caml hein Pollux ^^
au lieu de let id x = x, tu peux écrire let id (x:int) = x, auquel cas tu obtiens une fonction de type int -> int au lieu de 'a -> 'a
et tu peux aussi forcer le type de ta fonction (auquel cas si jamais tu te goures dedans ça refusera de compiler au lieu de te donner un type qui n'est pas celui que tu voulais, ceci dit ce dernier cas est en général très facile à détecter, soit en balançant ta fonction dans le toplevel juste après l'avoir écrite, pratique recommandée ^^, et constatant qu'elle n'a pas le bon type, soit, même si tu le fais pas, à l'utilisation de la fonction très vraisemblablement... mais si tu préfères forcer, rien ne t'en empêche smile)

Euh sinon, c'est quoi les contraintes dont tu parles confus Le typage auto « rajoute tellement de contraintes sur le langage... » confusconfus
Là je ne vois pas *du tout* de quoi il peut bien s'agir neutral
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#

41

Hippopotamu
:
Ca pourrait alléger la syntaxe, mais ça rajoute tellement de contraintes sur le langage (suffit de voir comme il est pourri) que j'en viens à me demander si le jeu en vaut vraiment la chandelle...

rotfllaughtrotfl - syntaxe mille fois plus légère, comme tu dis.

Ah... Devoir mettre le nom du type devant chaque appel de fonction, c ça une syntaxe légère ? neutral
- abstraction propre et sécurité (le programmeur ne peut pas aller écrire un int là où il y a un float, ce qui serait tout de même atrocesick)

les conversions totalement implicites et silencieuses du C soient un peu dangereuses, mais ce n'est en aucun cas une conséquence du modèle de typage : le C#, lui, refuse les conversions implicites float->int. Et si je veux faire une conversion, c'est carrément plus simple de faire (int)(x*2.3+0.5)Je veux bien que*. 2.3 +. 0.5) que de faire int_of_float ((float_of_int x) ...
Ca ne rajoute pas la moindre contrainte, mais au contraire des avantages : propreté, sécurité.

"propreté", excuse-moi, mais c'est un peu un gros !mac...
Depuis quand le typage statique ne peut se faire qu'avec un typage à la Caml

Si tu veux un typage sûr et strict, il est inutile de se passer du typage auto puisque le typage manuel donnerait le même résultat.
Si tu veux un typage pas sûr ou pas strict, alors abandonne les langages d'3l33t comme le caml et va programmer en scilab, barbare! couic

On peut avoir un typage statique sans avoir de typage automatique, hein roll

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

42

Mon post est invisible ?
Ah... Devoir mettre le nom du type devant chaque appel de fonction, c ça une syntaxe légère ?

hum tu parles de quel langage là ? le java, où tout te retourne des Object et faut caster après, c'est ça ?
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#

43

Sally :
Le typage manuel est tout à fait possible en caml hein Pollux ^^
au lieu de let id x = x, tu peux écrire let id (x:int) = x, auquel cas tu obtiens une fonction de type int -> int au lieu de 'a -> 'a
et tu peux aussi forcer le type de ta fonction (auquel cas si jamais tu te goures dedans ça refusera de compiler au lieu de te donner un type qui n'est pas celui que tu voulais, ceci dit ce dernier cas est en général très facile à détecter, soit en balançant ta fonction dans le toplevel juste après l'avoir écrite, pratique recommandée ^^, et constatant qu'elle n'a pas le bon type, soit, même si tu le fais pas, à l'utilisation de la fonction très vraisemblablement... mais si tu préfères forcer, rien ne t'en empêche smile)

Euh oui bien sûr mais ce n'est pas du tout de ça que je parle...
Euh sinon, c'est quoi les contraintes dont tu parles confus Le typage auto « rajoute tellement de contraintes sur le langage... » confusconfus
Là je ne vois pas *du tout* de quoi il peut bien s'agir neutral

Je ne sais pas du tout si les conversions automatiques et autres surcharges sont faisables avec un typage automatique... Peut-être que c'est possible, je n'en sais rien, mais en tout cas toujours est-il qu'à peu près tous les langages couramment utilisés (C, C++, Java, C#, Perl...) ont une certaine forme de surcharge et de conversion auto (au moins built-in, comme en C ou en Perl -- même si je trouve cette solution [celle de le restreindre aux types builtin] moyennement satisfaisante intellectuellement, c'est pratique), alors qu'OCaml n'en a pas. Alors soit tous les autres langages ont tort et tout le monde va utiliser OCaml justement parce qu'il n'a pas de surcharge et que c'est Tellement Plus Propre ©, soit on peut se poser la question de savoir si cette absence n'est pas liée au fait que sachant que le typage est automatique, ça pourrait imposer de forte contrainte sur le typage d'avoir ce genre de chose (de même que le fait qu'il y ait un typage automatique impose, par exemple, que les namespaces des records soit totalement disjoints [une aberration, entre nous soit dit roll]).

A vrai dire comme ça a certainement déjà été posé sur la mailing list d'OCaml, y aurait pas un Kevinoïde de passage dans le coin pour nous dire si ça a été envisagé/refusé/prévu/abandonné ?

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

44

On peut avoir un typage statique sans avoir de typage automatique, hein roll

Utilité ?
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#

45

Sally
: Mon post est invisible ?

J'étais en train d'y répondre...
Ah... Devoir mettre le nom du type devant chaque appel de fonction, c ça une syntaxe légère ?

hum tu parles de quel langage là ?

OCaml, où on est obligé de faire :
let ajouter a b =
  ajouter_superlongnomdetypeno1 (superlongnomdetypeno1_of_superlongnomdetypeno2 a) (superlongnomdetypeno1_of_superlongnomdetypeno2 b)

Ou encore :
let somme_des_longueurs a b =
  a.superlongnomdetype_longueur + b.superlongnomdetype_longueur

le java, où tout te retourne des Object et faut caster après, c'est ça ?

Oui, ça je suis d'accord que c'est absolument insupportable... (et c'est très gore, en plus) Mais les types paramétriques ont été implémenté dans la dernière version du langage je crois (la 1.5).

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

46

de même que le fait qu'il y ait un typage automatique impose, par exemple, que les namespaces des records soit totalement disjoints [une aberration, entre nous soit dit roll]
Euh, certes... les objets n'ont pas cette contrainte-là, pour les records je ne sais pas du tout s'ils ont l'intention de la retirer (en fait je ne sais pas si les records ont une utilité autre que locale maintenant qu'il y a les objets... et la contrainte dont tu parles n'est gênante que si le type record est exporté, sinon, elle ne vaut que pour l'intérieur d'un même fichier, où elle est gérable).
Ceci dit, tu te trompes de cause : ce n'est pas le typage automatique qui est responsable de cette contrainte, c'est l'absence de types polymorphes de la forme {bidule : type, ...}
Je suppose que c'est réalisable pour les records puisque ça l'est pour les objets...

(N.B. : le ./44 était un cross)
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#

47

Sally
:
de même que le fait qu'il y ait un typage automatique impose, par exemple, que les namespaces des records soit totalement disjoints [une aberration, entre nous soit dit roll]
Euh, certes... les objets n'ont pas cette contrainte-là, pour les records je ne sais pas du tout s'ils ont l'intention de la retirer (en fait je ne sais pas si les records ont une utilité autre que locale maintenant qu'il y a les objets... et la contrainte dont tu parles n'est gênante que si le type record est exporté, sinon, elle ne vaut que pour l'intérieur d'un même fichier, où elle est gérable).

Oué, de toute façon là je vais devoir reprendre un projet en OCaml, donc je vais regarder d'un peu plus près ces histoires d'objets. Malheureusement tout le code existant ressemble plus à du Caml Light qu'à de l'OCaml sad (et c du code récent, moins d'un an) Je sais pas si c juste que le type qui a écrit ça qui connaissait mal les objets, où s'il y a des contraintes trop importantes.
Ceci dit, tu te trompes de cause : ce n'est pas le typage automatique qui est responsable de cette contrainte, c'est l'absence de types polymorphes de la forme {bidule : type, ...} Je suppose que c'est réalisable pour les records puisque ça l'est pour les objets...

Oui, bien sûr ; mais il y a probablement un lien entre les deux (par exemple, il faut éviter les explosions de complexité).


Tiens au fait, est-ce qu'OCaml gère proprement les cross-references (comme Java ou C#), ou est-ce qu'il fait ça d'une manière gore ? (c'est un peu "adouci" par rapport au C avec les .mli faits automatiquement, j'ai l'impression, mais ça doit être assez primaire s'il gère tout comme si c'était tapé dans le top-level -- notamment ça pourrait foirer s'il fait ça naïvement avec des références cycliques, ou des forward references au sein d'un même fichier)

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

48

Ceci dit, tu exagères, il n'impose pas vraiment que les namespaces des records soient disjoints... je viens de tester, muahahahaha ^^ (j'utilise très peu de records donc j'avais jamais fait l'expérience happy>
)# let f bidule = bidule.contents;;
val f : 'a ref -> 'a = <fun>
# type machin = {contents : int};;
type machin = { contents : int; }
# let f bidule = bidule.contents;;
val f : machin -> int = <fun>
# let f bidule = bidule.Pervasives.contents;;
val f : 'a ref -> 'a = <fun

Donc la contrainte est beaucoup plus légère que ce que tu laissais entendre (même si je dois reconnaître qu'elle peut probablement s'avérer un peu chiante, m'enfin comme je le disais elle est gérable, et ne devrait pas poser de problème sauf dans des cas tordus happy)
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#

49

Tiens au fait, est-ce qu'OCaml gère proprement les cross-references (comme Java ou C#), ou est-ce qu'il fait ça d'une manière gore ? (c'est un peu "adouci" par rapport au C avec les .mli faits automatiquement, j'ai l'impression, mais ça doit être assez primaire s'il gère tout comme si c'était tapé dans le top-level -- notamment ça pourrait foirer s'il fait ça naïvement avec des références cycliques, ou des forward references au sein d'un même fichier)
euh, si tu pouvais préciser ta pensée ça m'aiderait à répondre cheeky enfin, c'est sans doute précis mais je comprends que la moitié des termes donc... ^^
Tu veux savoir si deux modules définis dans des fichiers séparés ont le droit de se référencer l'un l'autre dans les deux sens ? je suis pas sûre, mais je ne crois pas (s'ils sont définis dans le même fichier, il n'y a aucun problème, il suffit de les déclarer par module machin = ... and truc = ...)
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#

50

Arguments ending in .cmx are taken to be compiled object code. These files are linked together, along with the object files obtained by compiling .ml arguments (if any), and the Caml standard library, to produce a native-code executable program. The order in which .cmx and .ml arguments are presented on the command line is relevant: compilation units are initialized in that order at run-time, and it is a link-time error to use a component of a unit before having initialized it. Hence, a given x.cmx file must come before all .cmx files that refer to the unit x.
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#

51

Ah tiens c rigolo ça les histoires de namespaces d'étiquettes happy Pervasives.my_ref.Pervasives.contents.Pervasives.value cheeky (bon, ok, je trolle)

Et je sais, j'avais essayé, mais si c'est dans le même namespace (comme ça risque fréquemment d'arriver si on ne fait pas de l'OO, par exemple "c_statement.label" et "asm_statement.label"), on est bel et bien foutu (sauf si on utilise dans la moitié du code l'un et dans l'autre moitié l'autre, mais ça revient à séparer en fichiers et je pense que même avec la plus mauvaise foi du monde tu aurais du mal à dire que c pas gore wink [impossible d'échanger l'endroit de définition de deux fonctions couic2])

D'ailleurs, ces histoires d'endroit de définition de fonctions me rappellent que tu as éludé cette histoire de cross-references tongue (ce serait un peu con que le même code ne fasse pas la même chose à des endroits différents du prog, non ? embarrassed)

[EDIT : cross]

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

52

./49-49> couiccouiccouic Ils ont même pas été foutus d'arranger ça depuis Caml Light ? tsss

Accessoirement, je ne suis pas sûr non plus que ça soit totalement indépendant du typage automatique... Parce que j'imagine qu'au niveau vitesse, Tcompil(let module1 and module2) > Tcompil(let module1)+Tcompil(let module2) ...

A moins qu'il y ait un switch de ligne de commande pour le faire ?

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

53

ce serait un peu con que le même code ne fasse pas la même chose à des endroits différents du prog, non ?

Ben non, c'est normal cheeky. Par contre, se servir de ce fait est assez gore grin.
Ça ne peut guère arriver involontairement hein (faut s'amuser à définir plusieurs fonctions de même nom ou alors faire des trucs louches avec les open... tiens à ce propos tu me donnes envie de faire des expériences 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#

54

./53>
Oui je suis d'accord que ce n'est pas vraiment un problème au niveau sécurité (si ça foire, y a des chances qu'on ait droit à une erreur), mais par contre le fait que les définitions doivent impérativement se faire dans l'ordre est très chiant, surtout en cas de références croisées...

(let f x =
...

let x1 x =
...

module x2 =
...

let x3 x =
...

type x4 = ...

...

let g y =
...)

(et le tout éventuellement sur plusieurs fichiers si on veut s'amuser trilove)

s'il y a des références dans g à x42 (qui lui-même a besoin des autres x41 & co), et que je veux rajouter dans f une référence à g, je suis bien dans la merde... soit je passe tout en let...and (très chiant, et je sais même pas si c possible de mélanger les différents types de déclarations entre eux), soit je suis obligé de faire un prototype comme en C sad (et ça, ça devient vite très chiant... tellement qu'ils ont fait un parsing en plusieurs passes en C++ alors que ça complique les choses, surtout pour un langage lourd comme C++)

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

55

et ./52 ?

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

56

./52 > bah je sais pas du tout comment marche le linker et j'ignore la raison d'être de cette contrainte, pour tout dire. Donc je peux pas répondre.
Pour les and, non on peut pas mélanger... let and, type and, module and, class and aussi il me semble, mais pas de mélanges.
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#

57

<content-type="?s=441">
Mouais, OCaml en est encore au stade d'alpha inutilisable, quoi... sad
</>

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

58

<mode=logicor, flavor=contraposée>
non Ce n'est pas un troll, puisqu'il n'y a pas la moindre part de vérité!
</>
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

59

<mode=meta-logicor, flavor=contraposée>
non Ce n'est pas un troll, puisqu'il n'y a pas la moindre part de vérité!
</>

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

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#