Кто-нибудь знает хороший способ предоставления аргументов ключевых слов в Clojure? - PullRequest
5 голосов
/ 04 января 2011

Я хотел бы иметь возможность вызывать функции clojure, используя ключевые аргументы, например:

(do-something :arg1 1 :arg2 "Hello")

: возможно ли это без необходимости:

(do-something {:arg1 1 :arg2 "Hello"})

: и могу ли ятакже использовать: предварительные предварительные условия, чтобы обеспечить некоторую проверку, чтобы убедиться, что все аргументы включены?

Ответы [ 2 ]

5 голосов
/ 04 января 2011

Аргументы ключевых слов обеспечиваются встроенной деструктуризацией остальных арг (хотя основные документы для деструктурирования , к сожалению, не охватывают это дополнение в 1.2):

(defn foo
  [a b & {:keys [c d]}]
  [a b c d])
#'user/foo
(foo 1 2 :c 12 :d [1])
[1 2 12 [1]]

Доступны все обычные средства уничтожения карты (например, :or, :strs, :syms и т. Д.).

3 голосов
/ 04 января 2011

Если вы хотите значения по умолчанию для аргументов ключевого слова, сделайте следующее (Clojure 1.2):

(defn foo
  [req1 req2 & {:keys [opt1 opt2] :or {opt1 :hello opt2 :goodbye}}]
  [req1 req2 opt1 opt2])
#'user/foo
user=> (foo :a :b)
[:a :b :hello :goodbye]
user=> (foo :a :b :opt1 "xyz")
[:a :b "xyz" :goodbye]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...