2 votes

Clojure. Vecteurs et listes. cons et peek

Je suis un noob de Clojure. Je m'amuse avec des listes et des vecteurs.

> (peek [1 2 3 4])
4
> (peek '(1 2 3 4))
1

Fonctionne comme promis. Tout comme cela.

> (cons 1 [2 3 4])
(1 2 3 4)
> (cons 1 '(2 3 4))
(1 2 3 4)

J'ai essayé au hasard d'utiliser coup d'œil sur le résultat de contre :

> (peek (cons 1 [2 3 4]))
ClassCastException clojure.lang.Cons cannot be cast to clojure.lang.IPersistentStack  clojure.lang.RT.peek (RT.java:724)

Que se passe-t-il ?

2voto

uKolka Points 2590

En jouant, j'ai découvert que cons ne renvoie pas une séquence comme il le prétend. Je pense qu'il renvoie une séquence paresseuse parce que :

> (type (cons 1 [2 3 4]))
clojure.lang.Cons

J'ai trouvé cette façon de le réaliser

> (peek (into [] (cons 1 '(2 3 4))))
4

1voto

Thumbnail Points 2615

Concernant votre réponse :

En jouant, j'ai trouvé que cons ne retourne pas simplement une séquence comme il le prétend.

Oui, c'est vrai : cons renvoie toujours une séquence :

  • cons renvoie un clojure.lang.Cons ,
  • qui prolonge ASeq ,
  • qui met en œuvre ISeq .

Je pense qu'il renvoie une séquence paresseuse ...

A Cons n'est jamais une séquence paresseuse. Elle peut être enveloppée dans une séquence paresseuse. Sa queue peut être une séquence paresseuse. Mais elle, elle-même, n'est pas une séquence paresseuse.


En ce qui concerne votre question :

peek ne fonctionne pas sur cons parce que peek nécessite un IPersistentStack : une interface qui Cons n'est pas mis en œuvre. D'après ce que je vois, c'est bien possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X