27 votes

Fonctionnalités cachées de Clojure

Qui moins connus mais des fonctionnalités utiles de Clojure trouvez-vous vous-mêmes à l'aide? N'hésitez pas à partager avec vous quelques petits trucs et des idiomes, mais essayez de limiter vous-mêmes à la Base et Contrib.

Je l'ai trouvé vraiment intéressant de l'information dans les réponses à ces questions similaires:

Il y a beaucoup plus de "fonctionnalité Cachée" des questions pour d'autres langues, donc j'ai pensé qu'il serait agréable d'en avoir un pour Clojure, trop.

24voto

Brian Carper Points 40078

Clojure possède un type de données de file d'attente persistante immuable, PersistentQueue, mais il n'a pas (encore?) De syntaxe de lecteur littérale ou de fonctions d'encapsuleur Clojure, vous devez donc en créer un via un appel Java. Files d'attente conj (push) sur l'arrière et pop de l'avant avec de bonnes performances.

 user> (-> (clojure.lang.PersistentQueue/EMPTY)
          (conj 1 2 3)
          pop)
(2 3)
 

Les listes se conjuguent sur le devant et ressortent par le devant. Les vecteurs se rejoignent à l'arrière et ressortent par l'arrière. Les files d'attente sont donc parfois exactement ce dont vous avez besoin.

 user> (-> ()
          (conj 1 2 3)
          pop)
(2 1)
user> (-> []
          (conj 1 2 3)
          pop)
[1 2]
 

13voto

dnolen Points 12833
(defn foo [a & [b c]] ...)

Vous pouvez se déstructurent le reste de l'argument.

Mise à jour:

Le dernier commit vers le repo git (29389970bcd41998359681d9a4a20ee391a1e07c), il est possible d'effectuer associatif déstructuration de la sorte:

(defn foo [a & {b :b c :c}] ...)

L'utilisation évidente de ce qui est pour le mot-clé arguments. Notez que cette approche empêche de mélanger des mots clés les arguments avec le reste des arguments (pas que c'est quelque chose que l'on pourrait avoir besoin très souvent).

(defn foo [a & {:keys [b c] :or {b "val1" c "val2"}] ...)

Si vous voulez des valeurs par défaut pour le mot-clé arguments.

12voto

Arthur Ulfeldt Points 45059

La macro du lecteur de lecture-évaluation: #=

 (read-string "#=(println \"hello\")")
 

Cette macro peut présenter un risque de sécurité si read est utilisé sur l'entrée utilisateur (ce qui est peut-être une mauvaise idée en soi). Vous pouvez désactiver cette macro en définissant *read-eval* sur false .

8voto

Rafał Dowgird Points 16600

Vous pouvez apply fonctions à des séquences d'arguments infinies. Par exemple

 (apply concat (repeat '(1 2 3)))
 

produit une séquence paresseuse de 1,2,3,1,2,3 ... Bien sûr, pour que cela fonctionne, la fonction doit également être paresseuse par rapport à sa liste d'arguments.

7voto

Alex Stoddard Points 5300

Du site ClojureDocs de plus en plus bon, un idiome utilisant juxt http://clojuredocs.org/clojure_core/clojure.core/juxt%


;juxt is useful for forking result data to multiple termination functions
(->> "some text to print and save to a file"
  ((juxt
     println
     (partial  spit "useful information.txt"))))

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