Il s'agit d'un suivi de ma question précédente : Pourquoi avons-nous besoin de zéro ? Il est clair que les listes appropriées sont utilisées la plupart du temps. Mais quel est l'objectif d'une liste impropre ?
Réponses
Trop de publicités?Sans aucune raison valable. La seule chose pour laquelle les listes impropres sont vraiment utiles est une partie de la syntaxe des listes d'association - et même là, une syntaxe personnalisée pour les paires clé-valeur serait meilleure. Toutes les utilisations auxquelles vous pouvez penser pour les listes impropres peuvent être mieux implémentées avec des types d'enregistrement - qui, après tout, subsument les listes : vous pouvez définir des listes Lisp en termes d'enregistrements, mais pas l'inverse (parce que les listes ne vous permettent pas de définir des structures de données dont le type est disjoint de tous les autres types du langage).
L'utilisation abusive des paires et des listes pour représenter tous les types de données est ce que j'aime appeler La maladie du programmeur Lisp et c'est une véritable honte que tant de partisans de Lisp le défendent. J'ai dû nettoyer ce genre de choses bien trop souvent.
Grande question ! (Enfin, j'aime bien la réécriture de Chris, en tout cas...). D'après mon expérience, l'utilisation la plus courante des listes impropres est celle de structures légères à deux éléments.
Le raisonnement est le suivant : "Mince, j'ai besoin d'une structure à deux éléments. Ooh, attendez, pourquoi ne pas simplement utiliser 'cons' ? C'est intégré, et c'est vraiment bien supporté par la syntaxe de citation intégrée. Et puis zut, je vais le faire".
En particulier, les opérations intégrées telles que "assoc" sont souvent implémentées d'une manière qui suppose qu'on lui donne une liste de listes impropres à deux éléments.
L'existence de la liste impropre est une conséquence naturelle de l'existence des blocs de construction fondamentaux. cons
, car
y cdr
. C'est au cœur de lisp que ces trois éléments constituent la base de toutes sortes de types de données plus complexes. D'une manière ou d'une autre, isoler la liste impropre pour la bannir nécessiterait d'imposer des restrictions arbitraires.
Une "liste impropre" est un terme vague désignant tout type de données autre qu'une liste construite à l'aide de la fonction cons
.
Un exemple, comme le dit John, est d'utiliser cons
de la même manière qu'on peut utiliser des tuples en ML.
Un autre exemple est celui de la variation des listes. Par exemple, on peut définir un flux comme suit :
;; A Stream-of-X is one of
;; - null, ie '()
;; - (cons X Stream-of-X)
;; - a procedure taking no arguments and returning a Stream-of-X result
;; nats-from : nat -> Stream-of-nat
(define (nats-from n)
(cons n (lambda () (nats-from (+ n 1)))))