Bonjour à tous et à toutes,

J'ai quelques questions sur la façon dont drScheme fonctionne :

Pour commencer une relativement simple ; lors de l'appel d'une fonction purement itérative, par exemple

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
(define (iter val i)
                (if (equal? val i)
                    (display "fin iter")
                    (iter val (+ i 1))))
(iter 3 0)
à chaque fois que iter est appelé dans iter, l'environnement courant est-il détruit et un nouveau est crée (avec i = i + 1) ou est ce que ce nouvel environnement vient se mettre "en dessous" du courant ?

Deuxième question, cette fois au sujet des objets. Imaginons que j'ai une liste d'objets, et que je rajoute un élément à la liste de cette manière

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
(set! la-liste (cons (make-objet) la-liste))
imaginons qu'en suite je retire ce nouvel élément de cette façon

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
(set! la-list (cdr la-liste))
que devient l'objet créé lors de l'ajout, au moment ou je le retire de la liste ?
Est-il détruit automatiquement ou est ce qu'il est toujours en mémoire, mais inaccessible ?

Enfin, j'ai tendance :
- à utiliser des "let" lorsque je calcul qqchose dont j'aurais besoin plus d'une fois dans mon code
- à définir dans des fonctions, par nature itératives (prenant un paramètre qui ne change pas), une fonction qui elle sera réellement itérative qui ne prend pas ce paramètre constant

Ai-je raison de faire ainsi ? (dans les 2 cas j'ai vraiment envi de dire oui!)

exemple pour les 2

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
;;usage de let, au lieu de recalculer à chaque fois "new-val"

(let ((new-val (+ (get-val) 1)))
          ...
         (fct1 new-val)
          ...
         (fct2 new-val)
          ...)

;; je reprend l'exemple de la fonction itérative défini plus haut, que je modifie ;;de cette façon

(define (iter val i)
   (define (vrai-iter i)
       (if (equal? val i)
           (display "iter fini")
           (vrai-iter (+ i 1))))
   (vrai-iter i))

(iter 3 0)

Merci d'avance pour vos réponses !