3 ответов:
в Clojure 1.2, вы можете уничтожить
restаргумент так же, как вы бы уничтожить карту. Это означает, что вы можете делать именованные непозиционные аргументы ключевых слов. Вот пример: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"}что-нибудь вы можете сделать во время деструктурирования карты Clojure можно сделать в списке аргументов функции, как показано выше. В том числе с помощью :или определить значения по умолчанию для аргументов, как это:
user> (defn blah [& {:keys [key1 key2 key3] :or {key3 10}}] (str key1 key2 key3)) #'user/blah user> (blah :key1 "Hai" :key2 " there") "Hai there10"но это в Clojure 1.2. Альтернативно, в более старом версии, вы можете сделать это, чтобы имитировать то же самое:
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"и это работает в целом так же.
и вы также можете иметь аргументы, которые приходят перед аргументами сайта:
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"они не являются необязательными и должны быть предоставлены.
вы можете на самом деле уничтожить
restаргумент, как и любая коллекция 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\")"вы можете делать такие вещи даже в Clojure 1.1. Карта-стиль однако деструктурирование для Аргументов ключевых слов появилось только в 1.2.
в дополнение к превосходному ответу Рейнса, есть также макрос в clojure-contrib что делает жизнь проще:
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]
может быть, вы имеете в виду именованные параметры? Они не доступны напрямую, но вы можете используйте этот вектор подход если вам нравится, который может дать вам то, что вы хотите.
На RosettaCode есть более глубокое объяснение того, как это сделать с помощью деструктурирования.
Comments