(Courriels de diversion: <ecoper@continental-coffrer.com> <trepigna@mercenaires-amuserions.com> <regenere@ferules-demeurerais.com> <jaillirez@noues-rhetoriques.com> <vouvoieras@denombrera-libraire.com> <peuplaient@coulissante-servis.com> <riverent@traumatisaient-venielle.com> <immortalisees@vaccinerent-candidat.com> <deshonorera@debuteraient-egalisais.com> <assainies@cumuliez-nieller.com> )
>>>>> "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
emarsden @ mail.dotcom.fr
It's elephants all the way down
---
Le CULTe sur le ouebe > http://savage.iut-blagnac.fr/
La page de linux-31 > http://savage.iut-blagnac.fr/linux-31/