# define a procedure 'flatten' that takes a list 'sequence'
(define (flatten sequence)
# if the 'sequence' is empty, return an empty list
(cond ((null? sequence) (list))
# if the first element of 'sequence' is itself a list, return a new list
# made by appending the flattened first element of 'sequence' with the
# flattened rest of the 'sequence'
((list? (car sequence))
(append (flatten (car sequence))
(flatten (cdr sequence))))
# if the first element of 'sequence' is not a list, return a new list
# made by cons-ing that element with the flattened rest of the 'sequence'
(else
(cons (car sequence)
(flatten (cdr sequence))))))
I assez préimprimés il (inséré quelques nouvelles lignes et en retrait le code pour montrer sa structure) et également remplacé '()
avec (list)
(qui a la même valeur) juste pour empêcher le code d'être mis en évidence de manière incorrecte .
+1 ce qui est contre? J'apprécierais que vous expliquiez d'autres mots-clés. merci
Quand je dis par contre je me réfère simplement à la procédure cons
. Quand vous voyez (cons <expression> <list>)
où <expression>
est une expression Scheme ou de la valeur et <list>
est une expression Scheme qui évalue à une liste, cons
renverra le <list>
avec la valeur de la <expression>
clouée sur le devant. Par exemple, (cons 1 (list 2 3 4))
renvoie la liste (list 1 2 3 4)
. En fait, (list 1 2 3 4)
dans Scheme est juste un court chemin d'écriture . Les deux autres mots que vous pourriez rencontrer sont car
et cdr
. Vous pouvez penser (car <list>)
comme signifiant le premier élément ou tête du <list>
et (cdr <list>)
comme signifiant le reste des éléments ou queue du <list>
. Par exemple, (car (list 1 2 3 4))
renvoie la valeur 1
et (cdr (list 1 2 3 4))
renvoie la liste (list 2 3 4)
.
Si vous avez besoin d'aide avec d'autres mots clés, faites le moi savoir.
me manque Scheme de mes jours de collège – Martin