J'apprends le concept de la séquence code> code> et Cela signifie-t-il que "() est en fait une séquence de nules? p> p> nil code> dans le clojure. C'était le résultat d'une petite expérimentation.
5 Réponses :
Apprendre également la clojure. P>
pour vide Séquences , C'est pourquoi vous obtenez ce comportement. P>
Je suppose que cela consiste à simplifier le recours sur des séquences jusqu'à ce qu'ils soient vides, et probablement d'autres raisons de Smartypants ... P> REST CODE> Retourne une séquence pour laquelle SEQ code> renvoie nil code>. p>
Clojure Définit de nombreux algorithmes en termes de séquences (SEQS). Une SEQ est une liste logique et contrairement à la plupart des LISP où la liste est représentée par une structure en béton à 2 emplacements, CLOJURE utilise l'interface ISEQ pour permettre de nombreuses structures de données afin de fournir un accès à leurs éléments comme séquences. P>
http://clojure.org/francements P>
blockQuote>
Le comportement résulte de la définition de la fonction et non déterminée par la structure primitive des données. P> d'abord code> et repos code> sont des fonctions qui s'appliquent à une structure logique (A SEQ code>) et non sur la structure des inconvénients liés d'une liste ( comme dans d'autres LISP). p>
techniquement oui b> mais pas de manière utile.
"La séquence qui est créée en appelant (SEQ '(SEQ' ()) a un nombre infini de nulls?"
La réponse est oui parce que le (repos) d'une séquence vide est une séquence vide B> laquelle elle est auto peut avoir un (repos) p>
Cette sortie est trompeuse par la manière suivante: < / p> le premier "() dans ceci est la liste vide b>.
Le Secong () Dans Ceci est la séquence vide B>.
Les séquences sont imprimées de la même manière que les listes de la part, même si elles ne sont pas identiques. p> p>
Si vous souhaitez tester si le "repos" d'une collection est vide, utilisez "Nil-Punning" (traiter une collection vide / SEQ et Suivant code>. nil code> comme la même chose) a été supprimé l'année dernière en faveur des séquences entièrement paresseuses. Voir ici pour une discussion menant à ce changement. p> p>
Lorsque j'écris des clauses Cond pour se reproduire dans une séquence, mon premier chèque est généralement (vide? Obj). Est-ce la bonne façon de se reproduire dans le clojure?
Je pense généralement que les gens testent (SEQ Obj) plutôt que (vide? Obj) code>.
@Briancarper pourquoi? Y a-t-il un différent significatif entre les deux expressions?
@WRONGUSERNAME - C'est surtout la convention, mais (SEQ X) est plus courte que l'équivalent (non (vide? x))
non fort> - une liste vide n'est pas la même qu'une séquence infinie de nils Ceci est relativement facile à afficher. Supposons que nous ayons: p> Ils ont des nombres différents d'éléments: p> prenant d'eux: p> xxx pré> Si vous appelez SEQ sur eux, vous obtenez P> (seq inifinite-nils) => sequence of infinite nils
(seq empty-list) => nil
(SEQ '()) code> retourne nil, de même que (SEQ (SEQ (SEQ (SEQ (SEQ (SEQ (SEQ (SEQ (SEQ (SEC (SEC))) Code> li>
(premier (reste '())) code> est nul. li>
ul> p>