(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/