Quelqu'un peut-il m'aider à décomposer exactement l'ordre d'exécution des versions suivantes d'aplatissement? J'utilise Racket.Racket/Scheme Flatten Explications
version 1, est à partir de la raquette elle-même, tandis que la version deux est plus commun? la mise en oeuvre.
(define (flatten1 list)
(let loop ([l list] [acc null])
(printf "l = ~a acc = ~a\n" l acc)
(cond [(null? l) acc]
[(pair? l) (loop (car l) (loop (cdr l) acc))]
[else (cons l acc)])))
(define (flatten2 l)
(printf "l = ~a\n" l)
(cond [(null? l) null]
[(atom? l) (list l)]
[else (append (flatten2 (car l)) (flatten2 (cdr l)))]))
Maintenant, exécutant le premier exemple avec « (1 2 3) produit:
l = (1 2 3) acc =()
l = (2 3) acc =()
l = (3) acc =()
l =() acc =()
l = 3 acc =()
l = 2 acc = (3)
l = 1 acc = (2 3)
'(1 2 3)
tandis que le second produit:
l = (1 2 3)
l = 1
l = (2 3)
l = 2
l = (3)
l = 3
l =()
'(1 2 3)
L'ordre d'exécution semble différent. Dans le premier exemple, il semble que la seconde boucle (loop (cdr l) acc)
tire avant la première boucle puisque '(2 3) est en train d'imprimer tout de suite. Alors que dans le deuxième exemple, 1 s'imprime avant le '(2 3), ce qui semble être le premier appel à aplatir à l'intérieur d'append est évalué en premier.
Je passe par le Little Schemer mais ce sont des exemples plus difficiles sur lesquels je pourrais vraiment utiliser de l'aide.
Merci beaucoup.
Merci. Mais pourquoi (loop (cdr l)) tire-t-il avant (loop (car l)) dans l'exemple un, alors que (flatten2 (car l)) se déclenche avant (flatten2 (cdr l)) dans l'exemple 2? – Scott
Donc, dans 'flatten1',' cdr' passe avant 'car' pour la raison que j'ai décrite: la liste des accumulateurs est construite de droite à gauche. Dans 'flatten2', l'ordre n'a pas d'importance, mais Racket utilise toujours l'ordre de gauche à droite lors de l'évaluation des expressions, c'est pourquoi vous voyez' car' avant 'cdr' ici. –
Ok, merci. Donc, dans Racket, les listes (contre) sont construites de droite à gauche mais les expressions sont évaluées de gauche à droite. Qui aide. – Scott