(Courriels de diversion: <coffrer@trepigna-mercenaires.com> <amuserions@regenere-ferules.com> <demeurerais@jaillirez-noues.com> <rhetoriques@vouvoieras-denombrera.com> <libraire@peuplaient-coulissante.com> <servis@riverent-traumatisaient.com> <venielle@immortalisees-vaccinerent.com> <candidat@deshonorera-debuteraient.com> <egalisais@assainies-cumuliez.com> <nieller@prepose-ebruitement.com> )
Eric Marsden wrote: > > >>>>> "ecm" == Eric Marsden <ecm@ekthesis.com> writes:> >>>>> "DG" == David Gauchard <gauchard@laas.fr> writes:> > ecm> #! /usr/local/bin/perl > ecm> > ecm> for (split(/:/, $ENV{'PATH'})) { > ecm> opendir(DIR, $_) or die "can't opendir $_: $!"; > ecm> grep {!/^\./ && print "$_\n" } readdir(DIR); > ecm> closedir DIR; > ecm> } > ecm> > ecm> > DG> david - inconditionnel > ecm> > ecm> Je sais pas pourquoi je defends le Perl, je prefere nettement le > ecm> Scheme ou le Python :-) > > Bon, voici une version en Scheme (plus exactement en Scsh[1]). > > ~$ scsh -c '(map (lambda (f) (display f) (newline)) (apply append (map directory-files ((infix-splitter ":") (getenv "PATH")))))' > > Explication de texte: > > * (getenv "PATH") renvoie la chaine "/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/pgsql/bin:/home/ecm/bin:/usr/local/jdk/bin" > > * (infix-splitter ":") revoie une procedure qui va parser une chaine > donnee en argument, prenant comme separateur la chaine ":", et > renvoyant la liste des repertoires dans le $PATH. C'est comme le > split(/:/, chaine) de Perl. Resultat: > > '("/usr/local/bin" "/bin" "/usr/bin" "/usr/X11R6/bin" > "/usr/local/pgsql/bin" "/home/ecm/bin" "/usr/local/jdk/bin") > > * la procedure directory-files renvoie la liste des fichiers > contenus dans un repertoire, mis a part le "." et ".." qu'on a du > supprimer manuellement en Perl. > > * On utilise append pour creer une grosse liste de notre liste de > listes > > (append '("un" "deux" "trois") '(1 2 3)) > -> '("un" "deux" "trois" 1 2 3) > > * on imprime chaque element de cette liste, avec un retour a la > ligne apres chaque element. Le lambda (f) cree une fonction > anonyme qui prend un argument f, et le map applique cette fonction > a chaque nom de fichier qu'on a dans notre liste. > > (map (lambda (x) (* x 7)) '(6 7 8)) > -> '(42 49 56) > > Voila voila, meme en indentant correctement c'est plus court que la > version Perl (et j'attends toujours une version sh :). Allez, une > version Tcl qqun? > > (map (lambda (f) (display f) (newline)) > (apply append > (map directory-files ((infix-splitter ":") (getenv "PATH"))))) > > [1] http://www-swiss.ai.mit.edu/scsh/ > > "Go forth and write elegant systems programs." > > -- > Eric Marsden Tu sais ce que me rappelle ton message? Dans les forums sur Vi(m), y a souvent des tips de folie qui passent. Des suites de lettres totalement imbitables (;-) qui font tout dans la maison du sol au plafond. Alors forcement l'auteur est oblige d'expliquer lettre par lettre ce que fait la macro. Ben ici c'est un peu pareil. Mais c'est du Scheme/Lisp :-) Enfin bref, merci a tous. Chacun a sa methode, mais le fait est que tout le monde y arrive :-) Unix/Linux rulez -- Olivier --- Le CULTe sur le ouebe > http://savage.iut-blagnac.fr/ La page de linux-31 > http://savage.iut-blagnac.fr/linux-31/