Aller au contenu

Messages recommandés

Posté(e)

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...

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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 ?

Posté(e)
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

Posté(e)

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

Posté(e)

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

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é