2 votes

Créer une liste d'entrées non nulles

Disons que j'ai une fonction comme celle-ci :

(defn my-f [a & [b]]
   (if (nil? b)
      (my-other-f a)
      (my-other-f a b)))

Il s'agit bien sûr d'une simplification. Il s'agit d'une fonction enveloppante pour une autre fonction - et en réalité, a est traité à l'intérieur de cette fonction. Si l'argument optionnel b n'est pas transmis à ma-f, il ne doit pas non plus être transmis à ma-autre-f.

Je pensais à un autre moyen d'y parvenir :

(defn my-f [a & [b]]
   (apply my-other-f (make-list-of-not-nil-entries a b)))

Existe-t-il une fonction intégrée pour effectuer cette tâche ?


Exemple

Parfois, le fait d'être trop abstrait est source de confusion, c'est pourquoi je présente ici un cas concret. Le code ClojureScript suivant fonctionne, son but est évidemment d'essayer différentes options spécifiques au navigateur afin d'obtenir un contexte "webgl" à partir d'un élément HTML canvas.

(defn create-ctx [canvas & [options]]
  (some (if options
          #(.getContext canvas % (clj->js options))
          #(.getContext canvas %))
        ["webgl" "experimental-webgl" "webkit-3d" "moz-webgl"]))

La méthode getContext de l'élément Canvas donné attend actuellement un argument, et un autre qui est facultatif. Les fonctions enveloppantes ci-dessus ont la même arité.

Je voulais juste savoir s'il existait un moyen rapide d'éviter la commutation explicite pour l'appel de fonction d'arité 1 et 2.

3voto

Piotr Bzdyl Points 11

Je dirais que votre première solution est beaucoup plus lisible et explicite quant à son intention. Elle sera également beaucoup plus performante que la solution avec apply .

Si vous souhaitez toujours opter pour apply la solution la plus courte en utilisant clojure.core serait :

(remove nil? [a b]) 

Ou

(keep identity [a b]) 

Ou

(filter some? [a b]) 

Je n'ai pas connaissance d'une fonction intégrée qui prend des varargs et renvoie une suite d'éléments non nuls. Vous pourriez en créer une :

(defn non-nils [& args] 
  (remove nil? args) 

Ou utiliser ignoring-nils de flatland.useful.fn .

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