60

Bon, je salue l'effort d'avoir fait un pavé, mais franchement ton article n'est pas terrible.
Y'a la critique de la lib standard, soit, mais elle revient très souvent donc c'était pas forcément la peine de le répéter tongue, et moi je préfère une lib standard petite mais principalement fonctionnelle à la lib .Net.
Ensuite, la surcharge, je suis de ceux qui sont contre dans le cas général, ça crée des confusions, par contre pour les opérateurs standard, là si tu y tiens, ça se fait en 2 lignes de p4.
Ce qui nous mène au point primordial suivant : pas de f#p4.
Et puis, moi quand j'ai besoin de faire un programme certes pas le plus rapide mais avec de très bonnes performances quand même, j'hésite rarement à le faire en ocamlopt plutôt qu'en C. F# pose un problème de perfs quand on utilise beaucoup le style fonctionnel (et ça n'est pas la faute du langage, juste la vm .Net qui n'est pas du tout faite pour).
Tu parles de menhir, il faut voir qu'il n'est pas encore totalement au point, qu'il n'a pas les mêmes perfs qu'ocamlyacc donc il n'est pas ntégrable tout de suite, et puis il utilise un système de types trop expressif qui l'oblige à générer du caml non typable (donc avec des casts).
Quant à l'argument "c'est moins bien sous windows"... ben j'ai eu à faire du caml sous windows, j'ai simplement mis un emacs pour avoir le mode tuareg, et c'est fini, et y'a un plugin eclipse pour ocaml, qui d'ailleurs est l'objet d'un google SoC cette année (il me semble, enfin c'était une proposition en tout cas).
Et puis ocaml, c'est gratuit, c'est libre, emacs et tuareg, c'est gratuit, c'est libre, ...

Enfin bon, critique générale : il est très facile de critiquer ocaml dans pas mal de domaines, mais tu es passé à côté tongue
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

61

Y'a la critique de la lib standard, soit, mais elle revient très souvent donc c'était pas forcément la peine de le répéter tongue, et moi je préfère une lib standard petite mais principalement fonctionnelle à la lib .Net.

Je ne trouve pas. Comme je l'ai dit, rien que la gestion des strings est très décevante. Plus d'une fois je me suis retrouvé à écrire une fonction qui devrait dans la lib de tout langage.

Par ailleurs, dès que tu as un besoin particulier, il est probable que tu ne trouveras pas la bibliothèque qu'il te faut, juste parce que la communauté est petite. Avec F#, il n'y a pas ce genre de problème, parce qu'il a accès aux lib .NET. Essaie d'écrire mettons un MMORPG en Caml, tu comprendras...
Je considère surtout que F# peut directement concurrencer Java et C#, ce que Caml ne peut pas faire.
Ensuite, la surcharge, je suis de ceux qui sont contre dans le cas général, ça crée des confusions, par contre pour les opérateurs standard, là si tu y tiens, ça se fait en 2 lignes de p4.

Euh non. Le préprocesseur ne te donnera jamais de surcharge. Compare le C et le C++ : l'apport de la surcharge me semble flagrant (même s'ils en ont abusé en C++). Surcharger les opérateurs de base +, *, - apporte beaucoup en général.
Il ne faut bien sûr pas abuser de la surcharge (au risque d'affaiblir le typage), mais en utiliser un peu améliore grandement le langage. Je trouve ça dramatique de devoir nommer ses fonctions *_int, *_float, *_string, etc. Ce genre de notation est vraiment néfaste.

Dans F#, la surcharge est assez peu utilisée dans la bibliothèque standard, mais c'est très agréable. En F#, il y a plusieurs types d'entiers (int8, int16, int, int64...) et de flottants (float, float32), en plus des bignums. Heureusement que chaque fonction n'existe pas en 10 exemplaires ! Heureusement qu'il n'y a pas 10 opérateurs d'addition !

La surcharge peut aussi être utilisée dans les types que l'on déclare, et c'est plutôt pas mal. Si tu déclares un type complexe (mauvais exemple, il existe déjà), tu pourras avoir ton opérateur +, au lieu d'un vague complex_add.
Ce qui nous mène au point primordial suivant : pas de f#p4.

Oui, et c'est dommage.
Mais d'une part, il est rarement utilisé dans les projets - il sert principalement pour étendre le langage dans les bibliothèques. En pratique, il sert souvent à combler les manques du langage (à moins que tu aies des exemples concrets d'application ?). Par exemple, ajouter le "finally" dans un "try".

D'autre part, F# a d'autres fonctionnalités que je n'ai pas décrites en détail, mais qui apportent beaucoup (listes en compréhension, les active patterns (qui permettent entre autre de faire du pattern-matching avec des expressions rationnelles ou du pattern matching sur du XML[1]), syntaxe basée sur l'indentation, affichage générique des variables, augmentation de types (pour ajouter des membres aux types non-objets), introspection...). Donc oui, les deux langages ont leurs avantages et inconvénients. Aucun n'est vraiment meilleur partout, mais F# a maintenant ma préférence.
Et puis, moi quand j'ai besoin de faire un programme certes pas le plus rapide mais avec de très bonnes performances quand même, j'hésite rarement à le faire en ocamlopt plutôt qu'en C. F# pose un problème de perfs quand on utilise beaucoup le style fonctionnel (et ça n'est pas la faute du langage, juste la vm .Net qui n'est pas du tout faite pour).


Et pourtant... Sous Windows, F# a des performances comparables à celles d'ocamlopt. Avec Mono, c'est en effet un peu plus lent. Si les performances de F# ne te suffisent pas en moyenne, j'ai peur que tu doives te mettre à coder en assembleur.

http://cs.hubfs.net/forums/thread/3196.aspx
http://caml.inria.fr/pub/ml-archives/caml-list/2007/03/68d6be8afe6d2e5e290e2c68e536f79e.en.html

Tu parles de menhir, il faut voir qu'il n'est pas encore totalement au point, qu'il n'a pas les mêmes perfs qu'ocamlyacc donc il n'est pas ntégrable tout de suite, et puis il utilise un système de types trop expressif qui l'oblige à générer du caml non typable (donc avec des casts).

D'accord, c'est dommage. Beaucoup de gens le conseillent et je l'apprécie. L'utilisation des Obj.magic, tant que c'est vérifié (et même si c'est très moche), ne devrait pas être un problème dans une bibliothèque.
Quant à l'argument "c'est moins bien sous windows"... ben j'ai eu à faire du caml sous windows, j'ai simplement mis un emacs pour avoir le mode tuareg, et c'est fin
En utilisant des bibliothèques extérieures à la distribution standard ? En faisant un projet avec plusieurs fichiers ?
Moi aussi, j'ai souvent utilisé Emacs. C'est un excellent éditeur, mais c'est loin d'être parfait en tant qu'environnement de développement.
Et puis ocaml, c'est gratuit, c'est libre, emacs et tuareg, c'est gratuit, c'est libre, ...
C'est vrai.
F# est gratuit, n'est pas tout à fait libre, mais les sources sont fournies et on peut les modifier. Personnellement, j'ai fait quelques bug-reports et j'ai envoyé des patches, j'ai toujours eu une réponse favorable dans les 24h. F# n'a rien à voir avec C#, par exemple. Il est bien plus ouvert.
il est très facile de critiquer ocaml dans pas mal de domaines, mais tu es passé à côté :

Comme... ?

En tout cas, merci pour ton commentaire.

[1] Pour les détails sur les active patterns, je conseille ce papier : http://blogs.msdn.com/dsyme/attachment/2044281.ashx

62

LLB (./61) :
F# n'a rien à voir avec C#, par exemple. Il est bien plus ouvert.

C'est parce que c'est un projet de recherche. Si il devient un jour un langage phare de microsoft au même titre que C# (ce qui est peu probable, mais imaginons), ben ce sera pareil.
avatar
I'm on a boat motherfucker, don't you ever forget

63

LLB (./61) :
Comme... ?

comme ça :
LLB (./61) :
affichage générique des variables [...] introspection

Tu aurais pu citer les threads aussi, etc.
Pour le reste, c'est dommage que je n'aie pas le temps de troller, mais disons que je ne suis pas d'accord sur : les perfs, la lib, le sucre syntaxique.

Juste ça pour bien lancer le <troll> :
LLB (./61) :
En utilisant des bibliothèques extérieures à la distribution standard ? En faisant un projet avec plusieurs fichiers ? Moi aussi, j'ai souvent utilisé Emacs. C'est un excellent éditeur, mais c'est loin d'être parfait en tant qu'environnement de développement.


Je crois que mon plus gros projet caml faisait environ 30000 lignes et j'utilise souvent lablgtk2 que je trouve tellement bien fait que je préfère coder mes interfaces en lablgtk2 à tous les éditeurs de gui que j'ai testés.
Pour emacs, il n'est pas parfait, certes, mais c'est déjà largement mieux que VS tongue </troll>
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

64

LLB (./61) :
mais en utiliser un peu améliore grandement le langage.


http://cs.hubfs.net/forums/thread/3129.aspx
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

65

BookeldOr (./64) :
http://cs.hubfs.net/forums/thread/3129.aspx

couic (mais apparemment ils vont le corriger ^^)

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

66

LLB (./61) :
Compare le C et le C++ : l'apport de la surcharge me semble flagrant (même s'ils en ont abusé en C++ ). Surcharger les opérateurs de base , *, - apporte beaucoup en général.

Mais encore ?
Il ne faut bien sûr pas abuser de la surcharge (au risque d'affaiblir le typage), mais en utiliser un peu améliore grandement le langage. Je trouve ça dramatique de devoir nommer ses fonctions *_int, *_float, *_string, etc.

Nous n'avons pas la même notation de dramatique.
Ce genre de notation est vraiment néfaste.

Attention, la moitié de la population va mourir à cause de ca !

67

D'autant plus qu'à force, je me suis habitué aux opérateurs différents suivant les types, et que je râle au contraire quand dans un autre langage je ne sais pas différencier syntaxiquement si c'est une opération sur des floats ou des ints.

Le mieux pour améliorer ça pour moi n'est vraiment pas la surcharge, mais plutôt une syntaxe pour préciser l'espace de nommage à la coq.
Exemple Coq car je suppose que personne ne connaît :
  (2+3)%Z   (* les nombres et les opérations sont ceux de Z *)
  (2+3)%nat   (* idem pour nat *)

En caml on pourrait faire
  (2+3)%int
  (2+3)%float
  (2+3)%Byte.t

etc.
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

68

Il me semblait bien que tu étais un homme de goût oui
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

69

Hippopotame (./68) :
Il me semblait bien que tu étais un homme de goût oui.gif


Fais gaffe, parfois j'utilise des objets de ma propre initiative tongue

edit pour faire un post moins inutile :
Dès que j'ai le temps, je regarde la partie implem des active patterns.
Je fais une conclusion à priori: si il s'agît de créer une structure de données une fois le pattern reconnu pour raccourcir l'écriture c'est bien, si par contre ce sont des fonctions de filtrage personnelles qui demandent du temps de calcul et de l'allocation lors du filtrage, c'est simulable directement dans le langage et est faisable en p4, et ça ne doit en aucun cas se mêler au filtrage standard.
Par exemple dans mon petit proto d'analyse statique que je fais pour mon stage, j'ai défini un filtrage perso sur des expressions pour faire des substitutions ;
  type t =
    | Var of int
    | Val of Value.t
    | Bin of Interval.binop * t * t
    | O_acc of t * tfield
    | A_acc of t * t
    | S_acc of klass_name * tfield
    | Array_init of Context.point * Value.t array
  type pat =
    | PAny                                         | PTAny of (t -> bool)
    | PVar of int                                  | PTVar of (int -> bool)
    | PVal of Value.t                              | PTVal of (Value.t -> bool)
    | PBin of Interval.binop * pat * pat           | PTBin of (Interval.binop -> bool) * pat * pat
    | PO_acc of pat * tfield                       | PTO_acc of pat * (tfield -> bool)
    | PA_acc of pat * pat
    | PS_acc of klass_name * tfield                | PTS_acc of (klass_name -> tfield -> bool)
    | PArray_init of Context.point * Value.t array | PTArray_init of (Context.point -> Value.t array -> bool)

  let rec matching pat e =
    match pat,e with
      | PAny,               _                -> true
      | PTAny f,            e                -> f e
      | PVar a,             Var b            -> a = b
      | PTVar f,            Var b            -> f b
      | PVal a,             Val b            -> a = b
      | PTVal f,            Val b            -> f b
      | PBin (op,p1,p2),    Bin (oe,e1,e2)   -> op = oe && matching p1 e1 && matching p2 e2
      | PTBin (f,p1,p2),    Bin (oe,e1,e2)   -> f oe && matching p1 e1 && matching p2 e2
      | PO_acc (p,f),       O_acc (e,fe)     -> f = fe && matching p e
      | PTO_acc (p,f),      O_acc (e,fe)     -> f fe && matching p e
      | PA_acc (pa,pi),     A_acc (ea,ei)    -> matching pa ea && matching pi ei
      | PS_acc (k,f),       S_acc (ke,fe)    -> k = ke && f = fe
      | PTS_acc f,          S_acc (ke,fe)    -> f ke fe
      | PArray_init (p,pa), Array_init (q,a) -> p = q && pa = a
      | PTArray_init f,     Array_init (q,a) -> f q a
      | _ -> false
	  
  let rec subst pat trans e =
    if matching pat e then
      trans e
    else
      match e with
	| Bin (op,e1,e2) -> Bin (op, subst pat trans e1, subst pat trans e1)
	| O_acc (e,f) -> O_acc (subst pat trans e,f)
	| A_acc (e1,e2) -> A_acc (subst pat trans e1, subst pat trans e2)
	| e -> e


Le filtrage a une propriété forte et qu'il ne faut pas changer : pas d'allocation lors du filtrage.
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

70

je ne vois pas en quoi l'allocation serait gênante confus ce qui est gênant, c'est juste les effets de bord...

par contre ton truc maison est bcp moins général qu'un filtrage normal (et je me demande comment tu comptes t'en servir en pratique ?
subst (PBin Plus (PVal 42) (PTVal (fun x->x<>0))) (function Bin _ (Val x) -> Val (42+x))
? c'est un peu crade, tu dois dupliquer le code, tu vas avoir un warning à cause du pattern-matching pas surjectif, etc...)

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

71

Pollux (./70) :
je ne vois pas en quoi l'allocation serait gênante confus.gif ce qui est gênant, c'est juste les effets de bord...


Dans un cas comme dans l'autre ça peut être génant ou non (question perf dans un cas et correction dans l'autre), mais il faut que ça soit explicite ce qui n'est pas possible avec le typage ML (mais je n'ai pas regardé en détail, c'était une remarque à priori, ils ont peut être étendu le typage pour ça).
Si tu utilises un motif actif défini par quelqu'un d'autre, il faudrait le savoir.
Pollux (./70) :
par contre ton truc maison est bcp moins général qu'un filtrage normal (et je me demande comment tu comptes t'en servir en pratique ?
subst (PBin Plus (PVal 42) (PTVal (fun x->x0))) (function Bin _ (Val x) -> Val (42 x)) ? c'est un peu crade, tu dois dupliquer le code, tu vas avoir un warning à cause du pattern-matching pas surjectif, etc...)

Pour la généraiité, oui c'était pas le but en l'occurence, c'était juste pour faire des substitutions en fonction d'un critère plus compliqué que l'égalité structurelle sans faire des fonctions ad hoc partout avec du code presque identique.
Pour le coup du filtrage dans la fonction de transformation, J'ai une variante avec juste une valeur quand je ne souhaite pas utiliser la valeur à remplacer.
Pollux (./70) :
(fun x->x<>0)

((<>) 0) , tu aimes bien te compliquer la vie cheeky ... tongue
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

72

BookeldOr (./71) :
Pollux (./70) :
je ne vois pas en quoi l'allocation serait gênante confus.gif ce qui est gênant, c'est juste les effets de bord...


Dans un cas comme dans l'autre ça peut être génant ou non (question perf dans un cas et correction dans l'autre), mais il faut que ça soit explicite ce qui n'est pas possible avec le typage ML (mais je n'ai pas regardé en détail, c'était une remarque à priori, ils ont peut être étendu le typage pour ça).Si tu utilises un motif actif défini par quelqu'un d'autre, il faudrait le savoir.

Ben de toute façon y a des tonnes de trucs qui sont gênants s'ils ont "trop" d'effets de bords... Tu t'attends pas à ce qu'une fonction de tri te modifie autre chose que ses arguments par exemple ^^ De même c'est évident qu'un déconstructeur ne doit pas avoir d'effet de bord significatif (à part peut-être toucher à un cache ou autres effets de bords inoffensifs), mais le typage de caml n'a pas vocation à être assez expressif pour dire ce genre de choses...
Question perf bof, je vois pas où est le pb qu'un déconstructeur puisse faire des "calculs" : vérifier si un entier est positif ou si un tableau associatif est non vide, c'est certes un calcul mais c'est quand même bien pratique happy
Pollux (./70) :
par contre ton truc maison est bcp moins général qu'un filtrage normal (et je me demande comment tu comptes t'en servir en pratique ?
subst (PBin Plus (PVal 42) (PTVal (fun x->x0))) (function Bin _ (Val x) -> Val (42 x)) ? c'est un peu crade, tu dois dupliquer le code, tu vas avoir un warning à cause du pattern-matching pas surjectif, etc...)

Pour la généraiité, oui c'était pas le but en l'occurence, c'était juste pour faire des substitutions en fonction d'un critère plus compliqué que l'égalité structurelle sans faire des fonctions ad hoc partout avec du code presque identique.Pour le coup du filtrage dans la fonction de transformation, J'ai une variante avec juste une valeur quand je ne souhaite pas utiliser la valeur à remplacer.

Ouais enfin donc si t'es obligé de faire des hacks à moitié satisfaisants pour éviter les limitations du pattern-matching c'est plutôt un argument en faveur des active patterns tongue
Pollux (./70) :
(fun x->x<>0)

((<>) 0) , tu aimes bien te compliquer la vie cheeky ... tongue

ah non ça c'est équivalent à (fun x->0<>x) tripo

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

73

Pollux (./72) :
Ouais enfin donc si t'es obligé de faire des hacks à moitié satisfaisants pour éviter les limitations du pattern-matching c'est plutôt un argument en faveur des active patterns tongue.gif

J'ai jamais dit que c'était mal, juste à prendre avec des pincettes happy.
Puis moi ça me satisfait dans mon cas tongue
Pollux (./72) :
ah non ça c'est équivalent à (fun x->0<>x) tripo.gif

tusors tongue (ceci dit, ça m'est déjà arrivé de bugger un prog en oubliant d'inverser le sens de l'opérateur grin)
Pollux (./72) :
Question perf bof, je vois pas où est le pb qu'un déconstructeur

J'ai pas le temps de préciser M-backspace trollertrigicsad mais l'idée c'est que ça peut faire des goulots d'étranglement difficiles à cerner.
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

74

BookeldOr (./25) :
Dans F#, le pattern matching ne me convainc pas du tout, et puis de toutes façons, il faut une lib objet et fonctionnelle, pas juste l'accès au framework .Net...

Sinon, il y a un port de OCaml pour .Net qui fonctionne assez bien (mais les sources ne sont pas encore ouvertes, ça ne devrait pas tarder), c'est assez rigolo d'ailleurs comme fonctionnement, ça reconstruit les types du lambda code (en fait les types sont virés dès le passage du typeur dans le processus de compilation d'OCaml).

Kochise

C'est moi ou...? confus
avatar
Attention, nouvelle signature #eeek#
https://mastodon.ti-fr.com/@redangel

75

c'est toi cheeky
BookeldOr (./73) :
J'ai pas le temps de préciser M-backspace trollertrigicsad mais l'idée c'est que ça peut faire des goulots d'étranglement difficiles à cerner.

ben oui et non : si la contrepartie de ne pas avoir d'active patterns c'est que les deux tiers de tes pattern-matching aient des clauses when susceptibles elles aussi de ralentir ça ne t'avance pas forcément bcp... et a priori c'est au profiler de cerner les goulots d'étranglement, pas à toi ^^

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

76

LLB (./61) :
Compare le C et le C++ : l'apport de la surcharge me semble flagrant (même s'ils en ont abusé en C++). Surcharger les opérateurs de base +, *, - apporte beaucoup en général.

Ouais, la surcharge, c'est cool pour les petits projets et pour le/les programmeurs qui ont le nez dans le code. Pas pour ceux qui doivent reprendre apres (ie ce qui arrive souvent dans la vraie vie de tous les jours)

77

nEUrOO:
En C, l'opérateur + est surchargé (il accepte des entiers, des flottants...), tu trouves ça gênant ?
En C++, surcharger l'opérateur + pour qu'il fonctionne sur le type qu'on vient de déclarer (du genre nombres complexes ou bigint), tu trouves ça illogique ? Surcharger l'opérateur << pour afficher la classe que l'on vient de définir, tu trouves ça dangereux ?

Tu préfères écrire foo.add(bar), plutôt que foo + bar ? Tu préfères foo.add(bar.mult(baz.add(qux))), plutôt que foo + bar * (baz + qux) ? Savoir où ton opérateur est défini, c'est un peu comme savoir où la méthode est définie : si tu as du mal à retrouver l'endroit de la surcharge, critique ton éditeur plutôt que le langage.

Quand tu critiques la surcharge, c'est celle des fonctions ou celle des opérateurs (ou les deux) ? C'est la surcharge faite dans la bibliothèque standard ou celle faite par l'utilisateur (ou les deux) ?

D'une manière générale, oui, on peut pourrir son code en abusant de la surcharge. Mais c'est à l'utilisateur de faire attention, tout comme c'est à lui de nommer correctement ses identifiants.


PS: j'essaierai de répondre aux autres messages plus tard.

78

Si j'ecris:
a + b
en C, je sais ce que ca veut dire; pas en C++.
(surcharge d'operateurs biensur)

79

c'est pas très malin de nommer pareil deux opérations qui font des choses fondamentalement différentes. ça aide pas à la compréhension du code
avatar
I'm on a boat motherfucker, don't you ever forget

80

De la même façon, a + b, on ne sait pas non plus ce que ça fait en Caml, vu que (+) a pu être redéfini. Et en C, strlen("test") peut être tout aussi non-intuitif, pour peu que strlen soit défini dans le fichier. Sans compter, en C, tout ce qu'on peut faire avec les macros. Ou en OCaml, avec Camlp4.

C'est ce que je disais : plus un langage est puissant, plus il offre de contrôle à l'utilisateur, qui peut alors choisir de se tirer une balle dans le pied. Quand on conçoit un langage, il vaut mieux partir du principe que l'utilisateur est intelligent et offrir de la puissance pour que le langage soit expressif, sinon on ne s'en sort pas. Un développeur bête pourra toujours faire des conneries.

81

nEUrOO (./78) :
Si j'ecris:
a + b en C

Tu le fais exprès? grin
avatar
Attention, nouvelle signature #eeek#
https://mastodon.ti-fr.com/@redangel

82

Pollux (./12) :
naPO (./1) :
La syntaxe est pourrie et on nous force à écrire les prédicats avant d'apprendre cette foutue syntaxe...
Puis après faut tout prouver...

Meme le CAML n'est pas aussi chiant.

Bref, le B, çaydlamerd.

Bah au moins c'est utilisable/utilisé pour faire des vrais programmes, contrairement à ocaml smile

Ca marche très bien, j'ai vu un shoot multi en Caml grin
avatar
https://air-gaming.com/tests/ si vous voulez de la bonne lecture :=)

83

Manoloben (./82) :
Bah au moins c'est utilisable/utilisé pour faire des vrais programmes, contrairement à ocaml smile.gif
Ca marche très bien,


C'est quoi le rapport entre le fait que ça marche bien et celui que ça soit utilisé tongue ?
avatar
fabetal_ > Hier, je me suis fait monter par un pote
redangel > et en chevals, ça donne quoi?
Nil> OMG I think I'm gay

84

BookeldOr (./83) :
Manoloben (./82) :
Bah au moins c'est utilisable/utilisé pour faire des vrais programmes, contrairement à ocaml smile.gif
Ca marche très bien,


C'est quoi le rapport entre le fait que ça marche bien et celui que ça soit utilisé tongue ?


y'a le mot utilisable dans la phrase, facile de ne pas lire...

Désolé mais Ocaml c'est utilisable pour faire des vrais programme, et ca marche très bien.
avatar
https://air-gaming.com/tests/ si vous voulez de la bonne lecture :=)

85

> Désolé mais Ocaml c'est utilisable pour faire des vrais programme, et ca marche très bien.
Oui.
Mais parmi toutes les grandes familles de langages de programmation (impératif / fonctionnel / logique / objet / etc.), certaines personnes ont plus de mal à apprendre certaines familles que d'autres, car ça ne leur semble vraiment pas intuitif / pratique / puissant / etc.
Personnellement, j'ai plutôt du mal avec les langages fonctionnels et logiques - même si je sais que le très court enseignement que j'ai reçu en L3 n'est pas suffisant pour se faire idée un peu complète des possibilités de chaque type de langage de programmation...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

86

?- comprendre(Lionel_Debroux,PROLOG).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

87

réponse : yes

88

Tu t'appelles Lionel_Debroux? grin
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

89

surtout qu'il n'a pas dit les valeurs des couples (Lionel_Debroux, PROLOG)

90

Manoloben (./84) :
Désolé mais Ocaml c'est utilisable pour faire des vrais programme, et ca marche très bien.

Oui. Mais je te mets au défi de convaincre une entreprise d'utiliser Caml. Le langage en lui-même est bon, mais il y a plein de cas où Caml n'est pas utilisable (en dehors du problème de recruter des développeurs Caml). Pour quelqu'un qui utilise déjà .NET, F# s'intègre parfaitement dans l'existant. Un développeur Caml n'a pas de mal à migrer vers F#, les langages sont compatibles à 90%. Un développeur C# ou Java n'aura pas non plus de difficulté, puisqu'on peut coder en F# comme on le fait en C#.

Pour revenir sur les active patterns, le problème de base, c'est que le pattern matching se marie très mal avec l'objet et les abstractions. On aimerait pouvoir utiliser le pattern matching, même sur un type défini en C#. Si on veut étendre un type somme (par exemple, on ajoute un champ location dans un AST), il faut modifier la majorité des matchs. Bref, un certain nombre de problèmes se posent, notamment quand on utilise des bibliothèques externes.

Le principe des active patterns, c'est de pouvoir définir les déconstructeurs de types. Il y a un certain nombre de façons pour les définir (pour que le compilateur puisse vérifier l'exhaustivité du match quand c'est possible). Il s'utilisent ensuite de façon transparente pour l'utilisateur. Cela permet de définir plusieurs façons de déconstruire un type. Par exemple, on peut décomposer un nombre complexe sous la forme a + bi, ou bien comme un module et un argument (et ce, quelle que soit la représentation interne du type). On peut aussi faire du pattern matching sur des regexp. Le papier que j'avais cité montre un exemple pour faire du pattern matching sur le type XML de .NET, comme si c'était un type somme.

Concernant les goulots d'étranglement, ça me semble un faux problème. Les active patterns permettent surtout d'éviter les clauses when, et donc de simplifier la syntaxe. Techniquement, on peut bien sûr faire des effets de bord ou d'énormes calculs dans un active patterns, mais c'est très fortement déconseillé. De même, il est autorisé de faire plein de choses dans un accesseur en POO, mais on évite en général. C'est un peu le même problème : dès qu'on a une fonctionnalité puissante, il est possible de se tirer une balle dans le pied.

Ca fait un moment que des personnes réfléchissent sur l'association pattern matching et abstraction (il y a même eu un papier il y a 10 ans pour ajouter du pattern matching dans un langage type Java), mais F# est le premier langage à implémenter une solution robuste et complète.

Vu que C# repompe souvent les concepts de F# (cf les nouveautés de C# 3), j'espère que le pattern matching viendra dans C# 4. smile