< Back to IRCAM Forum

Liste, prédicat

Bonjour,

Il existe un prédicat renvoyant t si l’objet testé est une liste de quoique soit : listp.

Comment tester la profondeur de la liste (liste, liste de liste, liste de listes de listes etc…) ?

J’aimerais un prédicat qui me renvoie t si c’est une liste simple, et nil s’il y a des sous-listes. Un autre qui me renvoie t si c’est une liste de listes, et nil pour les autres cas etc.

Merci par avance,

Lisa

Chere Lisa,

Voila. Code a mettre dans le dossier init:
all-atom-list.lisp (766 Bytes)

Exemple:

Screenshot_2021-04-30_20-32-08

Bien a toi.

K

Merci beaucoup pour la réponse rapide.

Bien que ce code puisse m’être utile, il ne me permet pas de tester ce que je souhaite, à savoir le degré de profondeur d’une liste.

Par exemple : la liste est-elle sous cette forme (a b) ? ou sous cette forme ((a b) (c d)) ? ou encore (((a b) (c d)) ((e f) (g h))) ? L’outils flat permet de passer à un ordre supérieur.

Pour être plus claire, j’aimerais tester si une liste est un accord (liste de midic), une liste d’accords (liste de lmidc), une liste de liste d’accords (liste de liste de lmidic) etc.

Merci et à plus tard,

Lisa

Avec pour chaque degré de profondeur de la liste, l’objet pour le tester.

un objet pour tester si la profondeur de la liste est de degré 0, et qui renvoie t ou nil.
un autre pour tester si la profondeur de la liste est de degré 1, et qui renvoie t ou nil.
etc.

ou alors, un objet qui donne le degré de profondeur d’une liste : 0, 1, 2 etc…

dans ce cas je pourrai tester ce nombre avec om=

en espérant être claire mais si je n’emploie peut-être pas les bons termes du langage lisp

Bonne soirée,

Lisa

En effet,

Si vous pouvez mieux décrire votre objectif, cela serait plus efficace. En somme, Est-ce que vous cherchez, non pas un prédicat, mais plutôt un algorithme vous donnant le niveau le plus profond d’une sous-liste inclue dans la liste, tout en sachant qu’une liste de liste (un arbre) pourrait bien être hétérogène au niveau de ses feuilles comme le sont les arbres rythmiques.

K

Je pensais d’abord à un prédicat et j’ai ensuite pensé à l’algorithme, donnant en effet le niveau le plus profond d’une sous-liste inclue dans une liste, dans le cas d’un arbre homogène car c’est pour tester des lmidic, liste de lmidic, liste de listes lmidic etc.
Par exemple si je rentre (6000 6400) l’algorithme me donnerait 1.
SI je rentre ((6000 6400) (7000 7600)) me donnerait 2, (((6000 6400) (7000 7600)) ((6600 6900) (8100 8400))), 3, etc…

Dear Lisa

Here a recursive code to find the list/tree depth:

(defun treedepth (tree)
(if (atom tree) 0
(1+ (reduce #'max (mapcar #'treedepth tree)))))

(the lisp file):
treedeepth.lisp (116 Bytes)

Best
K

Super merci beaucoup, pourvoir tester la profondeur d’une liste homogène me simplifie la vie en rendant des patchs “universels”, cad capables de traiter aussi bien les accords que les séquences d’accords ou encore les séquences de progressions harmoniques.

Dans un second temp il faudra que j’apprenne le langage lisp pour coder moi-même ces petits outils…

À bientôt !

Lisa