tutorial online example clojure

online - clojure windows



Clojure-argumentos nombrados (3)

¿Clojure ha nombrado argumentos? Si es así, ¿puedes dar un pequeño ejemplo?


¿Quizás te refieres a parámetros nombrados ? Estos no están disponibles directamente, pero puede utilizar este enfoque de vectores si lo desea, que puede darle lo que desea.

En RosettaCode hay una explicación más profunda sobre cómo hacer esto usando la desestructuración.


Además de la excelente respuesta de Raynes, también hay una macro en clojure-contrib que hace la vida más fácil:

user=> (use ''[clojure.contrib.def :only [defnk]]) nil user=> (defnk foo [a b :c 8 :d 9] [a b c d]) #''user/foo user=> (foo 1 2) [1 2 8 9] user=> (foo 1 2 3) java.lang.IllegalArgumentException: No value supplied for key: 3 (NO_SOURCE_FILE:0) user=> (foo 1 2 :c 3) [1 2 3 9]


En Clojure 1.2, puede desestructurar el argumento de rest tal como lo haría con un mapa. Esto significa que puede hacer argumentos con palabras clave no posicionales. Aquí hay un ejemplo:

user> (defn blah [& {:keys [key1 key2 key3]}] (str key1 key2 key3)) #''user/blah user> (blah :key1 "Hai" :key2 " there" :key3 10) "Hai there10" user> (blah :key1 "Hai" :key2 " there") "Hai there" user> (defn blah [& {:keys [key1 key2 key3] :as everything}] everything) #''user/blah user> (blah :key1 "Hai" :key2 " there") {:key2 " there", :key1 "Hai"}

Todo lo que puede hacer mientras se desestructura un mapa Clojure se puede hacer en la lista de argumentos de una función como se muestra arriba. Incluyendo el uso de: o para definir los valores predeterminados para los argumentos como este:

user> (defn blah [& {:keys [key1 key2 key3] :or {key3 10}}] (str key1 key2 key3)) #''user/blah user> (blah :key1 "Hai" :key2 " there") "Hai there10"

Pero esto está en Clojure 1.2. Alternativamente, en versiones anteriores, puede hacer esto para simular lo mismo:

user> (defn blah [& rest] (let [{:keys [key1 key2 key3] :or {key3 10}} (apply hash-map rest)] (str key1 key2 key3))) #''user/blah user> (blah :key1 "Hai" :key2 " there") "Hai there10"

y eso funciona generalmente de la misma manera.

Y también puede tener argumentos posicionales que vienen antes de los argumentos de la palabra clave:

user> (defn blah [x y & {:keys [key1 key2 key3] :or {key3 10}}] (str x y key1 key2 key3)) #''user/blah user> (blah "x" "Y" :key1 "Hai" :key2 " there") "xYHai there10"

Estos no son opcionales y deben ser proporcionados.

En realidad, puedes desestructurar el argumento de rest como lo harías con cualquier colección de Clojure.

user> (defn blah [& [one two & more]] (str one two "and the rest: " more)) #''user/blah user> (blah 1 2 "ressssssst") "12and the rest: (/"ressssssst/")"

Puedes hacer este tipo de cosas incluso en Clojure 1.1. La desestructuración de estilo de mapa para argumentos de palabras clave solo vino en 1.2.