Envoyé par
Kurodiam
Merci pour ton aide !
En fait , je viens de trouver le même résultat que toi en relisant mon cours , j'ai compris comment compter les espaces adéquats et les arguments de cons et surtout au début , j'ai complétement oublié l'expression classique
Je suis curieux: qu'appelles-tu "expression classique"?
En revanche , notre professeur nous demande d'apprendre à compter nous-même au lieu d'utiliser un éditeur .
ça peut toujours servir de savoir compter les parenthèses, mais ça se discute...
Parmi les milliers (millions?) de lignes de lisp que j'ai écrites, je ne me souviens pas ne pas avoir utilisé un éditeur "intelligent" (sauf peut-être sur des forums (comme celui-ci) avec du code non testé (ce que j'évite la plupart du temps!)).
Du coup, mon code est TOUJOURS indenté par l'éditeur, ce qui me permet de le lire et de le vérifier facilement et de manière certaine!
Le seul cas où je pourrais avoir besoin de compter à la main (ou à l'oeil) serait celui ou une ligne contiendrait beaucoup de niveaux, comme justement:
(loop (cond ((not seau) (return seau))) (pop seau))
Dans ce cas, je peux quand même utiliser l'éditeur en plaçant le curseur après une parenthèse fermante pour voir l'ouvrante correspondante en surbrillance. De plus, j'utilise aussi le module eldoc d'emacs qui affiche en bas de la fenêtre les arguments de la fonction courante avec, en gras, le nom de l'argument attendu à la place du curseur.
Cependant, ce code reste difficile à lire (au moins pour moi!). C'est pourquoi je le découperais et le ferais réindenter par l'éditeur afin d'obtenir:
1 2 3 4
| (loop
(cond
((not seau) (return seau)))
(pop seau)) |
De cette manière, je vois clairement la structure de cette instruction: une "loop" avec un "cond" à une clause et un "pop".
En faisant cet exercice , je saisis qu'il faut toujours garder en tête l'expression classique et compter les parenthèses ouvrantes/fermantes.
Par exemple :
1 2 3 4 5
| (cons # c'est le deuxième argument de cons = 1 et il est aligné avec le cons 2 .
(cons
'pop
(cons 'seau nil) ) # la parenthèse est collée car elle ferme la ligne .
nil ) ) ) ) # la parenthèse est décollée car elle ferme un niveau . |
Je me souviens avoir utilisé la technique des espaces avant les parenthèses pour distinguer les parenthèses fermantes de la ligne des parenthèses fermantes des lignes précédentes, mais je l'ai rapidement abandonnée car c'est trop de boulot lorsqu'on coupe une ligne qui ne l'était préalablement pas, comme justement la transformation de l'instruction "loop" précédente (qui passe de 1 ligne à 3 ou 4)!
Sinon, as-tu essayé de lire tranquillement le pseudo-code que j'ai donné précédemment:
1 2 3 4
| Pour obtenir le get-cons d'un x
Si x est nil, on retourne nil.
Si x n'est pas un cons, on le quote (c-à-d on retourne une liste à 2 éléments, le symbole QUOTE et x).
Si x est un cons, on retourne une liste contenant 3 éléments: le symbole CONS, le get-cons de (car x), et le get-cons de (cdr x). |
Partager