Core.match со стражами на карте ключ / значение - PullRequest
1 голос
/ 14 октября 2019

Можно ли использовать core.match, чтобы сделать следующее (глупый пример):

  (defn summaries-film [film]
     (match film
         {:genre "Horror" :budget :guard #(< % 1000000) :star _} "Low budget horror"
         {:genre "Comedy" :budget _ :star "Adam Sandler"} "Trash"
         {:genre _ :budget _ :star "Emily Blunt"} "5 Stars"
         :else "Some other film"))

??

Я бы хотел иметь возможность сопоставления с образцом на карте, но тогда есть бит :guard #(< % 10000)? т.е. есть функция в шаблоне, основанная на значении ключа на карте?

Возможно ли это, я знаю, что могу сделать это по вектору, но не могу определить синтаксис или, если это возможнос картами.

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

Спасибо

1 Ответ

1 голос
/ 14 октября 2019

Вы можете использовать охранников с картами, хотя синтаксис другой. Оберните шаблон в список и добавьте :guard your-guard-fn. Функция защиты будет вызываться для всей карты, при условии, что шаблон соответствует в противном случае:

({:foo 1} :guard #(= 1 (:foo %)))

Вот как это выглядит с вашим примером:

(defn summaries-film [film]
  (match film
    ({:genre "Horror" :budget _ :star _} :guard #(< (:budget %) 100)) "Low budget horror"
    {:genre "Comedy" :budget _ :star "Adam Sandler"} "Trash"
    {:genre _ :budget _ :star "Emily Blunt"} "5 Stars"
    :else "Some other film"))

(summaries-film {:genre "Horror" :budget 1 :star "Kelsey Grammer"})
;=> "Low budget horror"
(summaries-film {:genre "Horror" :budget 101 :star "Robert Forster"})
;=> "Some other film"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...