Aller au contenu

Messages recommandés

Posté(e)

Bonjour

 

Un nouveau challenge :D

Le but est de retrouver tous les sous-répertoires à partir d'une branche de l'arborescence.

Si on indique la racine, on aura donc tous les répertoires du disque.

 

Ceux qui ont déjà la solution pourront patienter jusqu'à demain ;)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Bonjour :)

Un sujet très intéressant!

Toutes les variantes me sont très intéressantes...

 

Ceux qui ont déjà la solution pourront patienter jusqu'à demain ;)

 

Mes variantes vous sont familières...

Evgeniy

Posté(e)
vl-directory-files.
Merci Patrick_35 !

Le problèm est que je n'utilise pas Autocad... Mais BricsCAd, et une ancienne version (jusqu'à ce que la nouvelle n'est plus ce bug affreux en lisp) qui n'utilise aucun VLISP...

Je triche avec les fonctions équivalentes de (gile) (merci encore à lui), mais cette fonction n'est pas dispo...

Sniff http://www.zwatla.com/emo/emo/1/em0900.gif

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Il y a aussi la bibliothèque doslib que j'utilise souvent, mais surtout pour la recherche de fichiers

dans des répertoires ou faire de copies, c'est plus rapide que des enregistrer sous.

 

J'attaque le challenge à midi, (et ca me fait penser que je n'ai pas encore attaqué mon super)

 

a+

 

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Bonjour,

 

(defun arbo (REPERT / LISTREP REP)
 ;; utilisation
 ;; (arbo "c:")
 ;; (arbo "c:\\rep1")
 ;; (arbo "c:\\rep1\\rep2")
 ;; etc ...
 (setq LISTREP (vl-directory-files REPERT nil -1))
 (if (= (car LISTREP) ".")
   (setq LISTREP (cddr LISTREP))
 )
 (while LISTREP
   (setq 
     REP (car LISTREP)
     LISTREP (cdr LISTREP)
   )
   (print (strcat REPERT "\\" REP))
   (arbo (strcat REPERT "\\" REP))
 )
 (princ)
)

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

Bonne idée le print, j'avais déjà donné une réponse ici mais il s'agissait de retourner une liste.

 

Le même écrit un peu différemment (une seule variable) :

 

(defun GetFolders (path / c)
 (apply 'append
 (mapcar
   '(lambda (x)
      (cons (setq c (strcat path "\\" x)) (GetFolders c))
    )
   (vl-remove "."  (vl-remove ".." (vl-directory-files path nil -1)))
 )
 )
) 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci à tous vous tous :D

 

Matt666

A quand une version full ;)

 

ElpanovEvgeniy

Mes variantes vous sont familières...

C'est toujours un plaisir de te lire :D

 

bseb67

J'attaque le challenge à midi

Donc, on attends ton résultat :cool:

 

(gile)

Bravo pour ta routine, mais l'utilisation d'un append n'est pas trop gourmand ?

 

zebulon_

Aussi chapeau pour ta routine car j'ai écrit quelque chose qui y ressemble beaucoup

(defun subf(ori / rep)
 (princ (strcat "\n" ori))
 (foreach rep (vl-directory-files ori nil -1)
   (or (member rep '("." ".."))
     (subf (strcat ori "/" rep))
   )
 )
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

mais l'utilisation d'un append n'est pas trop gourmand ?

 

Comme je disais "il s'agissait de retourner une liste".

 

Dans le même esprit pour un retour à la ligne de commande :

 

(defun PrintFolders (path / c)
 (mapcar
   '(lambda (x)
      (print (setq c (strcat path "\\" x)))
      (PrintFolders c)
    )
   (vl-remove "." (vl-remove ".." (vl-directory-files path nil -1)))
 )
 (princ)
) 

 

En tout cas, Patrick_35, chapeau pour ta routine, j'aime beaucoup.

Ça fait plaisir de voir d'autres s'amuser avec les fonctions récursives ;)

 

[Edité le 9/9/2008 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Ça me rappelle ce sujet

 

l'utilisation d'un append n'est pas trop gourmand ?

C'est ce que j'avais utilisé à l'époque, et c'est vrai que ce n'est pas le plus performant suivant où débute l'exploration dans l'arborescence.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Je n'ai pas d'idées, pour l'amélioration du programme.

La seule correction - a enlevé la variable superflue.

 

(defun PrintFolders (path)
;;by (gile)
(mapcar
 '(lambda (x) (PrintFolders (print (strcat path "\\" x))))
 (vl-remove
  "."
  (vl-remove ".." (vl-directory-files path nil -1))
 ) 
)
(princ)
) 

Evgeniy

Posté(e)

Bonjour,

 

Ça fait plaisir de voir d'autres s'amuser avec les fonctions récursives

Une fois qu'on a compris comment ça marche, on trouve cela forcément élégant. De plus, dans le cas qui nous intéresse, je vois mal comment on pourrait répondre à la question simplement sans utiliser la récursivité ?

 

Je reprends à mon compte les mots des Patrick_35, au sujet du challenge 24

 

D'habitude, je vois plus facilement les itératives par rapport aux récursives, mais là je sèche sans faire une usine à gaz...

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Une fois qu'on a compris comment ça marche, on trouve cela forcément élégant. De plus, dans le cas qui nous intéresse, je vois mal comment on pourrait répondre à la question simplement sans utiliser la récursivité ?

 

:)

Recursion - seulement un des accueils, mais non l'algorithme.

Regarde la variante sans recursion et compare...

 

(defun PrintFoldersInt (path)
(setq path (list path))
(while (setq path
             (apply
              'append
              (mapcar
               '(lambda (a)
                 (mapcar
                  '(lambda (b) (print (strcat a "\\" b)))
                  (vl-remove
                   "."
                   (vl-remove ".." (vl-directory-files a nil -1))
                  )
                 )
                )
               path
              )
             )
       )
)
(princ)
) 

Evgeniy

Posté(e)

Salut,

 

:( y a déjà plein de réponses, et malheureusement hier à midi j'ai du effectuer un dépannage qui m'a bouffé ma pause déjeuner :( .

 

pour ce sujet c'est clair qu'un mode récursif parait évident et intuitif.

Je vais tenter un mode itératif, mais avec le code court que vous avez donné, avec le super rapide

mapcar, ca va être chaud de faire plus rapide.

;)

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

Regarde la variante sans recursion et compare...

 

je regarde et les bras m'en tombent... apply, mapcar et la fonction lambda sont des choses que je n'utilise pas assez. Et c'est une faute quand on voit ce qu'il est possible de faire avec.

 

Amicalement

Vincent

 

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Zebulon: y a un truc bizarre, ta fonction ne marche pas chez moi :casstet:

(edit1: ta fonction est récursive)

 

Et je ne vois pas pourquoi, tu appelles vl-directory-files de la même façon que les autres.

(edit2: j'y comprends plus rien :casstet: , maintenant ca marche)

 

 

(gile), patrick_35, ElpanovEvgeniy: ok,

 

Mais petits compléments:

1 - vl-directory-files appelé sur nil comme répertoire, renvoie les répertoires dans mes documents.

2 - il y a toujours "." et ".." en première et deuxième position, au premier abord, je pensais que faire

un (cddr (vl-directory-files ....)) plutot qu'un vl-remove irai plus vite, et bien non, les temps sont les mêmes. Ces vl sont vraiment très très fort :cool: [Edité le 10/9/2008 par bseb67]

 

[Edité le 10/9/2008 par bseb67]

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

ElpanovEvgeniy

Mes variantes vous sont familières...

C'est toujours un plaisir de te lire :D

 

http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=13600

J'ai la mémoire qui flanche :red:

Je dois me faire vieux ;)

 

Sinon, bravo pour la routine itérative

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité