-
Зипперы в 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-файлы для читалки и телефона. У них меньший размер страницы и максимально срезаны поля. Версия для телефона вытянута по вертикали, чтобы уместиться на шестидюймовых моделях. Впрочем, телефоны сегодня самых разных форматов, и возможно, под ваш зайдет версия для читалки.
-
Что там с рассылкой — 1
Основная часть книг разослана, и некоторые читатели их уже получили. Этот пост касается случаев, когда вы сделали заказ, но книги нет.
Вы получили письмо с темой “Книга выслана: xxxxxxxx”, но код не отслеживается
Это мой косяк. Дело в в том, что код из заголовка на самом деле не трек-код, а номер заказа в системе saferoute.ru. Чтобы узнать код службы, которая будет доставлять книжку, пройдите по ссылке и введите номер заказа. В следующем окне вы увидите службу доставки и ее трек номер.
Некоторые агрегаторы вроде gdeposylka.ru по номеру заказа находят конечную службу и трек-номер, но это работает в половине случаев. Извините, что так вышло.
Вы из Беларуси, но письма не было
Издательство сообщило, что в системе СДЕК произошел сбой с отправкой в этом направлении. Сейчас все налажено, в четверг мне скажут треки, и я сообщу вам.
Вы из России, но письма не было
Тут два варианта — либо книг из первого тиража не хватило, либо вы попросили книгу с подписью. Если первый вариант, ждем неделю, пока напечатают следующий (я уже заказал). Если второй вариант, то мне пришлось ждать, пока книжка придет от издательства ко мне. Получил буквально вчера, отправлю на этой неделе, треки скину.
Вы из-за границы (не Россия, не Беларусь)
Издательство не доставляет за рубеж, это буду делать я. Все аналогично — на этой неделе начну отправку Почтой России, треки скину. Текущей партии на всех не хватит, кому-то придется ждать второго тиража.
Надеюсь, все получат свои книги. Если что, пишите, разберемся.
-
О дизайне и Dropbox
Вчерашний пост о Dropbox был лишь затравкой. Я поработал с новым клиентом и подкопил интересный материал. Не столько про сам Дропбокс, сколько про дизайн в целом. Итак, поговорим о дизайне.
Многие из нас рассуждают о дизайне: этот хороший, а тут плохой. У Эпла красиво, у Андроида страшно. Вопрос, который меня беспокоит: если отбросить привычки и инфантильные термины вроде “плохо” и “хорошо”, то как можно судить о дизайне? Мне кажется, я знаю ответ. Назовем удачным тот дизайн, где каждый элемент приносит пользу.
Заметим, что определение ничего не говорит о цвете кнопки или размере шрифта. Оно одинаково подходит к сайту, книге или радиоприемнику. Все три изделия состоят из элементов. В хорошем дизайне каждый элемент отвечает на вопросы “что ты здесь делаешь” и “какую пользу несешь”.