Функция draw-mask
в вашем примере принимает два аргумента. Первый - app-state
, который не используется в вашем коде, а второй может быть одним из нескольких разных типов данных: значениями из карты, строкой, списком или, чаще всего, вектором. Здесь вы можете увидеть различные типы, которые могут использоваться в nthFrom
в clojure code.
Это называется последовательным destructuring, и, как упоминалось выше, это большая тема. Тем не менее, для вашего случая, это то, как он работает:
(draw-mask xyz [3 9]) ---> In draw-mask, r is 3, and c is 9.
(draw-mask xyz [3]) ---> In draw-mask, r is 3, and c is nil.
(draw-mask xyz [3 9 12]) ---> In draw-mask, r is 3, and c is 9 -- 12 is not bound
Одно уточнение здесь: действительно ли структура seqable?
не является основным критерием для возможности быть деструктурированный. Например, set
- seqable?
, но не может быть разрушен. Основные критерии для последовательный деструктурирование (отличное от ассоциативного деструктурирования с использованием карт, которое здесь не обсуждается) заключается в том, что на нем должно поддерживаться nth
. В RT.java вы увидите список возможных типов. Это: CharSequence
, родной Java-массив, RandomAccess
, Matcher
, Map.Entry
и Sequential
(Sequential
будет охватывать наиболее распространенные структуры: список и вектор).
IIRC, все подрывающий использует 'deconstruct' (или что-то подобное) макрокоманды. Он просто превращает его в вызовы 'first',' rest' и 'nth' для списков и делегирует аксессуар для карт. Просто типичная макроса «магия». – Carcigenicate
Слово для этого - «деструктурирование» - использование этого должно помочь вам найти хорошую документацию, такую как http://clojure.org/guides/destructuring –
... откровенно говоря, я думаю, что описание того, как деструктурирующие работы * вообще * (как я это читаю) слишком широка, чтобы быть хорошим вопросом StackOverflow - если вы посмотрите на страницу деструктурирования, связанную выше, есть гораздо больше контента, чем то, что может разумно покрыть ответ! –