Y'a déjà les refinements de Ruby 2.0 qui m'attirent
si y'a aussi une **vraie** évaluation paresseuse ça va me faire venir encore plus vite.
Ruby faut pas s'y mettre si t'as envie de comprendre l'informatique. C'est très efficace mais y a beaucoup trop de wrappers.
Je fais en une ligne en Ruby ce que je fais en 20 lignes en C ![]()
Langages fonctionnels
Merci Calet sans toi j'aurais attendu quelques mois avant de me lancer dans l'Objective CamL ![]()
Jamy > C'est le même principe que pour n'importe quel langage de haut niveau.
Et on peut toujours descendre : c'est pas avec du C que tu vas comprendre l'informatique, je fais en une ligne de C ce que je fais en 320 lignes d'assembleur
![]()
Et niveau wrappers, je trouve que c'est plus l'inverse : les débutants ont tendance à trop utiliser les boucles manuellement, alors qu'on a des collections d'itérateurs super complètes (ce que tu appelles wrappers) pour écrire du Ruby idiomatique.
Franchement, j'aime pas passer pour un gourou d'un langage particulier, mais arrêtez de blâmer le Ruby pour tous les maux en informatique, merde
vava > non, pas que je sache. C'est un simulacre d'évaluation paresseuse, c'est pas vraiment complet (et c'est encore récent ; ruby s'oriente un peu vers le fonctionnel, ça s'améliorera peut-être).
Concrètement .lazy s'applique sur un énumérateur et retourne une sorte d'énumérateur (un objet Enumerator::Lazy) qui redéfinie les méthodes d'inspiration fonctionnelles classiques : map, each_<foo>, ...
Je suis désolé mais c'est la vérité, quand t'as des fonctions built-in qui fout tout le boulot à ta place tu comprends beaucoup moins. J'adore Ruby mais il faut lui attribuer que ce côté est un peu abusé, Python sur ce côté est déjà beaucoup plus viable.
Je t'invite à faire les problèmes du projet euler et de remarquer la certaines complexités de certaines enigmes pourtant résolues en 10 sec avec ce cheat qu'est Ruby.
D'ailleurs je connaissais pas l'évalution paresseuse non plus et c'est en effet assez efficace ![]()
"beaucoup plus"
Oklm svp
Oui peut-être, mais juste avoir .lazy() comme ça ne sert pas à grand chose, donc ça veut rien dire.
Tu veux du vrai fonctionnel? Matte ça: http://pastebin.com/2fv9ZKuQ
Les listes de compréhension, vous connaissez ça en natif chez Ruby
![]()
Calet en 100
Bordel le routage freebox ne fonctionne pas en IPv6
Si c'est pas inciter les gens à revenir à l'ipv4 ça
![]()
Mais on peut pas raisonnablement se plaindre du fait qu'un langage automatise certaines tâches répétitives à partir du moment où cette automatisation n'apporte aucun inconvénient technique ! Pour certaines, c'est même plus performant que leur équivalent à la main (je pense notamment aux :attr_<foo> qui sont en fait directement écrits en C alors que les setters/getters manuels sont interprétés comme du Ruby classique).
Pour l'anecdote, je pense pas non plus que Ruby soit le meilleur langage pour débuter, parce qu'il est tellement souple qu'on finit toujours par trouver la pire méthode pour résoudre un problème si on fait pas attention. Mais pour des développeurs ayant déjà un minimum d'expérience, je vois pas en quoi empaqueter les boucles dans des itérateurs dérivés ou des énumérateurs devrait poser problème ![]()
Et puis c'est pas comme si les structures originales étaient cachées, on peut toujours les utiliser si on aime réinventer la roue à chaque fois quand une solution éprouvée est déjà disponible.
C'est quand même incroyable de considérer un langage comme 'cheat' parce qu'il vise à simplifier le développement. Qu'on l'attaque sur le point des sacrifices qu'il fait pour ça, okay, mais là, l'histoire des wrappers, ça n'a que des avantages. C'est pas ça en soit qui ralentit l'exécution.
À ce moment-là on la mets où la barrière entre ce qui est okay et ce qui ne l'est pas ? Le C ou le C++ ont bien des fonctions utilitaires qui au final ne sont que des fonctions qui empaquettent d'autres fonctions plus primaires. C'est okay de les utiliser ou c'est du 'cheat' ?
D'ailleurs c'est marrant que tu parles du projet euler, parce que j'en ai fait aussi pas mal (une cinquantaine, mais discontinus), en Ruby, Haskell et C++. Et tu seras étonné de voir à quel point le Haskell simplifie la résolution de certains types de problèmes, notamment géométriques. Tu peux littéralement résoudre une bonne partie des 20 premiers problèmes en seulement quelques lignes de Haskell.
Richard > je suis pas un expert en Python, mais ce snippet c'est pas l'équivalent du premier pastebin que je t'ai montré ?
Je sais pas vraiment ce qu'est une liste de compréhension donc pour le coup je peux pas te répondre. Tu peux détailler ? Je suis sûr qu'on a ça
![]()
Ce n'est pas cheat en soi mais ça gène l'apprentissage. Certains chercheurs de mon université trouvent même que le C est de trop haut niveau pour l'enseignement donc
Il ne s'agit pas de débuter, je pense qu'une fois que tu es sorti d'un cursus de 5 ans d'enseignement en Informatique alors tu peux utiliser Ruby. Dans le cas contraire c'est néfaste et non adapté. Je parle pour des personnes qui souhaitent apprendre l'informatique en tant que science.
La programmation ne se résume pas qu'a apprendre un langage puis traduire les concepts basiques qu'on a dans la tête dans ce langage particulier, une telle manière de faire est équivalente à de la traduction. Il faut assimiler les concepts si tu veux comprendre et être beaucoup plus effiace et percer dans le game.
La première pratique que j'ai cité est aussi connue sous le nom de "pissage de code"
Je t'invite à voir cette conférence quand tu auras le temps qui est extrêmement enrichissante: http://www.framablog.org/index.php/post/2013/06/11/francois-elie-education-conference
Oui c'était le but de faire l'équivalent de façon plus ou moins "pythonic".
Une liste en compréhension c'est un truc qui te permet de filtrer une liste avec des conditions et chaque élément retourner ce retrouve à gauche totalement de l'expression (tu peux appliqué une transformation à l'élément comme j'ai fait avec * 2)
C'est une features très populaire dans Haskell
En gros c'est juste plus ou moins du sucre syntaxique pour looper dans une liste, faire des transformations sur les éléments, filtrer les éléments, et le résultat de l'expression finale est une autre liste. ![]()
Et non, je ne crois pas qu'il existe un truc similaire pour Ruby. Enfin pas en natif en tout cas.
C'est ce qui me manquait le plus pour les 2-3 trucs que j'ai fait sous Rails. ![]()
En ruby tu peux faire l'équivalent avec reject
Enfin ça marche dans l'autre sens mais suffit d'inverser la valeur de vérité et c'est équivalent.
Richard > Aaaaaaaaaaahh oui, je vois ça en Haskell mais j'imaginais pas du tout les revoir ailleurs que dans le Haskell donc j'ai pas tilté
Hum, là tout de suite je dirais qu'on peut bricoler un truc avec reject ou select, à voir.
Jamy >
"Il ne s'agit pas de débuter, je pense qu'une fois que tu es sorti d'un cursus de 5 ans d'enseignement en Informatique alors tu peux utiliser Ruby. Dans le cas contraire c'est néfaste et non adapté. Je parle pour des personnes qui souhaitent apprendre l'informatique en tant que science. "
Mais c'est le cas de n'importe quel langage plus ou moins haut niveau ![]()
La programmation n'est qu'une infime partie des CS, et un langage en particulier en est une partie encore plus infime. C'est juste de la grammaire et un peu de mémoire ; le vrai boulot, c'est toute la théorie derrière sur les structures de données et les algorithmes.
Peu importe ton niveau dans ces théories informatiques, le langage n'est qu'un outil pour les appliquer. Si je n'ai aucune connaissance en théorie des catégories, ce n'est ni l'assembleur ni le ruby qui me l'apprendront. Et si je suis un expert en théorie des catégories, ce n'est ni l'assembleur ni le ruby qui m'empêcheront ni m'aideront à les appliquer si j'en ai besoin.
Je vois pas où tu veux en venir, en fait. Bien sûr qu'un langage ne t'apprendra pas les CS, c'est une discipline à part entière et dont les langages font partie ! Je le répète, mais un langage est un outil et en soi un simple conglomérat de règles de grammaire et de mots-clés. Tout le travail derrière est plus abstrait que ça et applicable à n'importe quel autre langage.
l'inverse de reject c'est select.
Mais ouais avec select et collect, on peut faire un truc semblable, mais en moins beau syntaxiquement. ![]()
Comme tu l'as dis un langage est un outil, quand on enseigne une théorie qu'on découpe en UE puis en différentes parties on a la partie théorique d'un côté puis la partie pratique du cours. Qu'est-ce que la partie pratique en informatique ? C'est un langage de programmation. Du coup ça permet de faire le lien entre la théorie et la pratique. Et je te dis pas les dégâts si on utilisait Ruby pour ce faire par exemple
En mathématiques tu n'auras jamais le meilleur niveau possible si tu ne fais pas d'exercices, tu auras beau apprendre ton cours par cœur si tu n'es pas capable d'avoir l'abstraction pour dégager les concepts et comprendre leur étendue tu ne vaudras rien devant un sujet d'examen. Expérience vécue de nombreuses fois
C'est exactement la même chose ici.
Ouais je sais en plus
Le pire c'est que j'ai toujours utilisé select et pas reject ![]()
Mais je veux bien, je suis tout à fait d'accord avec ton dernier message ; mais je vois pas en quoi le Ruby en particulier t'empêche de mettre en application tes connaissances théoriques.
Qu'est ce que tu peux faire manuellement en C, en Python ou en je-ne-sais-quoi que tu ne peux pas faire manuellement en Ruby, si tu veux implémenter tes cours ? ![]()
Comme je te l'ai dit, toutes les abstractions offertes par Ruby sont optionnelles. Si tu veux réimplémenter toi-même une structure de données ou un ensemble de méthodes en particulier, tu dispose toujours des mêmes outils primaires que dans n'importe quel autre langages : boucles, embranchements, structures de données primitives, ...
Vraiment, comme j'avais dit je pense pas effectivement que le Ruby soit le meilleur pour débuter, mais pas du tout pour ces mêmes raisons. Selon ton raisonnement, aucun langage n'est adapté puisque le principe est justement d'appliquer des théories abstraites, mais pour ce faire il faut forcément descendre en abstraction !
http://xkcd.com/378/
Premièrement la faiblesse, si je dispose d'un tel langage je vais être tenté par le diable et utiliser ces méthodes
Deuxièmement même dans la plus grande simplicité Ruby reste un langage de plus haut niveau ne serait-ce que dans son interprétation des structures primaires
Du coup Ruby n'est pas approprié il équipé de beaucoup trop de raccourcis, sa gestion de la mémoire est complètement transparente.
Mais oui grosso-modo CRuby est écrit en C donc tu peux faire tout ce que tu fais en C, mais il y des simplifications fondamentales.
Ce n'est pas parce que c'est abstrait que ça n'a pas de sens dans la pratique, si tu n'as pas l'abstraction nécessaire ta pratique en souffrira car tu n'auras pas LA manière de raisonner.