<?xml version="1.0" encoding="iso-8859-1" ?>
<rss version="0.92">
	<channel>
    <title>test</title>
    <link>http://test.blog2geek.com</link>
    <description>Blog specialise; geek et geek attitude.</description>
    <language>fr-FR</language><item>
        <title>Cours F# et migration du blog</title>
        <link>http://test.blog2geek.com/cours-f-et-migration-du-blog-853.html</link>
        <description>
Cours F#


Depuis quelques semaines, je rédige un cours d&amp;#39;introduction à F#. C&amp;#39;est disponible sur mon site : Cours et tutoriels F#


Voici les liens directs vers les chapitres :


	Introduction à F# et Hello world
	Types de base et expression 
	Déclarations et expressions conditionnelles
	
	Les fonctions : utilisation et définition
	Fonctions anonymes, application partielle et opérateurs
	Fonctions d&amp;#39;ordre supérieur et composition de fonctions
	
	Pattern matching
	Types énumérables et compréhensions de listes
	



Migration

J&amp;#39;ai commencé à migrer un certain nombre de billets de ce blog vers mon site. Les nouveaux articles seront désormais écrits sur mon site (je les dupliquerai peut-être aussi ici pour la transition). Voir mes articles (c&amp;#39;est la partie &quot;Divers&quot;). Il va falloir mettre à jour vos flux RSS.


L&amp;#39;intérêt pour moi est surtout d&amp;#39;avoir plus de contrôle sur mes billets, sur leur mise en page (il y a la coloration syntaxique du F# !), d&amp;#39;avoir un flux RSS (et même plus) pour moi tout seul. De plus, l&amp;#39;interface de blog2geek n&amp;#39;est pas très agréable. Et enfin, il n&amp;#39;y a pas de pub ! :)
</description>
		<pubDate>Sun, 25 Nov 2007 03:08:00 GMT</pubDate>
      </item><item>
        <title>[Musique] Une solution pour la musique adaptative - suite</title>
        <link>http://test.blog2geek.com/musique-une-solution-pour-la-musique-adaptative-suite-850.html</link>
        <description>
Partie 5 - Une solution - suite


Cette page n&amp;#39;est qu&amp;#39;un miroir. Pour la dernière version, veuillez lire Une solution pour la musique adaptative - suite sur mon site.

 

Le plus important, pour moi, est que le musicien connaisse précisément le scénario du jeu et l&amp;#39;étudie. Dans beaucoup de jeux amateurs, le musicien a juste une liste de musiques à faire, et elles sont souvent faites indépendamment du jeu (il a une vague description de ce qu&amp;#39;il doit faire). A contrario, dans les films, la musique à être faite en accord avec le reste. La musique est adaptée à l&amp;#39;image, et l&amp;#39;image s&amp;#39;adapte aussi à la musique (par exemple, faire durer la scène une seconde de plus pour que ça tombe bien).


Je pense qu&amp;#39;il est préférable que la musique soit réfléchie une fois que le scénario détaillé est prêt. Il convient ensuite de lister les musiques à faire et de créer un graphe sur papier. Sur le graphe, chaque n&amp;oelig;ud représente une musique, chaque arc indique qu&amp;#39;une transition sera nécessaire. Il peut être intéressant de pondérer les arcs avec l&amp;#39;importance de la transition (qui est liée avec la probabilité de son apparition). Cela permet de se concentrer en priorité sur les passages essentiels. Sur le graphe, il faut aussi noter si la transition doit être subtile (une simple évolution de la musique) ou si elle marque un changement (deux musiques différentes).


Lorsque l&amp;#39;on fait une simple évolution, il est préférable que les aspects de la musique soient composés en parallèle. Les deux musiques devraient avoir la même mesure et durer le même temps. Ainsi, lors d&amp;#39;une transition, on peut jouer la musique B à la position précise où s&amp;#39;est arrêtée A. Cela permet de garder la continuité de la musique, en particulier si la mélodie est la même.


Lorsque l&amp;#39;on fait un changement de musique, il est plus simple de commencer la musique B au début et marquer la transition (par exemple, avec une cymbale). Pour plus de variété, il peut être intéressant de noter plusieurs points de commencement possibles. Par exemple, au lieu de jouer B du début, on peut jouer B à partir d&amp;#39;une position t décidée à l&amp;#39;avance. Cela permet, si le joueur fait des allers-retours entre deux zones, de briser la monotonie et de ne pas toujours jouer les mêmes passages (le début de la musique).


De même, si les joueur est susceptible d&amp;#39;alterner entre deux zones, il est judicieux de prévoir plusieurs transitions possibles. Le moteur de son en choisit alors une au hasard. Cela casse une certaine linéarité et une prédictibilité. Cela génère bien entendu un surplus de travail. Il est donc important de bien concevoir le graphe, de noter les relations entre les musiques pour travailler en détail les parties qui méritent l&amp;#39;attention. De même, puisque le graphe peut potentiellement être complexe, je conseille d&amp;#39;implémenter une transition par défaut (de type fondu). Cette transition sera jouée quand aucune autre n&amp;#39;a été faite.


 


Conclusion


La solution présentée est donc un bon compromis entre la playlist classique et le format tracker. Elle permet d&amp;#39;avoir une très bonne qualité de son, un faible coût en CPU, et permet des transitions agréables. Cependant, il faut garder à l&amp;#39;esprit que cela demande beaucoup plus d&amp;#39;efforts pour le musicien. Chaque transition devra être travaillée individuellement. Cela pose aussi des restrictions sur les musiques, qui ne pourront pas être aussi complexes que le musicien pourrait le souhaiter. Il est donc important de réfléchir et de décider à quels endroits une transition fluide est nécessaire, et à quels endroits une discontinuité dans la musique peut convenir.


 


P.S. : n&amp;#39;hésitez pas à dire en commentaires si ces billets vous ont été utiles, ou si vous avez des choses à ajouter. Ça me permettra de compléter si nécessaire. 
</description>
		<pubDate>Sat, 27 Oct 2007 13:49:00 GMT</pubDate>
      </item><item>
        <title>[Musique] Musique adaptative : une solution efficace</title>
        <link>http://test.blog2geek.com/musique-musique-adaptative-une-solution-efficace-849.html</link>
        <description>
Partie 4 - Musique adaptative : une solution efficace


Cette page n&amp;#39;est qu&amp;#39;un miroir. Pour la dernière version, veuillez lire Une solution efficace pour la musique adaptative et les autres billets sur mon site.


 


Un compromis...


Comme nous l&amp;#39;avons vu, la solution naïve (une simple playlist, avec fondus) offre très peu de flexibilité, mais permet une très bonne qualité sonore. L&amp;#39;approche des modules garantit une grande souplesse, mais a un certain nombre de problèmes. Comme souvent, il faut trouver le juste milieu et trouver un compromis.


À mi-chemin entre la musique en mp3/ogg en un seul bloc, et la musique découpée note par note, on peut imaginer une musique divisée de façon plus subtile. On peut séparer la musique de manière plus logique : d&amp;#39;un côté, les percussions, de l&amp;#39;autre l&amp;#39;accompagnement et les mélodies. Ce découpage n&amp;#39;est pas le seul possible, ça dépend du contexte et de ce que l&amp;#39;on veut faire. Mais partons de là. Le concept est d&amp;#39;avoir plusieurs fichiers ogg que l&amp;#39;on lit simultanément pour retrouver le morceau d&amp;#39;origine. Techniquement, il n&amp;#39;y a aucune perte. La qualité du son et celle de la composition sont potentiellement excellentes. Regardons maintenant ce que l&amp;#39;on peut faire au niveau des deux aspects de la musique adaptative : l&amp;#39;évolution d&amp;#39;une musique et la transition entre deux musiques.


Pour faire évoluer une musique, plusieurs possibilités s&amp;#39;offrent à nous. Pour faire évoluer le rythme, c&amp;#39;est simple : il suffit d&amp;#39;avoir deux fichiers ogg, chacun correspond à un rythme différent. La musique utilise le premier rythme, et passe au suivant quand la transition est requise. Il y a quand même une chose à respecter : il est préférable que la mesure ait la même durée dans les deux fichiers. Par ailleurs, il est nécessaire que la transition se fasse entre deux mesures. Il faut donc insérer un délai de quelques secondes pour que la transition soit propre.


Pour l&amp;#39;accompagnement, on peut utiliser la même technique : deux musiques, synchronisées, utilisant les mêmes accords, mais ayant des ambiances différentes. Par exemple, la même mélodie jouée par deux instruments différents. Ou encore, le deuxième accompagnement peut avoir juste quelques instruments de plus. La transition entre les deux fichiers est assez simple : soit un remplacement brutal, de la même façon que pour les percussions ; soit un fondu (cross-fade) entre les deux fichiers. Le choix entre ces deux transitions dépendra des fichiers.


Cela suffit pour faire évoluer une musique, mais les transitions restent pauvres et n&amp;#39;atteignent pas ce que ferait un vrai compositeur. Pour obtenir un résultat beaucoup plus crédible, il faut ajouter une possibilité : celle de jouer un sample, temporairement, pour la transition. Imaginons la transition suivante :


	Jouer immédiatement un sample (de durée t). Par exemple, un son de percussions qui s&amp;#39;accélèrent progressivement.
	Jouer, au temps t, un sample. Par exemple, une cymbale.
	Arrêter l&amp;#39;accompagnement actuel, au temps t.
	Jouer un autre accompagnement, au temps t.


 


Cela donne un résultat beaucoup plus crédible. Il faut bien sûr faire en sorte que le temps t coïncide parfaitement avec la mesure. La transition entre deux musiques très différentes suit la même logique : il faut définir une suite d&amp;#39;effets à exécuter.


 


Lire la suite de billet : une solution efficace - suite
</description>
		<pubDate>Sat, 27 Oct 2007 01:41:00 GMT</pubDate>
      </item><item>
        <title>[Musique] Tracker et musique adaptative</title>
        <link>http://test.blog2geek.com/musique-tracker-et-musique-adaptative-848.html</link>
        <description>
Partie 3 - Tracker et musique adaptative



Cette page n&amp;#39;est qu&amp;#39;un miroir. Pour la dernière version, veuillez lire Tracker et musique adaptative et les autres billets sur mon site.


 


L&amp;#39;utilisation du format tracker pour transformer de la musique


Le but est de générer (une partie) de la musique en temps-réel, à l&amp;#39;exécution du jeu. Calculer la musique en temps réel n&amp;#39;a finalement rien de nouveau : c&amp;#39;est ce que font les logiciels de MAO, et en particulier les trackers. Une idée est donc de stocker, non pas un fichier mp3/ogg, mais plutôt la partition et l&amp;#39;ensemble des instruments. Le logiciel a donc beaucoup d&amp;#39;information pendant l&amp;#39;exécution et peut plus facilement effectuer des modifications sur le son.


Pour que les choses soient claires : il n&amp;#39;est pas question ici de créer de la musique à partir de rien, mais plutôt d&amp;#39;adapter la musique à la situation. On ne souhaite fabriquer des mélodies, mais moduler l&amp;#39;ambiance de la musique. Musicalement, une mélodie créée par informatique est très pauvre, sa qualité est très loin de ce que ferait un musicien professionnel. Nous voulons une musique riche et complexe, mais qui s&amp;#39;adapte pendant le jeu. Concrètement, il y a deux points importants : il faut être capable d&amp;#39;une part de modifier subtilement l&amp;#39;ambiance dégagée par la musique, et d&amp;#39;autre part de fournir des transitions fluides entre les différentes musiques.


Si la musique est stockée sous forme de module (.it, .xm...), un certain nombre d&amp;#39;opérations sont faciles à implémenter. On peut activer ou désactiver des channels à tout moment. Par exemple, si un personnage parle, il peut-être judicieux de couper momentanément les percussions (pour mieux entendre la voix). Il est facile aussi d&amp;#39;effectuer des modifications sur le volume des instruments : si dans la scène un personnage joue du piano, le volume de piano pourrait varier en fonction de notre position ; il est possible aussi de jouer sur le panning, mais de façon très douce (sinon, ça peut devenir très désagréable quand c&amp;#39;est une musique de façon). Mieux encore : il est possible de changer d&amp;#39;instrument à tout moment. Par exemple, une flute paisible pourra se transformer en trompette menaçante à l&amp;#39;approche d&amp;#39;un ennemi. Ou encore, il est possible d&amp;#39;effectuer des transformations sur les notes elles-mêmes. Un changement de gamme de la mélodie principale, ou le changement d&amp;#39;octave peuvent avoir des effets intéressants sur l&amp;#39;atmosphère créée. Enfin, il est possible d&amp;#39;influer directement sur le tempo : accélération et ralentissement de la musique sont assez enfantins à faire.


L&amp;#39;autre aspect concerne les transitions entre les musiques. Comment passer d&amp;#39;une musique à une autre, de manière fluide ? Le fondu naïf étant bien sûr à éviter. Dans un module, il est possible de définir des patterns supplémentaires, qui ne font pas vraiment partie de la musique. On peut donc les utiliser pour les transitions. Pour passer d&amp;#39;une musique A à une musique B, on peut jouer un pattern (composé à l&amp;#39;avance) entre les deux.

Limitations


La principale limitation concerne la qualité du son. Pour obtenir une bonne qualité sonore avec un tracker, il est souvent nécessaire d&amp;#39;utiliser des générateurs (de type VST). Cela se révèle très couteux en terme de CPU, sans compter les problèmes de licences pour les VST non libres. On peut convertir certains sons obtenus par ces VST en wave (ou les compresser), mais ça reste toujours limité. On perd en qualité de son et il faut limiter les effets sur la musique. Bref, on retrouve la qualité des musiques de la fin des années 90. C&amp;#39;est assez loin de ce qu&amp;#39;un bon compositeur peut faire. De plus, il n&amp;#39;est possible de retoucher la musique en studio, d&amp;#39;effectuer les réglages et le mixage nécessaires à une musique de bonne qualité.


Si cette solution pouvait se révéler très efficace pendant les 90, périodes où les trackers régnaient en maitres, elle relativement mal adaptée à la musique contemporaine. Dans 10 peut-être, on pourra générer de la musique de haute qualité, à partir de sa partition, en temps réel pendant les jeux. À l&amp;#39;heure actuelle, quand un compositeur crée une musique sur ordinateur, tout le CPU est utilisé.


 


Dans le prochain billet, je décrirais une technique permettant d&amp;#39;adapter interactivement de la musique de très bonne qualité, en temps réel et à faible coût en CPU.


 


Lire la suite :  Musique adaptative : une solution efficace
</description>
		<pubDate>Fri, 26 Oct 2007 22:20:00 GMT</pubDate>
      </item><item>
        <title>[Musique] Jeux vidéo et musique adaptative</title>
        <link>http://test.blog2geek.com/musique-jeux-video-et-musique-adaptative-847.html</link>
        <description>
Partie 2 : Jeux vidéo et musique adaptative


Cette page n&amp;#39;est qu&amp;#39;un miroir. Pour la dernière version, veuillez lire Jeux vidéo et musique adaptative et les autres billets sur mon site.


 


La problématique


La musique dans les jeux vidéo a considérablement évolué ces 15 dernières années. L&amp;#39;augmentation des espaces de stockage et l&amp;#39;utilisation généralisée de format type mp3/ogg a permis d&amp;#39;utiliser dans les jeux des musiques de très bonne qualité, comparables à ce que l&amp;#39;on trouve au cinéma.


Pourtant, il existe une différence de taille : au cinéma, tout est prévu à l&amp;#39;avance et la musique peut être précalculée, pour correspondre précisément à l&amp;#39;image. Dans un jeu vidéo, le joueur a un certain contrôle sur l&amp;#39;histoire ; il n&amp;#39;est donc pas possible, dans le cas général, de prévoir ses actions. On ne sait pas non plus quelle sera la vitesse de sa progression. 


Le problème est donc : comment faire évoluer interactivement la musique d&amp;#39;un jeu, en fonction des actions du joueur ? Une solution simple est de créer une playlist de musiques, chacune associée à une scène, et d&amp;#39;effectuer des fondus quand il le faut. D&amp;#39;un point de vue musical, le fondu est une transition bien trop pauvre et coupe l&amp;#39;enchainement. Comment faire quelque chose de satisfaisant, à la fois sur le plan de la qualité du son et au niveau de l&amp;#39;enchainement sonore ?


Comme souvent en informatique, il est nécessaire de trouver un compromis. Il faut limiter la taille des musiques sur le disque dur, il faut aussi limiter l&amp;#39;utilisation du CPU et ne pas faire trop de calculs... Il faut également que ce ne soit pas trop complexe à réaliser, tant au niveau programmation, qu&amp;#39;au niveau composition de la musique. Enfin, en plus de toutes ces contraintes, on veut une bonne qualité de son et une flexibilité de la musique. Évidemment, il n&amp;#39;y a pas de solution miracle. De plus, la « meilleure » solution va dépendre des priorités et du type de jeu choisi.


Dans le prochain billet, je détaillerai une solution extrêmement puissante et flexible. Cela se fera au détriment soit d&amp;#39;une qualité de son moyenne, soit d&amp;#39;un surcoût au niveau CPU ou mémoire sur le disque. De plus, elle posera certaines contraintes sur la conception de la musique.


 


Lire la suite : Tracker et musique adaptative 
</description>
		<pubDate>Fri, 26 Oct 2007 18:01:00 GMT</pubDate>
      </item><item>
        <title>[Musique] Le tracker</title>
        <link>http://test.blog2geek.com/musique-le-tracker-846.html</link>
        <description>Cette page n&amp;#39;est qu&amp;#39;un miroir. Pour la dernière version, veuillez lire Le tracker et les autres billets sur mon site.

 


Je vais écrire quelques billets sur le thème « musique et informatique ». J&amp;#39;ai plusieurs choses à dire (et à demander) sur la musique dans les jeux vidéo (comment la rendre interactive, etc.). Ce premier billet va donc me servir d&amp;#39;introduction et d&amp;#39;historique.


 


Un peu d&amp;#39;histoire...


C&amp;#39;est avec l&amp;#39;Amiga que la musique assistée par ordinateur a pris son essor, en même temps que le reste de la demo scene. Le principe de base est très simple : le logiciel (appelé « tracker ») est composé de 4 pistes (ou canaux, ou channels). Sur chaque piste, des sons (samples) peuvent être joués. En faisant varier la fréquence de ces sons, on obtient différentes notes. Au départ, les sons étaient très simples : formes sinusoïdales, carrés, triangulaires... Les samples étaient stockés dans le même fichier que la partition, cela permettait d&amp;#39;avoir le même rendu sur toutes les machines (par opposition au format midi). Ces musiques, au format .mod (puis .s3m, .it, .xm...) pouvaient durer plusieurs minutes et tenir sur quelques kilo octets.


Les années 90 ont été marquées par la demo scene. La grande majorité des jeux de l&amp;#39;époque utilisaient aussi ce format. Progressivement, les trackers supportent 8 (Octamed), 16, puis en 1994, 32 channels avec FastTracker 2, qui devient un immense succès. Les contraintes de place diminuant, les sons (au format wave, en 8bit) deviennent plus riches et simulent de vrais instruments. FT2 possède aussi une cinquantaine d&amp;#39;effets sur le sons (vibrato, volume, panning, portamento...) ainsi qu&amp;#39;un contrôle des sons avec des enveloppes.


Les années 2000 permettent l&amp;#39;utilisation généralisée de sons en 16 bits (ou plus). Les contraintes sur la place ou le nombre de canaux ont quasiment disparu. La qualité du son rivalise maintenant avec la musique professionnelle. De plus, les sons wave sont progressivement remplacés par des générateurs : ce sont les VST (des bibliothèques dynamiques au format dll, qui génèrent ou transforment les sons). Les bibliothèques de sons sont devenues courantes : il est possible de simuler un véritable orchestre, à condition de payer le logiciel plusieurs centaines d&amp;#39;euros.


Du fait de l&amp;#39;utilisation de bibliothèques extérieures, de retouches sonores sur la musique finale, des instruments de plus en plus gros, le format tracker a presque disparu : il est beaucoup plus simple de distribuer un fichier encodé en mp3 ou ogg. Ça prend souvent moins de place et on a la garantie qu&amp;#39;il sera joué partout de la même façon.


Cependant, même si des logiciels comme Cubase sont courants dans le monde professionnel, certains gagnent leur vie en composant la musique avec un tracker. Citons entre autres Modplug Tracker (un logiciel libre), MadTracker et Renoise.


 


Pour ceux que ça intéresse, je recommande vivement la lecture de l&amp;#39;interview d&amp;#39;Audiomonster (attention, c&amp;#39;est un peu long). Il vient de la demo scene, a été recruté par hasard chez Delphine Software, a composé la musique de Flashback. Aujourd&amp;#39;hui, il utilise toujours, et de manière professionnelle, Modplug Tracker.  Pour les amateurs, je recommande aussi la web radio Nectarine, qui diffuse en permanence de la musique de la demoscene.


Lire la suite : Jeux vidéo et musique adaptative


 
</description>
		<pubDate>Wed, 24 Oct 2007 01:33:00 GMT</pubDate>
      </item><item>
        <title>F# enfin reconnu</title>
        <link>http://test.blog2geek.com/f-enfin-reconnu-845.html</link>
        <description>
F# va bientôt devenir un langage officiel de la plateforme .NET. Il bénéficiera donc d&amp;#39;une intégration totale dans Visual Studio et VS sera distribué avec. 



I
am a big fan of technology transfer between a research organization and
a product development organization so that we can &amp;ldquo;productize&amp;rdquo; the
great research ideas and deliver to customers in a timely manner.  This is one of the best things that has happened at Microsoft ever since we created Microsoft Research over 15 years ago.  Here is another great example of technology transfer at work.  We
will be partnering with Don Syme and others in Microsoft Research to
fully integrate the F# language into Visual Studio and continue
innovating and evolving F#. In my mind, F# is another first-class programming language on the CLR. &amp;mdash; S. Somasegar 


Par ailleurs l&amp;#39;équipe de F# grossit, passant des deux concepteurs à quatre membres à plein temps. Ils travaillent actuellement sur la finition de la V1.


De plus, Microsoft utilise de plus en plus F# dans ses produits, j&amp;#39;ai vu plusieurs offres d&amp;#39;emploi liées à F# ces derniers jours. La programmation fonctionnelle va prendre son essor chez Microsoft. :)
</description>
		<pubDate>Wed, 17 Oct 2007 23:17:00 GMT</pubDate>
      </item><item>
        <title>Parlons français</title>
        <link>http://test.blog2geek.com/parlons-francais-844.html</link>
        <description>
Parlons français.


 


J&amp;#39;ai souvent rencontré des gens qui critiquait les traductions françaises des termes informatiques. Des gens qui, par moquerie ou hypercorrection, utilisent les termes mél, butineur ou hypertoile dans leurs phrases. Des sites qui se plaisent à propager, parfois de manière erronée, les décisions de la commission de néologie. Ou encore des questionnaires incorrects relatifs à ce vocabulaire, comme celui du 20 minutes : « Parlez-vous français ».


Voici donc une liste de rumeurs avec les explications et les sources :


 


On ne dit pas WIFI, mais ASFI


C&amp;#39;est une rumeur qui a été très vite répandue sur Internet, et reprise par de nombreux sites. Pourtant, c&amp;#39;est faux. ASFI signifie Accès Sans Fil à Internet. C&amp;#39;est donc la traduction de WIA (Wireless Internet Access), et non de WIFI.



http://www.culture.gouv.fr/culture/dglf/cogeter/05-05-05-telecommunications.htm


 


Browser se traduit par butineur


C&amp;#39;est faux. En français, on dit navigateur (ou logiciel de navigation). Le terme butineur vient du Canada.



http://www.culture.gouv.fr/culture/dglf/cogeter/16-03-99-internet-listes.html



 


En français, il faut écrire mél


Non, ce n&amp;#39;est pas tout à fait ça. Mél est une abréviation, qui s&amp;#39;utilise de la même façon que &quot;tél&quot; (et ne peut donc pas être utilisé comme un nom). À la place, on utilise plutôt courriel, courrier électronique ou message électronique. Ce qui me semble bien, personnellement. Le terme courriel n&amp;#39;est pas uniquement québécois, il a été reconnu par journal officiel.



http://www.culture.gouv.fr/culture/dglf/cogeter/20-06-03-courriel.htm


 


En français, on dit barrière de sécurité et non pare-feu


C&amp;#39;est ce qu&amp;#39;affirme le questionnaire du 20 minutes cité au début. Pourtant, le terme pare-feu est régulièrement utilisé (notamment sous Windows). Cependant, après une rapide recherche, on se rend compte que les deux termes sont acceptés. Encore une erreur propagée...



http://www.culture.gouv.fr/culture/dglf/cogeter/16-03-99-internet-termfrancs.html


 


On ne dit pas implémenter, mais implanter


C&amp;#39;est faux, implanter n&amp;#39;a pas vraiment le même sens, à ce que je sache. Le terme implémenter a été reconnu dans le journal officiel.



http://www.culture.gouv.fr/culture/dglf/cogeter/20-04-07-informatique.htm


 


On ne dit pas web, mais hypertoile


Non. Le terme complet est &quot;toile d&amp;#39;araignée mondiale&quot;, mais on dira plus simplement toile.



http://www.culture.gouv.fr/culture/dglf/cogeter/16-03-99-internet-listes.html


 


Au pluriel, on dit fora, virii, scenarii...


L&amp;#39;académie française a été claire lors de la réforme de 1990 : « les noms ou adjectifs d&amp;rsquo;origine étrangère ont un singulier et un pluriel réguliers : un zakouski, des zakouskis ; un ravioli, des raviolis ; un graffiti, des graffitis ; un lazzi, des lazzis ; un confetti, des confettis ; un scénario, des scénarios ; un jazzman, des jazzmans, etc. On choisit comme forme du singulier la forme la plus fréquente, même s&amp;rsquo;il s&amp;rsquo;agit d&amp;rsquo;un pluriel dans l&amp;rsquo;autre langue. »


Cette réforme n&amp;#39;est bien sûr qu&amp;#39;une recommandation, mais pourquoi chercher à tout compliquer ? Cette règle est fort simple à suivre.



http://www.academie-francaise.fr/langue/orthographe/regles.html#regles


 


C&amp;#39;est moche de piquer tous les mots étrangers couramment utilisés, pour se les approprier et dire qu&amp;#39;on en fait un mot français...


Pas tous. Le vocabulaire trop technique ou peu utilisé n&amp;#39;a souvent pas d&amp;#39;équivalent. La plupart des mots sont francisés et ça me semble normal : c&amp;#39;est ce qui a toujours été fait. Pouvoir utiliser des mots français est quand même agréable (ordinateur, navigateur, fenêtre, télécharger, internaute, site...). Utiliser les termes anglais tend à rendre l&amp;#39;informatique plus obscure pour les néophytes. Il y a quelques traductions qui ne sont pas élégantes, mais c&amp;#39;est l&amp;#39;usage qui décidera. Par exemple, le mot camping fait partie des dictionnaires, alors que c&amp;#39;est campement qui avait été proposé à l&amp;#39;origine (c&amp;#39;est l&amp;#39;usage donc qui a décidé).


Bref, je trouve ça plutôt bien dans l&amp;#39;ensemble. Beaucoup de traductions sont pertinentes, les autres seront probablement mises de côté.

</description>
		<pubDate>Tue, 09 Oct 2007 22:34:00 GMT</pubDate>
      </item><item>
        <title>[Autopromotion] Ascii art</title>
        <link>http://test.blog2geek.com/autopromotion-ascii-art-843.html</link>
        <description>
Pour ceux qui aiment l&amp;#39;ascii-art... 


Ou l&amp;#39;humour absurde...


Ou qui s&amp;#39;ennuient au boulot...


 


Da ascii blog


 


 
</description>
		<pubDate>Sun, 07 Oct 2007 13:19:00 GMT</pubDate>
      </item><item>
        <title>Exalead et Baagz</title>
        <link>http://test.blog2geek.com/exalead-et-baagz-840.html</link>
        <description>
Exalead et Baagz


 


Exalead


Vous connaissez sans doute, au moins de nom, Exalead, ce moteur de
recherche français. Il innove par rapport à ses concurrents et
proposent des fonctionnalités très intéressantes. Il propose par
exemple une recherche selon une expression rationnelle, un affinage
des résultats à posteriori (tout en affichant des statistiques sur les
résultats obtenus). De plus, il est possible de faire une recherche
phonétique ou une recherche par proximité de mots... Utile quand on
hésite sur une orthographe (ou pour trouver même les sites qui ont
fait une faute :)).


Sa recherche d&amp;#39;images me semble bien plus agréable que celle de Google
et peut être filtrée selon plus de paramètres (tailles, nombre de
couleurs, restreindre le résultat aux visages, etc.). Les filtres
peuvent être très précis. Par exemple, il est facile de chercher une
image dont la taille fait entre 400px et 600px (width&gt;400 width&lt;600), ou encore en fonction du nombre d&amp;#39;octets du fichier.


L&amp;#39;autre fonctionnalité que j&amp;#39;utilise beaucoup est la recherche de
vidéos. Les vidéos sont recherchées parmi les sites les plus connus
(Dailymotion, Youtube, Google Video...). Là encore, des options très
intéressantes sont disponibles. On peut chercher une vidéo dont la
durée est comprise entre 5 et 8 minutes ou encore voir seulement
celles qui ont été vues plus de 4200 fois.


Le principal problème d&amp;#39;Exalead reste la pertinence de ses résultats
(avant affinage) et la fréquence de ses mises à jour. On est encore
loin de Google pour les recherches classiques. Cependant, il se révèle
être un bon complément de Google pour les besoins plus
spécifiques. D&amp;#39;autres personnes seront plus sensible aux arguments
éthiques ou politiques : préférez-vous donner l&amp;#39;argent à une PME
française ou bien à une multinationale américaine ?


 


Baagz, un projet prometteur...


Exalead vient tout juste d&amp;#39;annoncer son dernier produit, Baagz. Baagz
est présenté comme étant leur « tout nouveau service de recherche,
combinant moteur de recherche sémantique et réseau social ». Comme
souvent avec le marketing, il vaut mieux se méfier des mots, en
particulier de la notion de « sémantique ». Baagz est en version bêta
et l&amp;#39;inscription nécessite une invitation (mais on peut faire une
demande sur le site).


Baagz est un réseau social, basé sur la notion de « centres d&amp;#39;intérêts
partagés » : chaque utilisateur peut définir ses amis et ses centres
d&amp;#39;intérêts. Dans un baag, on peut mettre des liens, des images, des
vidéos, etc. On peut ensuite visiter les baagz publics des autres
gens. L&amp;#39;interface du site est soignée et repose entièrement sur de
l&amp;#39;Ajax. C&amp;#39;est plutôt bien fait, on a du drag-and-drop, de la
transparence, des jolies fenêtres. Bref, tout ce qui est
caractéristique du web dit 2.0. D&amp;#39;autant plus que, contrairement à
beaucoup d&amp;#39;autres sites, le bouton retour du navigateur reste
opérationnel.


Le grand intérêt de Baagz, c&amp;#39;est qu&amp;#39;il s&amp;#39;interface avec le moteur de
recherche d&amp;#39;Exalead. Si on fait une recherche classique (web, images,
vidéos...), on peut faire un drag-and-drop des résultats vers ses
propres baagz. Ils ont donc aussi un rôle de bookmarks. Pour un
utilisateur régulier d&amp;#39;Exalead, Baagz se révèle donc être
incontournable : l&amp;#39;interface est beaucoup plus riche et
personnalisable. On peut également faire une recherche parmi les
autres baagz.


Évidemment, Baagz propose également de gérer les flux RSS. Il se place
donc en concurrent des pages personnalisables, de type Netvibes,
iGoogle, etc. D&amp;#39;autres widgets sont disponibles, comme un mémo, la
météo, les mails ou un chat.


 


... mais encore un peu trop jeune


On est prévenu dès le départ, ce n&amp;#39;est qu&amp;#39;une version Bêta. Et la bêta
ici, ce n&amp;#39;est pas la qualité des bêtas de Google. Le site ne fonctionne
que sous Firefox 2 pour le moment (c&amp;#39;est temporaire, bien sûr). Il y a
beaucoup de problèmes de traduction, si bien que l&amp;#39;on a un affreux mélange de
français et d&amp;#39;anglais sur le site. Le moteur de recherche accepte
moins d&amp;#39;options que sur Exalead.fr : regexp ou caractères spéciaux (du
genre &quot;C#&quot;) sont refusés. Le menu « recherche avancée » d&amp;#39;Exalead.fr est
absent ici. Dans la page de recherche, le bouton droit est désactivé, ce
qui peut être gênant (pour ouvrir dans un nouvel onglet, copier l&amp;#39;adresse du site ou les autres options, selon les plugins installés). Le widget pour le chat se révèle peu utile : il faut que les deux personnes aillent dans le même baag, au même moment. De plus, il n&amp;#39;y a pas de notification (sonore ou dans la barre de titres) en cas de message (comme on peut avoir sur GMail).


J&amp;#39;aimerais bien aussi pouvoir accéder à un baag directement, mais
est-il possible d&amp;#39;avoir une telle URL ? Le titre de la page n&amp;#39;est
jamais modifié, c&amp;#39;est dommage quand on revient en arrière avec le
navigateur. Le site n&amp;#39;est pas prévu pour de la navigation
multi-onglet. Même si c&amp;#39;est un problème récurrent aux sites de type
web 2.0, je trouve ça dommage. D&amp;#39;autant plus que ça devrait être
faisable en bidouillant un peu le javascript. L&amp;#39;interface gagnerait
aussi à être allégée : j&amp;#39;apprécierais de pouvoir réduire la taille des
images des baagz (voire n&amp;#39;afficher que leur titre), dans la liste de
gauche, de façon à tous les voir sans scroller.


 


Conclusion


Baagz est un projet prometteur et intéressant. Je le conseille à tous
les utilisateurs d&amp;#39;Exalead. Pour les autres, ça peut être une occasion
de (re)découvrir Exalead. Quand je vois toutes les fonctionnalités
ajoutées à Exalead en un an, j&amp;#39;ai bon espoir pour Baagz. Il est encore
loin d&amp;#39;être parfait, mais je pense que les corrections seront faites
rapidement. Si Exalead ajoute rapidement de nouvelles fonctionnalités,
le produit pourrait devenir très bon. J&amp;#39;aimerais par exemple avoir une
bonne navigation au clavier, avoir une solution pour ranger proprement
les liens (là, on a des icônes en vrac, j&amp;#39;aimerais pouvoir les
afficher en liste, un peu comme l&amp;#39;explorateur de Windows) ou encore
avoir une bonne gestion des flux (lire le contenu du flux sans aller
sur le site).


Si Exalead arrivait à avoir une pertinence similaire à Google dans ses
résultats de recherche, nul doute que Baagz pourrait devenir
incontournable. Un projet à suivre, donc. Ça permet en plus d&amp;#39;avoir
une alternative au monopole de Google.
</description>
		<pubDate>Sat, 29 Sep 2007 00:58:00 GMT</pubDate>
      </item><item>
        <title>[F# et Shell] Un peu de réseau</title>
        <link>http://test.blog2geek.com/f-et-shell-un-peu-de-reseau-836.html</link>
        <description>
F#


Je viens d&amp;#39;écrire un petit programme en F#, je le poste ici puisqu&amp;#39;il
pourra me resservir plus tard, et il peut être utile à d&amp;#39;autres
personnes.


Le code est assez court, il s&amp;#39;agit d&amp;#39;un serveur (en TCP). Lorsqu&amp;#39;un
client se connecte, il communique avec : le client envoie un nombre,
le serveur renvoie ce nombre, mis au carré. C&amp;#39;est donc très simple,
mais ça me fait une base pour une application réseau. Le programme
permet d&amp;#39;accepter plusieurs clients ; j&amp;#39;utilise un thread par client.


Le code total tient en 25 lignes, ce qui me semble plutôt
raisonnable. Le code se trouve à cette adresse : http://laurent.le-brun.eu/fsharp-server.fs


Cet exemple sert aussi à montrer que F# est utilisable dans la vraie vie et qu&amp;#39;il n&amp;#39;y a plus de raison de persister avec C#, Java, C++... (sauf cas particuliers)


 


Shell


Et puisque les gens sous-estiment très souvent la puissance du Shell
(et des binaires souvent associés), voici un équivalent en Shell :


$ nc -lp 3000 -c &amp;#39;sed -u &quot;s/.*/&amp;*&amp;/&quot; | bc&amp;#39;


Netcat (ou nc) est un client / serveur utilisable en console. Par
défaut, il est en mode TCP. Le 3000 correspond au port à utiliser et
l&amp;#39;option -c indique la commande à exécutée quand un client se
connecte. L&amp;#39;entrée standard correspond alors au message envoyé par le
client et la sortie standard est le texte renvoyé. Le Sed sert juste à
dupliquer l&amp;#39;entrée et insère un &amp;#39;*&amp;#39;. Cela permet donc de calculer le
carré, grâce à bc. L&amp;#39;option -u de Sed est très importante ici : cela
permet de ne pas bufferiser la sortie.


Ce code n&amp;#39;est pas un équivalent fidèle du programme F# : il manque la
gestion d&amp;#39;erreur (si l&amp;#39;entrée n&amp;#39;est pas un nombre, le résultat est
incertain et dépend de bc), la gestion de plusieurs clients simultanés
et il faudrait que le serveur reste actif quand le client se
déconnecte (dans la version ci-dessus, le serveur se termine).


Voici une solution plus fidèle. Code à mettre dans le fichier
server.sh (avec les droits d&amp;#39;exécution) :


#! /bin/bash
nc -lp 3000 -e server.sh &amp;
sed -u &quot;s/.*[^0-9].*/*/;s/.*/&amp;*&amp;/&quot; | bc


Exemple d&amp;#39;appel, via le shell :


$ nc -lp 3000 -e server.sh


À chaque fois qu&amp;#39;un client se connecte, un nouveau serveur (un nouveau
processus donc) est lancé qui sera à l&amp;#39;écoute des nouveaux clients. On
a donc une récursion mutuelle entre nc et server.sh. Le code Sed a été
légèrement modifié de sorte que bc renvoie une erreur dès que l&amp;#39;entrée
n&amp;#39;est pas un nombre.
</description>
		<pubDate>Fri, 14 Sep 2007 14:37:00 GMT</pubDate>
      </item><item>
        <title>[Haskell] Lecture du soir</title>
        <link>http://test.blog2geek.com/haskell-lecture-du-soir-833.html</link>
        <description>
Si vous ne maitrisez pas Haskell, voici une belle occasion d&amp;#39;apprendre ce langage merveilleux. Un blog vient d&amp;#39;être créé avec pour thème : apprenez Haskell en 5 minutes... par soir.


Il a été créé hier, donc vous avez juste un jour à rattraper. Tout est clair et bien détaillé (pour le moment), je vous le recommande. Les leçons sont rapides à lire et devraient être quotidiennes.


 


http://learnhaskell.blogspot.com 
</description>
		<pubDate>Tue, 11 Sep 2007 00:38:00 GMT</pubDate>
      </item><item>
        <title>[Caml] Surcharge et problèmes de cohérence</title>
        <link>http://test.blog2geek.com/caml-surcharge-et-problemes-de-coherence-832.html</link>
        <description>
OCaml, ses problèmes de généricité et son absence de surcharge.


 


Une question fréquente chez les débutants en Caml concerne le problème
d&amp;#39;affichage des valeurs. Quand on utilise Caml en mode interactif,
Caml affiche la valeur du résultat, quel que soit son type. Cet outil
d&amp;#39;affichage est très pratique et plutôt joli. Il est donc naturel de
vouloir l&amp;#39;utiliser aussi dans ses projets (dans l&amp;#39;exécutable
final). Cette question revient régulièrement et la réponse habituelle
est : « Non, ce n&amp;#39;est pas possible. »


Quand on réfléchit un peu au problème, on se dit qu&amp;#39;il faudrait
qu&amp;#39;OCaml garde toutes les informations de types à l&amp;#39;exécution (ce qui
permettrait par la même occasion d&amp;#39;avoir de l&amp;#39;introspection). Mais ce
serait compliqué à gérer, les performances seraient réduites... Une
autre solution serait de gérer la surcharge de fonctions. En effet, il
suffirait au moment même du typage de faire les liaisons nécessaires. Par
exemple, print serait parfois compilé en print_string, parfois en
print_int, etc. selon le type de la valeur. Selon certains, la
surcharge pose de nombreux problèmes, affaiblit le typage et réduit
l&amp;#39;efficacité de la détection d&amp;#39;erreurs. Ce qui est vrai lorsqu&amp;#39;on en
abuse. Mais nous, on veut juste avoir une fonction print. Il est aussi
souvent dit que la surcharge n&amp;#39;apporte rien de plus, et qu&amp;#39;ajouter à
la main le type après print n&amp;#39;est pas long à faire. Ce qui, selon moi,
est faux.


Une remarque que l&amp;#39;on peut faire est : les opérateurs de comparaison
(égalité, infériorité, etc.) ont un type &amp;#39;a -&gt; &amp;#39;a -&gt; bool. Ils
acceptent donc n&amp;#39;importe quel type en entrée. Pourtant, la comparaison
entre deux entiers et la comparaison entre deux chaines de caractères
ne peuvent pas avoir le même code, au final. C&amp;#39;est donc une forme de
surcharge : elle est gérée par le compilateur, une sorte de hack en
fait. C&amp;#39;est donc incohérent : pourquoi seuls les opérateurs de
comparaison sont-ils surchargés ?


Par souci de consistance (et puisque la vraie surcharge nous a
toujours été refusée), il serait bon que les opérateurs de comparaison
ne soient plus surchargés. Qu&amp;#39;est-ce que cela changerait au final ? Il
faudrait créer plein d&amp;#39;opérateurs de comparaison : par exemple &amp;#39;=&amp;#39;
pour les entiers, &amp;#39;=.&amp;#39; pour les flottants, &amp;#39;=^&amp;#39; pour les chaines de
caractères. Il en faudrait aussi pour les chars, les booléens, les
références... Et puis aussi pour les couples d&amp;#39;entiers, les couples de
booléens, les couples avec entier et char, et les couples... et puis
aussi pour les triplets... etc. Cela ne suffirait même pas : il
faudrait que l&amp;#39;utilisateur définisse lui-même la fonction d&amp;#39;égalité à
chaque fois qu&amp;#39;il déclare une structure ou un type somme. Et comme si
cela ne suffisait pas, il faudrait également faire tout ce travail
pour l&amp;#39;infériorité, la supériorité... Bref, ajouter des dizaines
d&amp;#39;opérateurs, ce qui ne serait pas gérable. Surtout que les fonctions
comme min, max, List.mem et les types comme Map ou Hashtbl ne
pourraient plus exister en l&amp;#39;état.


Ce problème qui survient avec les opérateurs de comparaison aurait dû
mettre la puce à l&amp;#39;oreille : plutôt qu&amp;#39;un hack dans le compilateur,
une gestion propre de la surcharge aurait été grandement
appréciée. D&amp;#39;autant plus que ce hack n&amp;#39;est pas totalement
transparent. La comparaison entre deux fonctions n&amp;#39;est pas
définie. Mais, puisqu&amp;#39;un opérateur de comparaison a pour type &amp;#39;a -&gt; &amp;#39;a
-&gt; bool, c&amp;#39;est accepté à la compilation. Pire : le code suivant génère
une exception à l&amp;#39;exécution : &quot;let f x = x in f = f&quot;. Le problème aurait dû leur mettre la puce à l&amp;#39;oreille parce que leur hack n&amp;#39;en a réglé qu&amp;#39;une partie. À chaque fois que l&amp;#39;on crée un type, on doit souvent définir soi-même sa fonction d&amp;#39;affichage (de même que l&amp;#39;on aurait dû définir les opérateurs de comparaison). 


De vraies solutions existent pourtant. En Haskell, ce sont les classes
de types. Par exemple, la classe Num regroupe tous les types
numériques ; la classe Ord regroupe les types pouvant être comparés et
ainsi de suite. Il est d&amp;#39;ailleurs possible d&amp;#39;ajouter des types dans
une classe et même de redéfinir la façon dont un type peut être
comparé. En Caml, il n&amp;#39;est pas possible de redéfinir l&amp;#39;opérateur de
comparaison sur un type particulier. En F#, on a un principe similaire
par le biais d&amp;#39;interfaces et par la surcharge. Cela permet notamment
d&amp;#39;avoir une fonction print générique que l&amp;#39;on peut redéfinir pour
chaque type. Une extension de Caml, GCaml, permet même d&amp;#39;ajouter la
surcharge au langage. Cette extension a été faite il y a plusieurs années,
mais elle n&amp;#39;a jamais été intégrée à la distribution officielle.


Parmi les autres conséquences, on trouve l&amp;#39;impossibilité de travailler
indifféremment sur les listes et les tableaux. On se retrouve donc à
dupliquer le code, ou à obliger l&amp;#39;utilisateur à faire des conversions
non souhaitées. On se retrouve aussi à dupliquer le code, si on veut
avoir une version sur les entiers et une sur les flottants.


 


Pour finir, admirez le code suivant :


let mean_ilist x =
float_of_int (List.fold_left (+) 0 x) /. float_of_int (List.length x


let mean_flist x =
(List.fold_left (+.) 0. x) /. float_of_int (List.length x)


let mean_i64list x =
Int64.to_float (List.fold_left Int64.add Int64.zero x) /. float_of_int (List.length x)


let mean_iarray x =
float_of_int (Array.fold_left (+) 0 x) /. float_of_int (Array.length x)


let mean_farray x =
(Array.fold_left (+.) 0. x) /. float_of_int (Array.length x)


let mean_i64array x =
Int64.to_float (Array.fold_left Int64.add Int64.zero x) /. float_of_int (Array.length x)
</description>
		<pubDate>Mon, 10 Sep 2007 01:07:00 GMT</pubDate>
      </item><item>
        <title>Entendu à Paris</title>
        <link>http://test.blog2geek.com/entendu-a-paris-805.html</link>
        <description>
Dans une agence de pub du 8ième arrondissement, une femme parle avec un léger
accent. Une collègue lui demande : 


&amp;mdash; Tu es originaire d&amp;#39;où ?
&amp;mdash; Je suis née en Allemagne.
&amp;mdash; Et ça fait longtemps ?
&amp;mdash; Oui, depuis que je suis née !
&amp;mdash; C&amp;#39;est dingue quand même.
&amp;mdash; Euh... je m&amp;#39;exprime mal ou c&amp;#39;est toi qui ne comprends pas le
français ?


Entendu à Paris est une sorte de Bashfr IRL. Pas tout à fait, car il n&amp;#39;y a pas de votes et l&amp;#39;humour est assez différent (beaucoup moins geek), mais j&amp;#39;aime beaucoup. C&amp;#39;est plus raffiné, il y a un contexte, il n&amp;#39;y a pas de fautes (normal, c&amp;#39;est retranscris) et une fréquence plus faible. 


Bref, un flux de plus à lire !
</description>
		<pubDate>Fri, 10 Aug 2007 02:07:00 GMT</pubDate>
      </item><item>
        <title>Pourquoi F#, plutôt qu\'OCaml ? (Partie 2)</title>
        <link>http://test.blog2geek.com/pourquoi-f-plutot-qu-ocaml-partie-2-802.html</link>
        <description>
Pourquoi F#, plutôt qu&amp;#39;OCaml ? (Partie 2)


 


Dans la première partie, j&amp;#39;avais évoqué plusieurs points assez généraux : environnement de développement, l&amp;#39;utilisabilité sous Windows, les bibliothèques disponibles et l&amp;#39;avenir des langages. J&amp;#39;avais aussi parlé de la surcharge, présente dans F#. Je vais continuer sur quelques points techniques et détailler certaines fonctionnalités de F#. Dans cette partie, je m&amp;#39;attarderai plus sur les fonctionnalités de F# que sur les faiblesses de Caml. 


À ce jour, je n&amp;#39;ai toujours pas trouvé de sites français parlant de F#. Considérez donc celui-ci comme le premier et n&amp;#39;hésitez pas à poser des questions s&amp;#39;il y a des choses par claires. Je serais ravi de détailler.


 


Généricité


La généricité est un point très important des langages de
programmation. C&amp;#39;est la principale innovation de C++ par rapport au C,
via son mécanisme de templates.


F#, héritant de .NET, possède le concept d&amp;#39;interfaces. C&amp;#39;est certes
moins souple que les templates de C++ ou que le typage dynamique des
langages interprétés, mais cela permet également d&amp;#39;obtenir une
certaine généricité.


En Caml, les types liste et tableau sont totalement indépendants. Il
n&amp;#39;est pas possible, au nom du typage fort et de l&amp;#39;absence d&amp;#39;objets
(OCaml permet la POO, mais elle est quasiment absente de la
bibliothèque standard), d&amp;#39;écrire une fonction générique travaillant
sur une collection. Une fonction calculant la moyenne des éléments
d&amp;#39;une liste devra être réécrite pour utiliser les tableaux.


En F#, on utilise le type IEnumerable (nommé aussi Seq). La fonction suivante peut ainsi être appelée avec un tableau, une liste, une liste paresseuse, une liste générée à partir d&amp;#39;une fonction... 
let mean c = Seq.fold (+) 0 c / Seq.length c;;


De même, une fonction travaillant sur une collection de caractères acceptera les types &quot;char list&quot;, &quot;char array&quot;, &quot;string&quot;, etc.


 


Typage dynamique


Quelques fois, on souhaite passer outre le système de typage. Parfois,
on regrette les langages à typage dynamique. En F#, c&amp;#39;est possible
d&amp;#39;obtenir ainsi plus de liberté et de déporter le typage à l&amp;#39;exécution
(bien sûr, c&amp;#39;est plus risqué, donc on l&amp;#39;utilise prudemment). Par
exemple, on peut définir une liste d&amp;#39;éléments quelconques :
let a = [box 4; box 3.2; box &amp;#39;c&amp;#39;; box &quot;e&quot;]


On peut aussi définir des fonctions qui ne seraient pas typables dans
un système à la Hindley-Milner. Par exemple, la fonction suivante
renvoie : pour n = 0, une liste vide ; pour n = 1, une liste de liste
vide ; pour n = 2, une liste de liste de liste vide, etc.


let rec gen = function
| 0 -&gt; box []
| n -&gt; box [gen (n - 1)]


 


Introspection


En complément du typage dynamique, il est possible d&amp;#39;obtenir à l&amp;#39;exécution des informations de types sur toutes les valeurs. On peut donc regarder ce qu&amp;#39;il y a dans une valeur convertie par la fonction box. On peut aussi faire du pattern matching sur le type d&amp;#39;une valeur. On peut inspecter la liste des méthodes d&amp;#39;un objet et ainsi de suite. On peut même générer du code à l&amp;#39;exécution et construire des classes à la volée. Parce que les langages interprétés n&amp;#39;ont pas le monopole du dynamisme, F# propose, grâce à .NET, des mécanismes d&amp;#39;introspection assez poussés. Et malgré cela, F# possède à peu près la même sûreté et presque les mêmes performances que Caml.


 


Compréhensions de listes


Parce que la manipulation des listes et des tableaux est très fréquente, F# propose du sucre pour faciliter leur écriture. Les compréhensions de listes sont une technique élégante pour effectuer les opérations map, concat, filter ainsi que des conversions (liste vers tableau et inversement). Il est aussi possible d&amp;#39;utiliser des intervalles, par exemple &quot;2..20&quot; ou &quot;&amp;#39;a&amp;#39;..&amp;#39;z&amp;#39;&quot;.


Comparez (F#) :


let f str = [for c in str when c &gt; &amp;#39;a&amp;#39; -&gt;&gt; [c; c]]


Avec (OCaml, après avoir défini String.to_list) :


let f str =
let s = String.to_list str in
let l1 = List.filter (fun c -&gt; c &gt; &amp;#39;a&amp;#39;) s in
let l2 = List.map (fun c -&gt; [c; c]) l1 in
List.concat l2


 


Affichage générique


J&amp;#39;en ai déjà parlé plusieurs fois, il est possible d&amp;#39;afficher
n&amp;#39;importe quel type en F#, avec la fonction print_any. Par défaut, il
affiche la structure interne du type (pour les types somme, tuples,
structures...), mais il est possible de la redéfinir.


Je vous renvoie à mon autre article, sur l&amp;#39;affichage générique en F#.


 


Objet


F# arrive à concilier les programmations objet et fonctionnelle. Ainsi, un type somme est un objet qui peut avoir des méthodes. Par ailleurs, les types de base peuvent être considérés comme des 
objets. Ils possèdent quelques méthodes par défaut et il est même 
possible d&amp;#39;ajouter des méthodes aux entiers. Par exemple :


type System.Int32 with
member x.Square = x * x
member x.Abs = abs x


Ce code ajoute les méthodes Square et Abs à tous les int. Par ailleurs, les active patterns sont une solution innovante permettant d&amp;#39;utiliser le pattern matching sur n&amp;#39;importe quel type complexe. J&amp;#39;avais déjà parlé des active patterns en F#.


 


Syntaxe


La syntaxe de F# est vraiment très concise. L&amp;#39;utilisation de l&amp;#39;indentation (optionnelle) apporte vraiment un plus au niveau de la lisibilité, même lorsque l&amp;#39;on imbrique du pattern matching.


type Foo(x) =
member f.Square = x * x


Ce code définit une classe Foo, avec un constructeur prenant un entier x en argument, qui possède une méthode Square renvoyant le carré de x. Et dans votre langage, ça ressemble à quoi ?


En moyenne, du F# est à peu près aussi concis que du Ruby, et plus concis même que du Python. La concision d&amp;#39;un langage est souvent témoin d&amp;#39;une grande expressivité. Contrairement à ce que l&amp;#39;on voit en Java ou en C++, chaque ligne de code de F# est véritablement utile et fait quelque chose. On n&amp;#39;écrit pas du code, juste parce qu&amp;#39;il le faut. La surcharge, la réutilisation du code, les compréhensions de listes, la bibliothèque et l&amp;#39;utilisation fréquente de l&amp;#39;objet réduisent énormément la taille du code par rapport à OCaml (qui est pourtant considéré comme concis parmi les langages à typage statique).
</description>
		<pubDate>Tue, 07 Aug 2007 00:46:00 GMT</pubDate>
      </item>		</channel>
</rss> 
