7
votes

À Clojure est une liste vide une séquence de nulls infinis?

J'apprends le concept de la séquence et nil dans le clojure. C'était le résultat d'une petite expérimentation. xxx

Cela signifie-t-il que "() est en fait une séquence de nules?


0 commentaires

5 Réponses :


1
votes

Apprendre également la clojure.

pour vide Séquences , REST Retourne une séquence pour laquelle SEQ renvoie nil .

C'est pourquoi vous obtenez ce comportement.

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 ...


0 commentaires

4
votes

d'abord et repos sont des fonctions qui s'appliquent à une structure logique (A SEQ ) et non sur la structure des inconvénients liés d'une liste ( comme dans d'autres LISP).

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.

http://clojure.org/francements

Le comportement résulte de la définition de la fonction et non déterminée par la structure primitive des données.


0 commentaires

0
votes

techniquement oui 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 laquelle elle est auto peut avoir un (repos)

Cette sortie est trompeuse par la manière suivante: < / p> xxx

le premier "() dans ceci est la liste vide .
Le Secong () Dans Ceci est la séquence vide .
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.


0 commentaires

10
votes

Si vous souhaitez tester si le "repos" d'une collection est vide, utilisez Suivant . xxx

"Nil-Punning" (traiter une collection vide / SEQ et nil 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.


4 commentaires

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) .


@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))



2
votes

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> xxx pré>

Ils ont des nombres différents d'éléments: p> xxx pré>

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
  • '() est une collection forte> (une liste persistante), pas une séquence. Cependant, il est séquentiel, vous pouvez donc appeler SEQ dessus pour la convertir en séquence.
  • nil est la séquence vide forte> - donc donc (SEQ '()) code> retourne nil, de même que (SEQ (SEQ (SEQ (SEQ (SEQ (SEQ (SEQ (SEQ (SEQ (SEC (SEC))) Code> li>
  • Premier retourne nil sur une séquence vide forte> - par conséquent pourquoi (premier (reste '())) code> est nul. li> ul> p>


0 commentaires