-
Довод. Название
Где-то читал, что название Tenet режиссер выбрал потому, что оно читается в обе стороны. Таким образом он проводит параллель с организацией, которая работает в обоих временных направлениях. И только недавно, когда шел и думал о чем-то краешком мозгов, догадался: а ведь русский перевод “довод” тоже читается наоборот.
До чего же редкий случай! Нашлось слово, которое не только близко по смыслу к оригиналу (“принцип”, “догмат”), но и повторяет его семантику. Точное попадание, победа локализаторов.
К сожалению, такое редко случается. Например, скоро выходит мультик Soul (в российском прокате — Душа). К переводу не подкопаешься, но семантика в том, что в сюжете переплетается загробная жизнь и музыка в стиле соул. То есть в названии два смысла — человеческая душа и музыка. Тут ничего не попишешь, бери что-то одно.
А вот с Доводом зачетно вышло в плане названия. Но про сам фильм — как-нибудь в другой раз.
-
Зипперы в Clojure (часть 7). Обход в ширину. Улучшенный обмен валют
Оглавление
- Зипперы (часть 1). Азы навигации
- Зипперы (часть 2). Автонавигация
- Зипперы (часть 3). XML-зипперы
- Зипперы (часть 4). Поиск в XML
- Зипперы (часть 5). Редактирование
- Зипперы (часть 6). Виртуальные деревья. Обмен валют
- Зипперы (часть 7). Обход в ширину. Улучшенный обмен валют
- Зипперы (часть 8). Заключение
В прошлый раз мы работали с деревом валют, чтобы построить цепочку обмена. Мы нашли решение задачи, но упомянули, что в особых случаях дерево может получиться бесконечным. Объясним, как это возможно. Для этого вспомним, как
zip/next
обходит дерево.Алгоритм называется depth first search или обход в глубину. При таком обходе код стремится в первую очередь вниз, а уже потом — в сторону (в нашем случае вправо). В этом легко убедиться, если разложить данные на части с помощью зиппера:
(->> [1 [2 [3] 4] 5] zip/vector-zip iter-zip (map zip/node) (map println)) ;; 1 ;; [2 [3] 4] ;; 2 ;; [3] ;; 3 ;; 4 ;; 5
-
Зипперы в Clojure (часть 6). Виртуальные деревья. Обмен валют
Оглавление
- Зипперы (часть 1). Азы навигации
- Зипперы (часть 2). Автонавигация
- Зипперы (часть 3). XML-зипперы
- Зипперы (часть 4). Поиск в XML
- Зипперы (часть 5). Редактирование
- Зипперы (часть 6). Виртуальные деревья. Обмен валют
- Зипперы (часть 7). Обход в ширину. Улучшенный обмен валют
- Зипперы (часть 8). Заключение
Предыдущих занятий было достаточно, чтобы перейти к экспериментам над зипперами. Предлагаем читателю подумать над необычным примером.
До сих пор вторая функция, которую мы передавали в зиппер, возвращала потомков из ветки. Для вектора это была просто
seq
, для XML — более сложная комбинация(comp seq :content)
. Оба варианта отталкиваются от родительского узла, и если потомков нет, функция вернётnil
.Но что если функция вернёт постоянный набор потомков:
(fn [_] (seq [1 2 3]))
Как поведёт себя такой зиппер? Напишем его:
(def zip-123 (zip/zipper any? (constantly (seq [1 2 3])) nil 1))
-
Зипперы в Clojure (часть 5). Редактирование
Оглавление
- Зипперы (часть 1). Азы навигации
- Зипперы (часть 2). Автонавигация
- Зипперы (часть 3). XML-зипперы
- Зипперы (часть 4). Поиск в XML
- Зипперы (часть 5). Редактирование
- Зипперы (часть 6). Виртуальные деревья. Обмен валют
- Зипперы (часть 7). Обход в ширину. Улучшенный обмен валют
- Зипперы (часть 8). Заключение
До сих пор мы игнорировали другую возможность зипперов. Во время обхода можно не только читать, но и менять локации. В широком плане нам доступны все операции CRUD (Create, Read, Update, Delete), знакомые из веб-разработки. Ниже мы разберем, как они работают в зипперах.
Напомним, зиппер принимает третью функцию
make-node
, в которую до сих пор мы передавалиnil
. В ней не было нужды, потому что мы только читали данные. Зиппер вызовет функцию в момент, когда мы просим вернуть данные с учётом изменений, которые внесли в локации. Функция принимает два параметра: ветку и потомков. Ее задача — соединить их должным образом. -
Разбор статьи из журнала «Код»
На Хабре – моя публикация Разбор статьи из журнала «Код» (Яндекс Практикум).
-
Зипперы в Clojure (часть 4). Поиск в XML
Оглавление
- Зипперы (часть 1). Азы навигации
- Зипперы (часть 2). Автонавигация
- Зипперы (часть 3). XML-зипперы
- Зипперы (часть 4). Поиск в XML
- Зипперы (часть 5). Редактирование
- Зипперы (часть 6). Виртуальные деревья. Обмен валют
- Зипперы (часть 7). Обход в ширину. Улучшенный обмен валют
- Зипперы (часть 8). Заключение
Предположим, нам поставили задачу: выбрать из XML магазины, где продаются айфоны. Обратите внимание: мы впервые коснулись связи между узлами, и это важно. По отдельности выбрать данные легко. Магазины — это локации, у которых тег
organization
. Айфоны — локации, в которых узел с тегомproduct
и атрибутомtype="tablet"
. Но как найти связь между ними?В прошлый раз мы разложили XML в последовательность с помощью
xml-seq
. Проблема в том, что функция порождает коллекцию узлов без какой-либо связи, что не даёт нам решить задачу. Покажем это на примере. Для начала получим цепочку узлов: -
Зипперы в Clojure (часть 3). XML-зипперы
Оглавление
- Зипперы (часть 1). Азы навигации
- Зипперы (часть 2). Автонавигация
- Зипперы (часть 3). XML-зипперы
- Зипперы (часть 4). Поиск в XML
- Зипперы (часть 5). Редактирование
- Зипперы (часть 6). Виртуальные деревья. Обмен валют
- Зипперы (часть 7). Обход в ширину. Улучшенный обмен валют
- Зипперы (часть 8). Заключение
Мощь зипперов раскрывается в полной мере при работе с XML. От других форматов он отличается тем, что задан рекурсивно. Например, JSON, YAML и другие форматы предлагают типы — числа, строки, коллекции, — у которых разный синтаксис и структура. В XML, где бы мы ни находились, текущий узел состоит из трёх элементов: тега, атрибутов и содержимого.
Тег – это короткое имя узла, например
name
илиdescription
. Атрибуты – словарь свойств и их значений. Наиболее интересно содержимое: это набор строк или других узлов. Вот как выглядит XML на псевдокоде:XML = [Tag, Attrs, [String|XML]]
Чтобы убедиться в однородности XML, рассмотрим файл с товарами поставщиков:
-
Зипперы в Clojure (часть 2). Автонавигация
Оглавление
- Зипперы (часть 1). Азы навигации
- Зипперы (часть 2). Автонавигация
- Зипперы (часть 3). XML-зипперы
- Зипперы (часть 4). Поиск в XML
- Зипперы (часть 5). Редактирование
- Зипперы (часть 6). Виртуальные деревья. Обмен валют
- Зипперы (часть 7). Обход в ширину. Улучшенный обмен валют
- Зипперы (часть 8). Заключение
Мы разобрались с тем, как перемещаться по коллекции. Однако у читателя возникнет вопрос: как мы узнаем заранее, куда двигаться? Откуда приходит путь?
Ответ покажется странным, но все же: ручная навигация по данным лишена всякого смысла. Если путь известен заранее, вам не нужен зиппер — это лишнее усложнение.
Clojure предлагает более простую работу с данными, структура которых известна. Например, если мы точно знаем, что на вход поступил вектор, второй элемент которого вектор, и нужно взять его второй элемент, воспользуемся
get-in
:(def data [1 [2 3] 4]) (get-in data [1 1]) ;; 3
-
Зипперы в Clojure (часть 1). Азы навигации
Оглавление
- Зипперы (часть 1). Азы навигации
- Зипперы (часть 2). Автонавигация
- Зипперы (часть 3). XML-зипперы
- Зипперы (часть 4). Поиск в XML
- Зипперы (часть 5). Редактирование
- Зипперы (часть 6). Виртуальные деревья. Обмен валют
- Зипперы (часть 7). Обход в ширину. Улучшенный обмен валют
- Зипперы (часть 8). Заключение
В этой главе мы рассмотрим зипперы в языке Clojure. Это необычный способ работы с коллекциями. С помощью зиппера можно обойти произвольные данные, изменить их и выполнить поиск. Зиппер — мощный инструмент, и вложения в него окупаются со временем. Вместе с тем это довольно сложная абстракция, которая требует подготовки.
Объясним зиппер простыми словами. Это обёртка над данными с набором действий. Вот некоторые из них:
- перемещение по вертикали: вниз к потомкам или вверх к родителю;
- перемещение по горизонтали: влево или вправо среди потомков;
- обход всех элементов;
- добавление, редактирование и удаление узлов.
-
Книга для читалки и телефона
Рад сообщить, что теперь книга поддерживает устройства с небольшими экранами — читалки и телефоны. Чтобы добыть эту версию книжки, перейдите на ее страницу в Gumroad. Если вы делали предзаказ, введите код, который я сообщил в письме (а если не сообщил, пинганите). Если вы до этого купили бандл, Gumroad позволит скачать новую версию бесплатно.
В дополнение к печатной версии и для планшета вы получите PDF-файлы для читалки и телефона. У них меньший размер страницы и максимально срезаны поля. Версия для телефона вытянута по вертикали, чтобы уместиться на шестидюймовых моделях. Впрочем, телефоны сегодня самых разных форматов, и возможно, под ваш зайдет версия для читалки.