2017-06-29 2 views
5

J'apprends Clojure et a été lu sur doseq quand j'ai remarqué un exemple comme ci-dessous sur le official Clojure doc pour doseqComprendre la syntaxe de liaison Clojure

(doseq [x [-1 0 1] 
     y [1 2 3]] 
    (prn (* x y))) 

Ma confusion est l'expression [x [-1 0 1] y [1 2 3]].

Est-ce que cela signifie une expression de liaison ? J'ai essayé une certaine quantité de recherche de google mais n'ai pas pu trouver n'importe quelle documentation qui décrit un tel formulaire.

Quelqu'un pourrait m'aider à comprendre les différentes représentations syntaxiques pour les formes de liaison dans Clojure?

+2

clojuredocs. org n'est en aucun cas une source officielle de documentation clojure. Ce sont des exemples de qualité variable fournis par les utilisateurs. La seule chose officielle sur cette page est docstring 'doseq', qui vous dit de lire la docstring de' for' pour apprendre comment cela fonctionne. Je suis d'accord qu'il serait mieux si 'doseq' avait sa propre documentation complète, mais au moins il vous indique la bonne chose à lire. – amalloy

Répondre

8

Il s'agit d'un "binding form"" qui "lie" les valeurs de l'expression au nom x, ce qui signifie familièrement une expression qui lie les noms aux valeurs. Le terme "binding" au lieu de "setting" permet de faire la différence entre ce que cela fait et la définition des variables dans d'autres langages de programmation. à la valeur du temps nécessaire à l'exécution du formulaire à l'intérieur du doseq, le nom est libéré pour être joint à une autre valeur

Clojure offre une liaison structurelle arbitraire de donner des noms à une partie quelconque d'une valeur dans la plupart des endroits dans la langue qui attribuent des noms (symboles bind)

(doseq [[x1 x2] [[-1 -1] [0 0] [1 1]] 
     y [1 2 3]] 
    (prn (* x1 x2 y))) 

est aussi une expression de liaison si elle semble un peu plus profondément dans les données et ayants droit noms à deux valeurs par élément dans le premier vecteur (et suppose qu'il y a deux nombres dans chacun d'eux) J'aime beaucoup this tutorial on destructuring/binding

+0

vrai, je vais le changer à la séquence de séquences avec au moins deux chiffres " –

+0

Merci pour cette explication détaillée.Il aide! –

2

C'est comme une boucle imbriquée en Java. Vous pouvez également faire l'imbrication « manuellement »:

(dotest 
    (newline) 
    (println "version 1") 
    (doseq [x [1 2] 
      y [:a :b :c]] 
    (println x y)) 

    (newline) 
    (println "version 2") 
    (doseq [x [1 2]] 
    (doseq [y [:a :b :c]] 
     (println x y)))) 

with results: 
version 1 
1 :a 
1 :b 
1 :c 
2 :a 
2 :b 
2 :c 

version 2 
1 :a 
1 :b 
1 :c 
2 :a 
2 :b 
2 :c 

Notez que doseq retourne toujours nil, et est seulement bon pour générer des effets secondaires (comme l'impression à l'écran).

Une expression for se comporte de manière similaire, mais renvoie une séquence de valeurs (paresseux) (noter que nous produisons un vecteur [x y] sur chaque boucle):

(newline) 
(println "For generates a (lazy) sequence:" 
    (for [x [1 2] 
     y [:a :b :c]] 
    [x y])) 

avec le résultat:

For generates a (lazy) sequence: ([1 :a] [1 :b] [1 :c] [2 :a] [2 :b] [2 :c]) 
+0

+ 1 pour dépeindre des formes alternatives.Cependant, le poste ne répond pas vraiment à ma question.Je suis actuellement plus préoccupé par la syntaxe de liaison clojure que d'autres formes puisque j'apprends la langue et la compréhension de la syntaxe à ce stade est ma priorité. –