common lisp cons crée une liste à partir de deux symboles, clojure cons nécessite une suite vers cons ?

StackOverflow https://stackoverflow.com/questions/3222789

Question

(Avertissement - je suis conscient de l'importance des Seqs dans Clojure)

En Common Lisp, la fonction cons peut être utilisée pour combiner deux symboles dans une liste :

(def s 'x)
(def l 'y)
(cons s l)

En clojure - vous ne pouvez contrer que sur une séquence - les contres n'ont pas été étendus pour fonctionner avec deux symboles.Il faut donc écrire :

(def s 'x)
(def l 'y)
(cons s '(l))

Existe-t-il un modèle de niveau supérieur dans Clojure qui explique cette différence entre Common LISP et Clojure ?

Était-ce utile?

La solution

Dans Clojure, contrairement aux Lisps traditionnels, les listes ne sont pas les principales structures de données.Les structures de données peuvent implémenter le ISéq interface - qui est une autre vue de la structure de données qui lui est donnée - permettant aux mêmes fonctions d'accéder aux éléments de chacun.(Les listes implémentent déjà cela. seq? vérifie si quelque chose est implémenté ISéq.(seq? '(1 2)), (seq? [1 2])) Clojure agit simplement différemment (avec raison), en ce sens que lorsque cons est utilisée, une séquence (elle est en fait de type clojure.lang.Cons) construit de a et (seq b) est retourné.(a étant arg 1 et b arg 2) De toute évidence, les symboles ne sont pas et ne peuvent pas être implémentés ISéq.

Clojure.org/sequences

Séquences screencast/talk de Rich Hickey Notez cependant que rest a changé, et son comportement précédent est maintenant en vigueur next, et cela lazy-cons a été remplacé par lazy-seq et cons.

clojure.lang.RT

Autres conseils

Dans les inconvénients du LISP communs crée une cellule dite de contre, qui est similaire à un enregistrement avec deux emplacements: la «voiture» et le «CDR».

Vous pouvez mettre n'importe quoi dans ces deux emplacements d'une cellule de client.

Les cellules de contre sont utilisées pour créer des listes.Mais on peut créer toutes sortes de structures de données avec des cellules des consex: arbres, graphiques, différents types de listes spécialisées, ...

Les implémentations de LISP sont hautement optimisées pour fournir des cellules de contre de très efficaces.

Une liste Lisp n'est qu'une manière courante d'utiliser des cellules contre (voir Description de Rainer).Clojure est mieux considéré comme n'ayant pas de cellules contre (bien que quelque chose de similaire puisse se cacher sous le capot).Le Clojure cons est un terme inapproprié, il devrait en fait simplement être nommé prepend.

Dans Clojure, l'utilisation d'un vecteur à deux éléments est préférée : [:a :b].Sous le capot, ces petits vecteurs sont implémentés sous forme de tableaux Java et sont extrêmement simples et rapides.

Une main courte pour (cons :a '(:b)) (ou (cons :a (cons :b nil))) est list: (list :a :b).

Quand tu dis

> (cons 'a 'b)

en Common Lisp, vous n'obtenez pas une liste mais une paire de points : (a . b), alors que le résultat de

> (cons 'a (cons 'b nil))

est la paire de points (a . ( b . nil)).

Dans la première liste, le cdr() ce n'est pas une liste, puisque c'est ici b et pas nil, ce qui en fait une liste inappropriée.Les listes appropriées doivent être terminées par nil.Par conséquent, des fonctions d’ordre supérieur comme mapcar() et les amis ne travailleront pas, mais on sauve une contre-cellule.Je suppose que les concepteurs de Clojure ont supprimé cette fonctionnalité en raison de la confusion qu'elle pourrait provoquer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top