blabla@fonctionnel : Taiche ne sert à rien

blabla@fonctionnel : Taiche ne sert à rien - Langages fonctionnels - Programmation

Marsh Posté le 06-03-2007 à 14:31:27    

Règles du topic:
 
1] Ce topci n'est pas un topci sur le cyclimse.
2] Toutes les questions générales, l'actu, même la branlette intellectuelle sont les bienvenues tant que ça concerne les langages fonctionnels.
3] Pour troller, utiliser les catégories approriées du forum comme Seti ou OSA.
4] Pour les questions plus spécifiques, créez un topic.
 
Pour les liens intéressants et autres ressources, me MP je mettrai ça dans le topic.
Des sondages intéressants pourront apparaître aléatoirement, comme ça, suivant si j'ai envie ou pas, si j'ai chié mou la veille, etc.
 

Spoiler :

Règles du topic:
1] No bitch
2] No 4chan
3] No dawa
Faites pas les malins, j'ai la modération en MP ©

Message cité 1 fois
Message édité par Chaos Intestinal le 29-10-2007 à 17:24:22
Reply

Marsh Posté le 06-03-2007 à 14:31:27   

Reply

Marsh Posté le 06-03-2007 à 14:32:00    

J'ai voté multi de stiffler \o/


---------------
I'm failing as fast as I can !! -- Vision-360, vos photos en grand format -- !! -- Les nouilles c'est bon
Reply

Marsh Posté le 06-03-2007 à 14:32:52    

c'est quoi un langage fonctionnel [:quardelitre dei]

Reply

Marsh Posté le 06-03-2007 à 14:33:50    

une sorte de langage qui marche donc pas lingo ni actionscript [:dawak]


---------------
I'm failing as fast as I can !! -- Vision-360, vos photos en grand format -- !! -- Les nouilles c'est bon
Reply

Marsh Posté le 06-03-2007 à 14:41:33    

Masklinn n'a pas d'amis :o

Elmoricq a écrit :

c'est quoi un langage fonctionnel [:quardelitre dei]


Un langage dans lequel l'unité de calcul est la fonction au sens mathématique du terme, avec une emphase sur le principe d'application de fonction plutôt que celui de changement d'état :o
 
Dans les concepts fonctionnels importants on trouve

  • First-class function: les fonctions sont des objets de première classe, elles peuvent être envoyées en arguments à d'autres fonctions ou renvoyées (en valeurs de retours)
  • Pure functions: une fonction "pure" est une fonction sans effet de bord, la sortie ne dépend que de l'entrée et pas d'un état externe, et la fonction ne modifie pas l'état d'une quelconque ressource (interne ou externe)
  • Recursion: la majorité des langages fonctionnels n'ont pas de mécanismes itératifs (pas de boucles for/while/do/...), les processus d'itération sont générés par récursion
  • Pattern-matching: s't'un peu compliqué à expliquer comme ça, voir la wikipedia


Naturellement des langages non fonctionnels peuvent avoir des caractéristiques fonctionnelles (e.g. Python et Ruby ont des first-class functions)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 14:42:01    

mais c'est fini oui ? [:pingouino]
edit: je réouvre, ménage fait, mais ce topic peut éventuellement servir à ceux qui ne connaissent pas le paradigme fonctionnel et qui auraient des questions


Message édité par Harkonnen le 06-03-2007 à 14:42:53
Reply

Marsh Posté le 06-03-2007 à 14:47:49    

C'est quelque chose de sain, une forme de dépucelage. La cat ADA est morte dans d'atroces souffrances, c'est ça que tu veux Harko ? [:sisicaivrai]

Reply

Marsh Posté le 06-03-2007 à 14:59:03    

Chaos Intestinal a écrit :

C'est quelque chose de sain, une forme de dépucelage. La cat ADA est morte dans d'atroces souffrances, c'est ça que tu veux Harko ? [:sisicaivrai]


Elle est encore là la cat Ada, il y a même des questions sur Ada dedans, de temps en temps :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 15:20:08    

Aaaah, enfin une cat pour ceux qui aiment programmer :o

Reply

Marsh Posté le 06-03-2007 à 15:42:31    

masklinn a écrit :

Dans les concepts fonctionnels importants on trouve

  • First-class function: les fonctions sont des objets de première classe, elles peuvent être envoyées en arguments à d'autres fonctions ou renvoyées (en valeurs de retours)

[...snip...]
Naturellement des langages non fonctionnels peuvent avoir des caractéristiques fonctionnelles (e.g. Python et Ruby ont des first-class functions)


Je suis curieux de voir à quoi ça ressemble cette fonctionnalité... A tout hasard, en aurais-tu un exemple (si possible en ruby, questioin de s'y retrouver un peu dans la syntaxe :)) stp?

Reply

Marsh Posté le 06-03-2007 à 15:42:31   

Reply

Marsh Posté le 06-03-2007 à 15:58:33    

IrmatDen a écrit :

Je suis curieux de voir à quoi ça ressemble cette fonctionnalité... A tout hasard, en aurais-tu un exemple (si possible en ruby, questioin de s'y retrouver un peu dans la syntaxe :)) stp?


en ruby ça correspond aux blocks: les blocks sont simplement le nom des first-class functions en Ruby (ça lui vient de Smalltalk) e.g.
 

Code :
  1. # je définis une fonction "square"
  2. square = lambda {|x| x*x }
  3. # c'est bien une fonction:
  4. puts square.call 3
  5. # => 9
  6. def foo f # prend une fonction en argument
  7.    puts f.call(5)
  8.    puts f.call(10)
  9. end
  10. foo square
  11. # => 25
  12. # => 100
  13.  
  14. # mais tu connais probablement mieux la syntaxe magique suivante
  15. # qui est simplement un raccourci pour ce qu'on voit au dessus
  16. # (et est limitée à un block unique par appel en ruby, contrairement à Smalltalk)
  17. def foo &block
  18.    puts block.call(5)
  19. end
  20. foo {|x| "Pouet #{x}" }
  21. # => "Pouet 5"
  22.  
  23. # ou celle là, encore plus magique (mais que je n'aime pas trop perso)
  24. def bar
  25.    puts yield 5
  26. end
  27.  
  28. bar {|x| "Plop #{x}" }
  29. # => "Plop 5"


En se rappelant qu'il y a deux syntaxes différentes pour les blocks en Ruby (donnant globalement des résultats identiques, mais pas exactement):

Code :
  1. # v1, à utiliser de préférence quand on a peu de code, pour les blocks "inline"
  2. blk = lambda {|var| op(var)}
  3. # v2, pour les blocks plus complexes (sur plusieurs lignes)
  4. blk = lambda do |var|
  5.    op(var)
  6. end

Message cité 1 fois
Message édité par masklinn le 06-03-2007 à 16:01:01

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 16:30:34    

IrmatDen a écrit :

Je suis curieux de voir à quoi ça ressemble cette fonctionnalité... A tout hasard, en aurais-tu un exemple (si possible en ruby, questioin de s'y retrouver un peu dans la syntaxe :)) stp?


 
Erlang : http://fr.wikipedia.org/wiki/Erlang_%28langage%29
 
La syntaxe de Erlang me fait un peu penser à Prolog...

Reply

Marsh Posté le 06-03-2007 à 16:32:01    


J'ai pas compris pourquoi tu l'avais quoté :o

rufo a écrit :

La syntaxe de Erlang me fait un peu penser à Prolog...


Les premières implémentations d'Erlang étaient en Prolog, et la syntaxe d'Erlang est effectivement tirée directement de celle de Prolog (avec quelques additions pour les processus par exemple) :jap:


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 16:37:12    

\o/

Reply

Marsh Posté le 06-03-2007 à 16:37:14    

masklinn a écrit :

J'ai pas compris pourquoi tu l'avais quoté :o
 
Les premières implémentations d'Erlang étaient en Prolog, et la syntaxe d'Erlang est effectivement tirée directement de celle de Prolog (avec quelques additions pour les processus par exemple) :jap:


 
Je me demandais, en erlang, comment on pouvait passer des objets via les messages entre processus? Un message peut contenir autre chose que du texte ou des nombres?
 
ps : je connais erlang que de nom et de principe (évoqué en cours d'architecture de systèmes distribués) :hello:  

Reply

Marsh Posté le 06-03-2007 à 16:53:02    

Si on cause de Nemerle, je tacherais de participer.
A+,

Reply

Marsh Posté le 06-03-2007 à 17:25:36    

rufo a écrit :

Je me demandais, en erlang, comment on pouvait passer des objets via les messages entre processus? Un message peut contenir autre chose que du texte ou des nombres?


Normalement on peut passer n'importe quoi d'un processus à l'autre.
 
Le seul truc dont je suis pas sûr et certain c'est pour passer directement des fonctions d'un processus à un autre (je testerais ça ce soir, même si c'est pas d'un intérêt terrible), mais tout le reste (listes, tuples, symboles, strings, nombres, records) peut servir de message (un message est un objet Erlang quelconque, il n'y a pas fondamentalement d'objet message).
 
Pour envoyer un message à un processus tiers c'est trivial: en considérant qu'on a son pid (son adresse, si tu veux) on fait comme ça:

Code :
  1. %% On considère qu'on est à l'intérieur de notre process
  2. %% le pid du process auquel on veut envoyer un message est socké dans la variable Pid
  3. %% On veut lui envoyer un tuple {message, "Ceci est un test", ["arg1","arg2","arg3]}
  4. Pid ! {message, "Ceci est un test", ["arg1","arg2","arg3]}
  5. %% Voilà, c'est fait


Sympa hein? :o
 
De l'autre côté, le processus destinataire a une "boite aux lettres" dans lequel notre message est stocké, et il utilise "receive" pour récupérer des messages dans sa boite (receive fait du pattern-matching btw).
 
Par exemple dans ce cas si il veut aller voir sa boite et qu'il cherche uniquement un message:

Code :
  1. %% On est à l'intérieur du processus recevant le message
  2. receive
  3.    {message, MessageText, MessageArgs} ->
  4.                    %% ici, MessageText contient le corps du message
  5.                    %% et MessageArgs est une liste contenant nos 3 arguments
  6.    %% et on peut naturellement avoir d'autres patterns de réception de messages :o
  7. end


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 17:30:50    

On notera que sans la coloration syntaxique il est un peu dur de différencier les commentaires et le code :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 17:32:51    

le coup de l'envoi/réception des messages, j'avais compris : j'avais vu ça en cours (le principe) et la mise en application pour erlang (lien wikipedia que j'ai donné plus haut).
C'est vrai que pour le distribué, ça a l'air assez sympa :) En +, j'ai vu qu'on pouvait attendre des messages pendant un temps donné et si rien ne se passe, déclencher une action...

Reply

Marsh Posté le 06-03-2007 à 17:33:40    

masklinn a écrit :

On notera que sans la coloration syntaxique il est un peu dur de différencier les commentaires et le code :o


%% est un commentaire. Ca se comprend assez facilement.

Reply

Marsh Posté le 06-03-2007 à 17:37:12    

rufo a écrit :

En +, j'ai vu qu'on pouvait attendre des messages pendant un temps donné et si rien ne se passe, déclencher une action...


Oui, la dernière clause du receive peut commencer par "after" (suivi d'un int, genre "after 3000" ) et ça timeout proprement (les receive étant bloquants)

rufo a écrit :

%% est un commentaire. Ca se comprend assez facilement.


Oui mais ça rend pas le truc beaucoup plus lisible :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 17:39:01    

question sans doute bête : on peut coder une appli entière avec erlang? (logique métier + IHM)

Reply

Marsh Posté le 06-03-2007 à 17:40:36    

oui [:dawa]

Reply

Marsh Posté le 06-03-2007 à 17:48:05    

masklinn a écrit :

[explication ruby, blocks, 1st class functions...]


Merci pour tes exemples détaillés :jap: (et du coup, j'ai appris plusieurs trucs sur ruby aussi genre comment créer une fonction utilisant les blocks :D).

Reply

Marsh Posté le 06-03-2007 à 17:51:25    

rufo a écrit :

question sans doute bête : on peut coder une appli entière avec erlang? (logique métier + IHM)


Ouaip (il y a un GTK/Erlang et un wxErlang pour la GUI même si c'est pas non plus pour ça qu'il a été créé).
 
Néamoins, Erlang est habituellement utilisé pour des trucs qui n'ont pas tellement besoin de GUI. La manière dont c'est fréquement fait est qu'Erlang gère toute la logique applicative, la distribution tout ça et si il y a besoin d'accéder au hardware c'est fait en C/C++ (ce qu'on appelle des "drivers" en Erlang), qui est ensuite appelé via des FFI.
 
Le recours au C/C++ n'étant que rarement nécessaire à moins de créer le software e.g. d'un switch telecom :o

IrmatDen a écrit :

Merci pour tes exemples détaillés :jap: (et du coup, j'ai appris plusieurs trucs sur ruby aussi genre comment créer une fonction utilisant les blocks :D).


Obtenir une référence sur un block [:aloy]  
(transformer un block en proc en fait)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 18:10:29    

Très juste, désolé :/
Quelque part, c'est fort semblable aux foncteurs en C++ à la (grosse) différence qu'on peut localiser le code de la fonction fournie en paramètre à l'endroit précis de son utilisation?

Reply

Marsh Posté le 06-03-2007 à 18:24:33    

IrmatDen a écrit :

Très juste, désolé :/
Quelque part, c'est fort semblable aux foncteurs en C++ à la (grosse) différence qu'on peut localiser le code de la fonction fournie en paramètre à l'endroit précis de son utilisation?


Mouais...
 
En beaucoup plus flexible puisque les blocks sont scopés (comme n'importe quel autre objet du langage), n'ont pas besoin d'être nommés (fonctions anonymes) et peuvent être déclarés n'importe où (et le fait que ce soient des objets classiques signifie qu'on peut non seulement les ballader entre les fonctions, mais on peut aussi les stocker dans un Array ou un Hash, ou comme variable membre d'un objet, ou ...)


Message édité par masklinn le 06-03-2007 à 18:25:21

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 18:33:47    

Ah ouais, j'ai pas pensé à tout ça (vi, je débute en Ruby et j'ai jamais touché python).
Merci pour les détails :jap:

Reply

Marsh Posté le 06-03-2007 à 18:36:58    

IrmatDen a écrit :

Ah ouais, j'ai pas pensé à tout ça (vi, je débute en Ruby et j'ai jamais touché python).
Merci pour les détails :jap:


C'est pas fondamentalement une tare de pas savoir ça, les langages "mainstream" n'offrant pas tellement cette possibilité :D
(elle pue en C et C++, elle superpue en Java [classes anonymes], elle a commencé à apparaître en C# 2.0 mais c'est encore assez bof par rapport à ce qu'on peut trouver ailleurs)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 19:01:28    

je suis pour \o/

Reply

Marsh Posté le 06-03-2007 à 19:26:02    

pour quoi?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 22:02:59    

masklinn a écrit :

Le seul truc dont je suis pas sûr et certain c'est pour passer directement des fonctions d'un processus à un autre (je testerais ça ce soir, même si c'est pas d'un intérêt terrible)


Voila, donc je viens de tester avec le script suivant:

Code :
  1. -module(test_send).
  2.  
  3. -export([start/0, sauce/0, torrent/0]).
  4.  
  5. start() ->
  6.         spawn(test_send, sauce, []),
  7.         "".
  8.  
  9. sauce() ->
  10.         Torrent = spawn(test_send, torrent, []),
  11.         Torrent ! {func, fun() -> "This was a function" end},
  12.         Torrent ! {string, "This is a string"},
  13.         Torrent ! {num, 42},
  14.         Torrent ! {exit, self()},
  15.         receive
  16.                 Msg ->
  17.                         io:format("~n~w~n", [Msg])
  18.         end.
  19.  
  20. torrent() ->
  21.         receive
  22.                 {func, Fun} ->
  23.                         io:format("~s~n", [Fun()]),
  24.                         torrent();
  25.                 {string, Str} ->
  26.                         io:format("~s~n", [Str]),
  27.                         torrent();
  28.                 {num, Num} ->
  29.                         io:format("~b~n", [Num]),
  30.                         torrent();
  31.                 {exit, Pid} ->
  32.                         Pid ! {this, "is", 97, fun() -> "Message" end},
  33.                         ok
  34.         end.


Et je confirme que ça ne pose effectivement strictement aucun problème de balancer des fonctions d'un process à l'autre:

$ erlc test_send.erl

 

$ erl -noshell -noinput -run test_send start
This was a function
This is a string
42

 

{this,[105,115],97,#Fun<test_send.1.126143062>}


Ici je balance tout d'abord 3 messages de "sauce" à "torrent": une fonction, un string et un int "torrent" appelle les fonctions (et imprime leur valeur de retour) et imprime les strings et ints.
Puis "sauce" envoie un message de terminaison à "torrent" qui répond en envoyant un tuple composé d'un symbol, d'un string, d'un int et d'une fonction, et "sauce" imprime le tout avant de se terminer :o


Message édité par masklinn le 06-03-2007 à 22:05:32

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-03-2007 à 22:11:34    

c'est illisible ces langages [:pingouino]

Reply

Marsh Posté le 06-03-2007 à 22:27:43    

Harkonnen a écrit :

c'est illisible ces langages [:pingouino]


C'est pas colorisé et codé à la porc pour aller vite surtout :o

 

Colorisé c'est déjà largement moins pire e.g.
http://img48.imageshack.us/img48/470/erlangemacslf7.png

 

Après c'est sûr que pour quelqu'un qui ne fait que du C# et du SQL ça peut choquer :o


Message édité par masklinn le 06-03-2007 à 22:28:39

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-03-2007 à 06:59:30    

Ça à l'air facile de faire une environnement visuel ou semi-visuel genre boiboites à relier pour un truc pareil en fait ...


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-03-2007 à 10:05:17    

0x90 a écrit :

Ça à l'air facile de faire une environnement visuel ou semi-visuel genre boiboites à relier pour un truc pareil en fait ...


Je rappelle que quand on code en erlang il faut réfléchir hein :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-03-2007 à 10:07:46    

masklinn a écrit :

Je rappelle que quand on code en erlang il faut réfléchir hein :o


 
Et ? la seule manière de réfléchir c'est en regardant une grille de caractères colorés :o ?
 
Death to the TextBox :o


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-03-2007 à 10:59:28    

0x90 a écrit :

Et ? la seule manière de réfléchir c'est en regardant une grille de caractères colorés :o ?


C'est pas en reliant des boiboites dans visio en tout cas [:klem3i1]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 07-03-2007 à 14:25:06    

masklinn a écrit :

C'est pas en reliant des boiboites dans visio en tout cas [:klem3i1]


 
J'ai pas parlé de "développer" en UML heing :o Je parle qu'on s'astique devant des intelli-bidule et de la coloration syntaxique sur des patés de texte alors que ça fait un moment qu'on a quand même un peu plus de trucs qu'avant dans les toolkits graphiques et que y'a ptêtre moyen de faire un poil plus communicant.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-03-2007 à 14:35:21    

[:drapal]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed