Fraid Posté(e) le 24 avril 2012 Posté(e) le 24 avril 2012 Bonjour, Voulant simplement savoir si un string est present dans une liste quel que soit sa forme (a B ), ((a B )( c d ))... je pensait naïvement y arrivé avec cela (defun SuperMember ( str Liste / ) (setq Flag nil) (if (member str liste) (setq Flag T) (mapcar '(lambda (x) (if(SuperMember str x)(setq Flag T)) liste)) ) ) dés que j'essais avec une liste tordue genre (defun c:rocco nil (SuperMember '"g" '(("a" "b") (3 R ("g" "k"))))) erreur: nombre d'arguments insuffisants Why? Merci en relisant je m'apperçois qu'il y a des elements qui ne sont plus des listes au fur et a mesure du traitement... https://github.com/Fraiddd
(gile) Posté(e) le 25 avril 2012 Posté(e) le 25 avril 2012 Salut, (defun recMember (ele lst) (if lst (cond ((member ele lst)) ((if (atom (car lst)) (recMember ele (cdr lst)) (cond ((recMember ele (car lst))) ((recMember ele (cdr lst))) ) ) ) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
VDH-Bruno Posté(e) le 25 avril 2012 Posté(e) le 25 avril 2012 Salut,Coiffé au poteau par (gile) :angry: , je donne tout de même ma variante.. :D ;; Fonction member à toute les profondeurs ;; Arguments: ;; x un élement ;; l une liste ou tree ;; Retourne la liste restante si x est présent dans l, sinon nil ;; Exemple: ;; (super-member 'E '(B C (D (E C A) (F)))) -> (E C A) ;; (super-member 'Z '(B C (D (E C A) (F)))) -> nil (defun super-member (x l) (cond ((null l) nil) ((equal x (car l)) l) ((super-member x (if (listp (car l)) (car l)))) ((super-member x (cdr l))) ) ) A+ ------------------------------ Edit ---------------------------------------Corrigé code, remplacé : ((listp (car l)) (super-member x (car l))) par ((super-member x (if (listp (car l)) (car l)))) Apprendre => Prendre => Rendre
Dinosor Posté(e) le 25 avril 2012 Posté(e) le 25 avril 2012 Ciao tutti, Il y a des strings dans les LISPS ? Ca commence à m'intérresser... :mellow: :) :blink: :D Ok, elle est facile celle-là... Mais je n'y résiste pas. Bonne journée à tous! P.S. Sans trop de détails, c'est quoi ce STRING ? :unsure: Seuls nous allons vite, ensemble nous allons plus loin... CPU Intel 3,5Go / Nvidia RTX-3090 AutoCad (Architecture) 2022 - Lumion PRO BMW R-1200-RT, c'est moche, oui... je sais... www.neda.ch
(gile) Posté(e) le 25 avril 2012 Posté(e) le 25 avril 2012 Celle-ci devrait limiter le nombre d'appels récursifs dans certains cas : (defun recMember (ele lst) (cond ((null lst) nil) ((member ele lst)) ((recMember ele (car (setq lst (vl-member-if 'vl-consp lst))))) ((recMember ele (cdr lst))) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 25 avril 2012 Auteur Posté(e) le 25 avril 2012 Merci beaucoup je vais potasser la fonction COND...et (vl-member-if 'vl-consp lst) qui me laisse songeur... depuis que je sais me servir de MAPCAR je l'utilise bêtement systématiquement. alors qu'il y a tant de façon de faire autrement. Sinon un STRING est une variable contenant une chaîne de caractères. et pour rester dans le vocabulaire Lispien, ;; l une liste ou tree Tree veut il bien dire liste de listes ? https://github.com/Fraiddd
VDH-Bruno Posté(e) le 25 avril 2012 Posté(e) le 25 avril 2012 Tree veut il bien dire liste de listes ?Oui (vl-member-if 'vl-consp lst) qui me laisse songeur...C’est assez astucieux cela permet d’aller directement explorer la première sous liste qui suit et avancer un peu plus vite dans le traitement (ou balayage de la liste). D’ailleurs si on veut aller dans cette direction, on peut je pense tenter un (vl-remove-if-not 'vl-consp lst) avec une récursion mutuelle à voir, si j’ai 2 minutes je poserai un exemple mais là je suis trop vraiment charrette... A+ Apprendre => Prendre => Rendre
bonuscad Posté(e) le 25 avril 2012 Posté(e) le 25 avril 2012 Pour être un peu plus précis, je dirais une arborescence de liste de niveau d’imbrication différente. Pour imager le (car) pourrait être le nœud et le (cdr) la branche de l'arborescence restante. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
VDH-Bruno Posté(e) le 25 avril 2012 Posté(e) le 25 avril 2012 Re, Pour l’exemple la solution évoqué précédemment avec (vl-remove-if-not 'vl-consp lst) et des fonctions mutuellement récursives histoire d’optimiser encore un peu le traitement dans certain cas en économisant des appels à la fonction member… ;; Variante avec récursion mutuelle (defun recMember (ele lst / f1 f2) (defun f1 (lst) (cond ((member ele lst)) ((f2 (vl-remove-if-not 'vl-consp lst))) ) ) (defun f2 (lst) (cond ((null lst) nil) ((f1 (car lst))) ((f2 (cdr lst))) ) ) (f1 lst) ) A+ Apprendre => Prendre => Rendre
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant