Как стать автором
Обновить
0

Clojure *

Уголок языков Clojure и Clojure REPL

Сначала показывать
Порог рейтинга
Уровень сложности

Сферический коммивояжёр в вакууме и в реальной жизни

Время на прочтение 5 мин
Количество просмотров 3K

Некоторое время назад я участвовал в разработке приложения для фирмы, работающей в сфере транспортной логистики. Поскольку в тот момент фирма только начинала свою активную деятельность, многие процессы были еще не автоматизированы, и менеджер каждый вечер тратил два часа своего времени на распределение завтрашних заказов по водителям и составление их оптимальных маршрутов. У меня сразу же возникла идея реализовать в приложении инструменты, максимально облегчающие его задачу. Что из этого получилось - под катом.

Читать далее
Всего голосов 10: ↑9 и ↓1 +8
Комментарии 13

Новости

Язык Janet для смертных. Часть 2 — Компиляция и создание образов

Уровень сложности Простой
Время на прочтение 10 мин
Количество просмотров 3.8K

Это перевод небольшой книги о языке Janet за авторством Иана Генри (Ian Henry). В этой небольшой книге подробно раскрываются различные аспекты работы с языком, обьяснение синтаксиса и некоторых приемов программирования.

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

Читать далее
Всего голосов 2: ↑2 и ↓0 +2
Комментарии 7

Распаковываем файл gzip вручную. Часть 2

Уровень сложности Средний
Время на прочтение 13 мин
Количество просмотров 3.3K

В этой части мы, как и в первой, распакуем файл gzip вручную, но теперь ещё и декодируем коды Хаффмана.

Для начала запишем данные на диск:

$ echo "hector the frantic father on an anchor or a rare fat cat sat on the ranch" > test-huff.txt
$ xxd test-huff.txt
00000000: 6865 6374 6f72 2074 6865 2066 7261 6e74  hector the frant
00000010: 6963 2066 6174 6865 7220 6f6e 2061 6e20  ic father on an
00000020: 616e 6368 6f72 206f 7220 6120 7261 7265  anchor or a rare
00000030: 2066 6174 2063 6174 2073 6174 206f 6e20   fat cat sat on
00000040: 7468 6520 7261 6e63 680a                 the ranch.

На этот раз файл получился размером 74 байта и содержит 13 символов:

a, c, e, f, h, i, n, o, r, s, t; пробел (0x20) и перевод каретки (0x0a).

В этой строке есть много повторений. Надеюсь, gzip это учтёт. Поскольку я работаю под Windows, то для распаковки использовал 7zip-zstd.

$ 7z a -mx9 test-huff.txt.gz .\test-huff.txt
$ xxd test-huff.txt.gz
00000000: 1f8b 0808 d76f 6565 0200 7465 7374 2d68  .....oee..test-h
00000010: 7566 662e 7478 7400 158b 410a 0031 0c02  uff.txt...A..1..
00000020: effb 0abf 2621 257b 69c1 e6ff d480 1e64  ....&!%{i......d
00000030: c6ca e823 7425 96b8 fb0f 2c7a 0967 8393  ...#t%....,z.g..
00000040: 2873 8710 9543 11ee 75ad cc51 237d 0fc7  (s...C..u..Q#}..
00000050: 9797 d64a 0000 00                        ...J...

Чтобы вы лучше поняли, как будет выглядеть декодирование, покажу первую строку декодированного потока gzip:

0101 1001 0001 1101 00111 010 000 1101 0101 1001 000
h    e    c    t    o     r   ' '   t    h  e    ' ' 

Ну а подробности читайте далее.
Читать дальше →
Всего голосов 46: ↑44 и ↓2 +42
Комментарии 0

Распаковываем файл gzip вручную

Уровень сложности Средний
Время на прочтение 5 мин
Количество просмотров 11K

В этой небольшой статье мы создадим файл gzip, после чего разберём его внутренние составляющие и просмотрим начинку. Избегая лишней сложности, в качестве содержимого для сжатия мы просто запишем в изначальный файл 8 символов a.

$ echo "aaaaaaaa" > test.out
$ xxd test.out
00000000: 6161 6161 6161 6161 0a     aaaaaaaa.

Файл получился размером 9 байт — 8 символов a плюс перевод каретки в конце.

Теперь упакуем его. Сделаем это командой gzip -1, поскольку так мы задействуем самый быстрый метод сжатия, который позволит нам лучше разобрать процесс.

$ gzip -1 test.out
$ xxd test.out.gz
00000000: 1f8b 0808 bf35 6a61 0403 7465 7374 2e6f  .....5ja..test.o
00000010: 7574 004b 4c84 002e 00b6 66d7 ad09 0000  ut.KL.....f.....
00000020: 00

Дисклеймер: эту статью я писал в целях обучения, так что мог допустить некоторые ошибки. Мне нравится заниматься низкоуровневым программированием, но моя основная деятельность сосредоточена на веб-разработке для Microsoft Teams.
Читать дальше →
Всего голосов 60: ↑57 и ↓3 +54
Комментарии 14

Истории

Как распараллелить тесты с базой данных

Уровень сложности Средний
Время на прочтение 5 мин
Количество просмотров 4.2K

Представьте проект, в котором уже написано несколько сотен тестов. Каждый тест настраивает базу под себя: добавляет данные, вызывает truncate по окончанию. Хочется запускать тесты параллельно, чтобы ускориться, но если два теста запустить одновременно, они почти наверняка друг другу помешают.

В данной статье поделюсь подходом, который позволил решить проблему без рефакторинга.

Читать далее
Всего голосов 6: ↑6 и ↓0 +6
Комментарии 20

Язык Janet для смертных. Часть 1 — Значения и ссылки

Уровень сложности Простой
Время на прочтение 13 мин
Количество просмотров 3.2K

Это первая глава перевода небольшой книги о языке Janet за авторством Иана Генри (Ian Henry). В этой книге раскрываются различные аспекты работы с языком, обьяснение синтаксиса и некоторых приемов программирования.

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

Читать далее
Всего голосов 7: ↑7 и ↓0 +7
Комментарии 5

Minecraft и REPL: взаимодействие

Время на прочтение 8 мин
Количество просмотров 1.5K

История одной оптимизации во время мастер-класса Clojure Minecraft

В июне компания JUXT приняла участие в ClojureD, ежегодной замечательной конференции по Clojure в Берлине. В течение дня проводился ряд семинаров, на которых рассказывалось о конкретной идее или инструменте и предлагалось поработать с ними. Наша группа решила посетить семинар "Изменим мир (Minecraft) с помощью кода", который проводили Арне Брассер (Arne Brasseur), Ариэль Алекси (Ariel Alexi) и Фелипе Баррос (Felipe Barros). В этом посте рассказывается о том, как мы использовали полученные на семинаре знания для создания изображений в игре и оптимизировали код с помощью Tufte.

Читать далее
Всего голосов 8: ↑7 и ↓1 +6
Комментарии 0

Как писать ненормальный код и зачем это может быть нужно

Время на прочтение 5 мин
Количество просмотров 12K

Некоторое время назад на одном из проектов по работе я столкнулся с определенными требованиями, которые сразу же разожгли мой живой интерес разобраться с возможностями их обхода, попутно применив свой прошлый опыт написания фреймворков, интерпретаторов и т.п. В результат получилась вполне рабочая технология, позволяющая обходить с моей точки зрения лишние требования в проекте. За конкретикой прошу под кат.

Читать далее
Всего голосов 27: ↑24 и ↓3 +21
Комментарии 35

Абстрактный Clojure

Время на прочтение 10 мин
Количество просмотров 1.5K

В первые несколько лет реализации программного проекта можно добиться многого. С небольшой командой и правильными инструментами мы можем быстро предоставить функциональные особенности, которые удовлетворят как компании, так и их клиентов. На ранних стадиях проекта доставка часто приоритетнее архитектуры, но архитектура должна развиваться, если мы хотим, чтобы программное обеспечение разрабатывалось и поддерживалось в долгосрочной перспективе. Любой проект, который живет дольше нескольких лет, будет претерпевать изменения. Бизнес-требования поменяются, разработчики приходят и уходят, сервисы платформы, от которых зависит программное обеспечение, устаревают и заменяются, среды развертывания меняются, а новые технологии предлагают новые возможности, в то время как прежние технологии устаревают.

Читать далее
Всего голосов 9: ↑8 и ↓1 +7
Комментарии 0

Принципы SOLID в Clojure

Время на прочтение 7 мин
Количество просмотров 1.4K

Роберт К. Мартин (Robert C. Martin) (дядя Боб) назвал пять основных принципов проектирования программного обеспечения SOLID. Такой акроним помогает людям легче запомнить их. Мне очень нравятся подобные мнемоники, потому что всем нам нужна помощь для фиксации в памяти необходимой информации. Чем проще закрепить знания, тем большему мы способны научиться.

Благодаря большому опыту проектирования программного обеспечения, эти принципы были разработаны для того, чтобы помочь создать ПО, которое можно поддерживать в работоспособном состоянии на протяжении длительного времени. Это благо для мира ОО (object-oriented — объектно-ориентированный), что об этих и подобных принципах так много говорят. Они были идентифицированы, переработаны, названы и кодифицированы. И теперь можно открыто говорить о них, при этом люди понимают, что вы имеете в виду. Такого рода вещей, как ни странно, совершенно не хватает в мире функционального программирования.

Читать далее
Всего голосов 11: ↑9 и ↓2 +7
Комментарии 1

Clojure за 15 минут

Время на прочтение 7 мин
Количество просмотров 10K

Краткий экскурс в синтаксис Clojure, который настолько лаконичен, что вы сможете прочитать этот раздел примерно за 15 минут.

Читать далее
Всего голосов 17: ↑15 и ↓2 +13
Комментарии 5

Зачем Clojure Flutter

Время на прочтение 13 мин
Количество просмотров 7.4K

”Если вам нравятся Руби, Свифт, Дарт, Эликсир, Эльм, С++, Питон или даже С, используйте их ради бога. Но выучите Кложур, и выучите его хорошо” — Дядя Боб (твит, а также твиты: 1, 2, 3).

Статей о Clojure написано много, цель этой — дать свое видение некоторых преимуществ языка для кросплатформенной разработки на Flutter. Ориентируюсь в первую очередь на dart-разработчиков, но статья может быть интересна всем, кто работает с Clojure и/или Flutter.

Читать далее
Всего голосов 16: ↑14 и ↓2 +12
Комментарии 17

Как начать писать приложения на ClojureDart

Время на прочтение 4 мин
Количество просмотров 5K

16 апреля зарелизился ClojureDart, а это значит, что для любителей Clojure открылась возможность писать мобильные, веб- и десктоп-приложения на Flutter. Зачем использовать для этого Clojure, как бы очевидно это ни было, выходит за границы фокуса статьи.

На текущий момент инструменты еще не отшлифованы, нет репла(!) и автодополнений для dart-интеропа, но пользоваться можно, и некоторые плюшки кложуры уже показали себя (например, nest-макрос, убирающий проблему вложенности).

В этой статье хочу рассказать, как написать свое первое flutter-приложение на Clojure, какими инструментами удобно пользоваться, где искать ответы на вопросы. Статья для тех, кто имеет хотя бы минимальный опыт работы с Clojure.

Читать далее
Всего голосов 10: ↑9 и ↓1 +8
Комментарии 3

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн

DIY VSCode плагин для Clojure

Время на прочтение 4 мин
Количество просмотров 3.9K
image

На энном году работы с использованием Clojure/Clojurescript в качестве основных языков разработки, я наконец-то дошел до стадии, когда «больше терперть уже нельзя», и написал таки свой плагин для этой цели. Это явилось результатом многолетних поисков, лишений и страданий. Как говаривал Мичурин: мы не можем ждать милостей от природы, взять их у нее – наша задача. Интересующихся прошу под кат.

Читать дальше →
Всего голосов 6: ↑5 и ↓1 +4
Комментарии 2

Основы функционального программирования на Python

Время на прочтение 19 мин
Количество просмотров 55K

Этот пост служит для того, чтобы освежить в памяти, а некоторых познакомить с базовыми возможностями функционального программирования на языке Python. Материал поста разбит на 5 частей:

Читать далее
Всего голосов 11: ↑9 и ↓2 +7
Комментарии 42

Функциональное ядро в виде конвейера на Python

Время на прочтение 12 мин
Количество просмотров 8.8K

Главная задача этого поста – показать один мало применяемый на языке Python архитектурный шаблон под названием «функциональное ядро - императивная оболочка», в котором функциональный код концентрируется внутри, а императивный код выносится наружу в попытке свести на нет недостатки каждого из них. Известно, что функциональные языки слабы при взаимодействии с «реальным миром», в частности с вводом данных пользователем, взаимодействием с графическим интерфейсом или другими операциями ввода-вывода. В рамках такого подхода весь императивный код выталкивается наружу, и внутри остается только функционально-ориентированный.

Читать далее
Всего голосов 9: ↑1 и ↓8 -7
Комментарии 78

Что не так с Лиспом?

Время на прочтение 8 мин
Количество просмотров 17K

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

Позвольте мне начать с пары слов для тех кто не в курсе. Lisp - это семейство языков, включая Common Lisp, Emacs Lisp и несколько диалектов, которые...

Так что же не так с лиспом?
Всего голосов 29: ↑20 и ↓9 +11
Комментарии 207

Reagent: Минималистичный React для ClojureScript

Время на прочтение 8 мин
Количество просмотров 4K
Хабр, привет.

Я — PM, которые лезет в то, что его может сожрать. Так что, я перевела часть документации по Reagent, если будет полезно, выложу продолжение.


In the no-holds-barred world of coding, the end justifies the extreme.

Введение в Reagent


Reagent обеспечивает минималистичное взаимодействие между ClojureScript и React. Он позволяет вам создавать эффективные компоненты React, используя только простые функции ClojureScript и данные, которые описывают пользовательский интерфейс, используя Hiccup-подобный синтаксис.

Цель Reagent — сделать возможным создание произвольно сложных пользовательских интерфейсов, используя пару основных понятий, и быть по-умолчанию достаточно быстрым, чтобы вам редко приходилось думать о производительности.

Простейший компонент Reagent

может выглядеть примерно так:
(defn simple-component []
  [:div
   [:p "I am a component!"]
   [:p.someclass
    "I have " [:strong "bold"]
    [:span {:style {:color "red"}} " and red "] "text."]])


Читать дальше →
Всего голосов 10: ↑10 и ↓0 +10
Комментарии 0

Функциональное программирование, знакомься — ООП

Время на прочтение 9 мин
Количество просмотров 11K

Мне нравится экспериментировать с разными парадигмами и играться с разными интересными (для меня) идеями (некоторые из них превращаются в посты: раз, два). Недавно я решил проверить, смогу ли я писать объектно-ориентированный код на функциональном языке.

Читать дальше →
Всего голосов 5: ↑5 и ↓0 +5
Комментарии 6

Книга «Clojure на производстве»

Время на прочтение 7 мин
Количество просмотров 8.7K

Неделю назад в издательстве "Ридеро" вышла книга "Clojure на производстве". Как ее автор, расскажу о ней подробнее: что внутри и кому она полезна.



Общие сведения


Это книга о том, как применять Clojure в настоящих условиях: не сортировать списки в олимпиадных задачах, а поднимать веб-приложения, строить системы, писать тесты. Мой опыт с Clojure показывает, что переход от теории к практике происходит болезненно. Руководства обещают чистоту и неизменяемость, но на практике нам дают код, полный побочных эффектов и состояния.


Это книга — попытка облегчить погружение в практику. Одновременно хочу развеять ложные надежды: Clojure — прекрасный язык, но и в нем не бывает чудес.


От других материалов по Clojure книга отличается следующим. Прежде всего, это не перевод. Я не зря делаю на этом акцент во вступлении. Проблема переводов в том, что в издательствах не понимают технические термины и пытаются их адаптировать. Token становится маркером, trait — чертой, persistence — сохранностью. Формально перевод корректный, но пропадает живость описания, и к нему падает интерес. В своей книге я не срезал углы: если у слова нет однозначного перевода, я ставил английский вариант — тот, в котором мы видим его каждый день.

Читать дальше →
Всего голосов 38: ↑38 и ↓0 +38
Комментарии 36

Вклад авторов