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.