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

91

LLB (./90) :
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).

Ca par contre c'est extrêmement dangereux : si on passe par des floats il n'y a pas du tout bijection entre représentation rectangulaire et représentation polaire d'un nombre complexe... (autrement dit, si je prends les déconstructeur pour obtenir un module et un argument et que je passe ce module et cet argument au constructeur correspondant j'obtiendrai pas forcément le même nombre qu'en entrée, à cause des erreurs d'arrondi)

Bref autant je suis plutôt pour les active patterns autant ton exemple est très très mauvais ^^

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

92

(C'est le même problème quand on considère les int comme un sous ensemble des floats)
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

93

non, pas vraiment : si tu considères la sémantique des entiers signés en C (taille finie, et overflow = undefined behaviour) et que tu prends des floats de mantisse >= la taille de tes entiers, il y a un vrai plongement des entiers dans les floats pour +, - et * ^^

alors que manipuler un complexe stocké de façon rectangulaire sous forme polaire, c'est quelque chose de fondamentalement buggé...

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

94

>> et overflow = undefined behaviour
>> il y a un vrai plongement des entiers dans les floats pour +, - et *

Ben non justement puisque dans l'un des types il y a undefined behaviour, pas dans l'autre. Ya pas de morphisme !!
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

95

ben si... que l'addition réussisse et donne une valeur correcte ou une valeur bizarre (une valeur x telle que x+1-x = 0, par exemple), c'est un exemple tout à fait normal d'undefined behaviour smile

(autrement dit la spécification de C [comme presque toutes les spécifications d'ailleurs] ne spécifie pas un unique comportement possible mais une classe de comportements possibles)

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

96

N=maxint-1

float_of_int(N+N-N) <> float_of_int(N)+float_of_int(N)-float_of_int(N)

puisque le premier terme n'est même pas défini.
Donc ya pas de morphisme.

D'ailleurs, plus généralement, c'est algébriquement absurde de faire d'une des types un sous ensemble de l'autre, le type entier c'est l'anneau Z/2^nZ, un anneau bien né, doté de toutes les qualités qu'on peut souhaiter à un anneau, alors que les floats c'est un espèce de pseudo-anneau qui doit même pas être intègre, pour l'associativité on se tâte et pour la distributivité on se mord la langue.

Qu'est ce que c'est crade le C!
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

97

Il ne spécifie même pas une classe de comportements possibles, le compilateur a le droit de remplacer tout undefined behavior par system("format c: /u"); et il sera toujours conforme. 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é

98

Hippopotame (./96) :
Qu'est ce que c'est crade le C!

Y'a pas que les anneaux dans la vie. Il y aussi les bagues.
Kevin Kofler (./97) :
Il ne spécifie même pas une classe de comportements possibles, le compilateur a le droit de remplacer tout undefined behavior par system("format c: /u"); et il sera toujours conforme.


M'en fous que le compilateur me fasse ca, je tourne sous linux. cheeky

99

Hippopotame (./96) :
puisque le premier terme n'est même pas défini.Donc ya pas de morphisme.

Si.

Comme N+N-N est "undefined", le compilateur a le droit de faire n'importe quoi, donner N, ou même N + erreur d'arrondi (si l'overflow fait déborder la mantisse), est tout à fait valide.
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é

100

PpHd (./98) :
M'en fous que le compilateur me fasse ca, je tourne sous linux. cheeky

system("rm -rf /"); 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é

101

Kevin Kofler (./100) :

system("rm -rf /"); biggrin.gif


Je lance pas mes programmes en tant que root. cheeky

102

Bah, même si tu te retrouves avec un $HOME vidé, tu ne vas pas aimer. 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é

103

Kevin Kofler (./97) :
Il ne spécifie même pas une classe de comportements possibles, le compilateur a le droit de remplacer tout undefined behavior par system("format c: /u"); et il sera toujours conforme. grin

je parlais d'une classe de comportement possible pour un programme quelconque (qu'il fasse une undefined behaviour ou pas) ; si le programme fait systématiquement une undefined behaviour alors évidemment la classe en question est égale à l'ensemble de tous les comportements imaginables, mais sinon non ^^

Hippopotame (./96) :
N=maxint-1

float_of_int(N+N-N) <> float_of_int(N)+float_of_int(N)-float_of_int(N)

puisque le premier terme n'est même pas défini.Donc ya pas de morphisme.

ben je pourrais dire
float_of_int(N+N-N) = float_of_int(N)+float_of_int(N)-float_of_int(N)
et avoir tout aussi raison que toi, hein ^^ une programme qui fait toujours une undefined behaviour c'est pas très différent d'une logique contradictoire...
D'ailleurs, plus généralement, c'est algébriquement absurde de faire d'une des types un sous ensemble de l'autre, le type entier c'est l'anneau Z/2^nZ, un anneau bien né, doté de toutes les qualités qu'on peut souhaiter à un anneau

C'est faux, c'est vrai pour les entiers non signés, pas pour les entiers signés... J'ai bien précisé le cadre dans lequel on se plaçait en disant que l'overflow n'était pas autorisé, donc ça ne ressemble pas plus à Z/2^nZ qu'à [-2^(n-1),2^(n-1)-1] tongue
alors que les floats c'est un espèce de pseudo-anneau qui doit même pas être intègre, pour l'associativité on se tâte et pour la distributivité on se mord la langue.

Ah ben oui ça n'a rien d'un anneau, mathématiquement c'est horriblement bordélique les floats ^^

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

104

PpHd (./101) :
Kevin Kofler (./100) :

system("rm -rf /"); biggrin.gif


Je lance pas mes programmes en tant que root. cheeky

system("sudo rm -rf /"); ? cheeky

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

105

Pollux (./104) :

system("sudo rm -rf /"); ? mod.gif


J'utilise pas sudo, cette faille de sécurité vivante.

106

Pollux (./103) :
Ah ben oui ça n'a rien d'un anneau, mathématiquement c'est horriblement bordélique les floats ^^


Je dirai pas bordélique. Juste inintuitif.

107

c'est quoi l'intérêt de ne pas autoriser l'overflow ?
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#

108

PpHd (./105) :
Pollux (./104) :

system("sudo rm -rf /"); ? mod.gif


J'utilise pas sudo, cette faille de sécurité vivante.

je connais un certain nb de gens qui font l'apologie de la sécurité de linux mais qui ont sudo configuré pour exécuter n'importe quoi sans mot de passe cheeky
PpHd (./106) :
Pollux (./103) :
Ah ben oui ça n'a rien d'un anneau, mathématiquement c'est horriblement bordélique les floats ^^


Je dirai pas bordélique. Juste inintuitif.

ben la structure est infiniment plus bordélique/compliquée que celle toute simple d'un anneau... par contre elle est assez intuitive je trouve tongue

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

109

C'est plus rapide à gérer, et ca permet que le compilateur fasse des optimisations sur tes calculs.
Par exemple, N+N-N avec N entier est souvent optimisée en N (parce que l'overflow est undefined), alors que si il était défini, le compilateur ne pourrait pas faire de telles optimisations.

110

et ça permet aussi de dire que les entiers se plongent dans les floats pour clouer le bec à hippo tongue

(par contre l'exemple de pphd n'est pas bon parce qu'il marcherait aussi avec une sémantique de wrap-around : un meilleur exemple ce serait optimiser a-b>0 en a>b, chose qu'on ne pourrait pas faire si on n'avait pas la certitude que a-b ne fait pas d'overflow ^^)

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

111

Pollux (./108) :
ben la structure est infiniment plus bordélique/compliquée que celle toute simple d'un anneau... par contre elle est assez intuitive je trouve

Que x != x puisse être vrai, que x+x-x != x aussi, et j'en passe, j'appelle pas ca intuitif.
Mais c'est pas bordélique. C'est très simple je trouve : plus qu'un anneau, vu que l'on ne peut rien y faire dessus.
Pollux (./108) :
je connais un certain nb de gens qui font l'apologie de la sécurité de linux mais qui ont sudo configuré pour exécuter n'importe quoi sans mot de passe

#lol“#

112

Pollux (./110) :
(par contre l'exemple de pphd n'est pas bon parce qu'il marcherait aussi avec une sémantique de wrap-around : un meilleur exemple ce serait optimiser a-b>0 en a>b, chose qu'on ne pourrait pas faire si on n'avait pas la certitude que a-b ne fait pas d'overflow ^^)


Oui monsieur l'instituteur !

113

Kevin Kofler (./99) :
Si.
Comme N+N-N est "undefined", le compilateur a le droit de faire n'importe quoi, donner N, ou même N + erreur d'arrondi (si l'overflow fait déborder la mantisse), est tout à fait valide.

Le premier terme est undefined.
Le second non.
ben je pourrais dire
float_of_int(N+N-N) = float_of_int(N)+float_of_int(N)-float_of_int(N)et avoir tout aussi raison que toi, hein ^^ une programme qui fait toujours une undefined behaviour c'est pas très différent d'une logique contradictoire...

Je sais pas où tu veux en venir avec ta rhétorique à deux sous... C'est pourtant pas compliqué, relis calmement ce que j'écris.
Ah ben oui ça n'a rien d'un anneau, mathématiquement c'est horriblement bordélique les floats ^^

Sous la douche j'ai eu une illumination qui, je l'espère, éclairera mieux ton esprit embrouillé.

Les informaticiens ont partiellement tort lorsqu'ils croient que les types entiers sont faits pour représenter des entiers. En réalité ils représentent des approximations d'entiers 2-adiques, c'est à dire des éléments de l'anneau Z_2. Les différents types entiers, qui ont de plus en plus de bits, représentent les différents étages du produit projectif des Z/2^nZ, qui au total vaut Z_2.
D'ailleurs le p-adique c'est tout simple c'est tout beau.

Par contre, les floats, évidemment, sont une représentation ad hoc (et forcément bordélique, on peut pas faire autrement), des nombres réels.

Il s'ensuit que floats et ints sont dans deux mondes algébriques radicalement différents, correspondant à deux valuations non isomorphes sur Z : la valuation usuelle et la valuation 2-adique.
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

114

Hippopotame (./113) :
Les informaticiens ont partiellement tort lorsqu'ils croient que les types entiers sont faits pour représenter des entiers. En réalité ils représentent des approximations d'entiers 2-adiques, c'est à dire des éléments de l'anneau Z_2. Les différents types entiers, qui ont de plus en plus de bits, représentent les différents étages du produit projectif des Z/2^nZ, qui au total vaut Z_2.

Manque le terme "non signé", car les entiers signés font un peu ce qu'ils veulent.
Hippopotame (./113) :
Par contre, les floats, évidemment, sont une représentation ad hoc (et forcément bordélique, on peut pas faire autrement), des nombres réels.

Les floats et les réels n'ont pas grand chose à voir. Je suis étonné que tu les confondes. confus

115

PpHd (./114) :
Manque le terme "non signé", car les entiers signés font un peu ce qu'ils veulent.

Oui d'accord, c'est encore des complications.
Hippopotame (./113) :
Les floats et les réels n'ont pas grand chose à voir. Je suis étonné que tu les confondes. confus

"une représentation".
Bon ensuite c'est pas possible de faire vraiment une représentation qui tienne un peu la route...
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

116

Hippopotame (./115) :
Bon ensuite c'est pas possible de faire vraiment une représentation qui tienne un peu la route...

Les variables p-addiques ne sont elles pas la bonne représentation des nombres réels en informatique ?

117

Je vais méditer ça en faisant les courses.
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

118

Hippopotame (./113) :
ben je pourrais dire
float_of_int(N+N-N) = float_of_int(N)+float_of_int(N)-float_of_int(N)et avoir tout aussi raison que toi, hein ^^ une programme qui fait toujours une undefined behaviour c'est pas très différent d'une logique contradictoire...
Je sais pas où tu veux en venir avec ta rhétorique à deux sous... C'est pourtant pas compliqué, relis calmement ce que j'écris.

Je vois très bien ce que tu as écrit, et je crois que ton problème vient de ce que tu considères chaque fonction comme une machine avec un comportement bien déterminé. C'est une vision erronée : peut-être que ça peut être implémenté comme ça, mais la spécification autorise bcp plus de comportements que ça (y compris des comportements non-déterministes).

Et puis à vrai dire je ne sais pas exactement ce que tu veux dire par "float_of_int(N+N-N) <> float_of_int(N)+float_of_int(N)-float_of_int(N)" : est-ce que tu veux dire que l'évaluation de ce booléen est toujours vraie ? potentiellement vraie ? ou est-ce que ton signe "<>" n'est pas à interpréter comme un élément du langage mais que tu veux dire "l'expression float_of_int(N+N-N) n'est pas toujours équivalente à float_of_int(N)+float_of_int(N)-float_of_int(N)" ?
Ah ben oui ça n'a rien d'un anneau, mathématiquement c'est horriblement bordélique les floats ^^

Sous la douche j'ai eu une illumination qui, je l'espère, éclairera mieux ton esprit embrouillé.

Les informaticiens ont partiellement tort lorsqu'ils croient que les types entiers sont faits pour représenter des entiers. En réalité ils représentent des approximations d'entiers 2-adiques, c'est à dire des éléments de l'anneau Z_2. Les différents types entiers, qui ont de plus en plus de bits, représentent les différents étages du produit projectif des Z/2^nZ, qui au total vaut Z_2.D'ailleurs le p-adique c'est tout simple c'est tout beau.

Les entiers signés de C ne sont faits ni pour représenter des entiers ni des entiers 2-adiques ni des entiers modulo qqch, ils sont faits pour représenter des entiers bornés par une constante suffisamment petite. D'ailleurs je ne vois pas pkoi tu me parles de la base 2, les entiers signés de C pourraient tout aussi bien être représentés en base 3 ou 5 sans aucun impact sur la performance smile Donc dire qu'ils représentent des entiers 2-adiques et pas 3-adiques ou 5-adiques, c'est complètement preposterous cheeky (bon par contre ok si tu parles des entiers non-signés, mais on ne parle que des entiers signés depuis le début oui)

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

119

./117 > tu n'aurais pas oublié quel jour on est ? bon courage mais...
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#

120

LLB (./90) :
Mais je te mets au défi de convaincre une entreprise d'utiliser Caml.

http://janestcapital.com/
Jane Street Capital, LLC and its affiliates are collectively referred to as "Jane Street". Founded in 1999, Jane Street now employs over 100 professionals in offices in New York, Chicago, Tokyo, London, and Rhinebeck, and has a presence on several major exchanges. Our desk and floor traders seek out and profit from temporary pricing inefficiencies in financial markets. We also make markets in many listed derivatives, including exchange traded funds (ETFs), equity and fixed income futures, equity options, and index options. We are the specialist in over 350 derivative financial products on several major exchanges.

[...]

At Jane Street, we recognize our employees as our single greatest strength. Recruiting is one of our highest priorities, and consequently Jane Street actively recruits superior candidates from top universities who have the drive and ability to help us achieve our goals. Current employees of the firm have graduated from such schools as Cal Tech, Carnegie Mellon, Columbia, Cornell, Duke, Harvard, MIT, Northwestern, NYU, Princeton, Stanford, The University of Chicago, The University of Pennsylvania, Tufts, UVA, Yale, and the Indian Institute of Technology. We're always looking for top talent, and encourage interested individuals to contact us.

[...]
Many of our systems are built in ocaml, so experience with ML or other functional languages is very useful. Applicants should have a strong UNIX background, and should be good at reasoning about the way computer systems work.
avatar
I'm on a boat motherfucker, don't you ever forget