Aller au contenu

[Résolu] Problème avec MapCar


DenisHen

Messages recommandés

Bonjour à toutes et à tous.

 

Aujourd'hui, je me lance avec un mapcar pour traiter tout les éléments d'une liste.

 

Cette liste contient des nom de fichier, évidement, ces éléments ont leur nom complet, avec l’extension. J'aimerais supprimer cette extension.

 

Pour ce faire, j'ai écris ça, qui ne fonctionne pas.

(setq ListBlk (mapcar (substr ListFich 1 (- (strlen ListFich) 4)) ListFich))

 

C'est la deuxième fois que j'essai d'utiliser mapcar, mais cette fonction reste très complexe pour moi.

 

Si quelqu'un a une astuce, un conseil, je suis preneur...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

En fait, il faut introduire un (lambda dans la formule...

 

Ce qui donne :

(setq ListBlk (mapcar '(lambda (ListFich) (substr ListFich 1 (- (strlen ListFich) 4))) ListFich))

 

Bonne journée à tous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

La fonction (lambda) est équivalent à la fonction (defun), la seule différence entre ces deux fonctions, c'est le fait que defun permet de nommer la définition de fonction (ce que (lambda) ne fait pas donc à usage unique).

La fonction (mapcar) permet d'appliquer une fonction pour chaque élément d'une liste donnée. De manière générale, on utilise très souvent la fonction (lambda) car on souhaite effectuer des choses parfois complexes avec (mapcar). Mais il est également possible que la fonction utilisée soit une fonction ne possédant qu'un unique argument.

 

Ex : (mapcar 'car '((0 . "LWPOLYLINE")(8 . "Calque1"))) renvoie (0 8).

 

Donc pour les fonctions ne possèdant qu'un seul argument, on peut les utiliser directement, sinon on passe toujours par (lambda) pour les fonctions nécessitant plusieurs arguments (ou plusieurs fonctions d'affilés).

 

Ici, ta liste se nomme ListFich donc pour éviter toute confusion, je te conseille de prendre un nom d'argument différent pour ta fonction (lambda). Cela t'évitera des problèmes à l'avenir :3

Ensuite, n'existe-t-il pas des extensions possédant plus de 3 caractères ? (je pense à ".xlsm" par exemple)

Auquel cas, il serait préférable de récupérer la position du dernier "." de la chaîne de caractères (les fichiers peuvent comporter des "." dans leur nom).

 

Bisous,

Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Luna.

 

Merci pour ces précisions, elles me servirons certainement... ;)

 

Amicalement.

 

Denis.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Pour bien débuter avec mapcar je t’invite à lire ou à relire ce post :

https://cadxp.com/topic/28642-arguments-et-variables/page__view__findpost__p__156098

Tu y trouveras une excellente et intelligible explication de (gile).

 

Au sujet des extensions de nom de fichier, historiquement dans les premières versions de Windows elles étaient limité à 3 caractères car elles reprenaient le standard utilisé sous IBM CMS qui limitait les noms de fichiers à 8 caractères et 3 caractères pour l’extension (on parlait de "système 8+3").

Depuis les choses ont bien évoluer, suffit de penser aux fichiers .jpeg .docx .html .xlsx etc.…

La suggestion de ne pas te limité à 3 caractères formulé par Luna est selon moi une bien meilleure approche.

 

Cdt Bruno

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Bonjour (gile)

Hé oui vl-filename-base ;) , comme quoi le LISP contrairement au vélo quant on pratique plus on oublie (même les fonctions les plus élémentaire...)

Parfois c'est dur de s'apercevoir que l'on est passé à coté d'une évidence laugh.gif

Salutations Bruno

Apprendre => Prendre => Rendre

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous, et merci pour votre aide.

 

Ma liste de fichiers, je l'ai construite ainsi :

  (setq Prefix "Arr")
 ....
 ....
 (setq RepBLK "E:\\DenCad\\Bloc\\Blocs_Charte\\")
 (setq ListFich (vl-directory-files RepBLK (strcat Prefix "*.dwg")))

Il y avait donc toutes les extensions.

 

Et merci encore.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

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é