Если существует ключ: update, в противном случае: assoc

рассмотрим это внутри цикла сокращения:

(if (contains? m k)
  (update m k conj v)
  (assoc m k [v]))

Есть ли способ избавиться от оператора if?

Ответ 1

Используйте fnil для обработки значения nil v, если k не существует на карте:

(update m k (fnil conj []) v)

Ответ 2

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

(assoc m k (conj (m k []) v))

где (m k []) возвращает значение k в m или по умолчанию - [], если k не существует в m.

Если k является символом, также будет работать (k m []).