Лисп в изгнании
231 subscribers
152 photos
21 videos
5 files
231 links
Авторский канал на околоайтишную тематику.

По всем вопросам @awkravchuk
Download Telegram
#лытдыбр #common_lisp

Тихо и незаметно вышел новый минорный релиз моего ECS-микрофреймворка на Common Lisp, cl-fast-ecs 0.6.1. В нём из изменений только более подробная документация, а вообще он должен послужить трамплином для грядущих фиксов, связанных с переопределением компонентов на лету — эта кроличья нора оказалась размером с марианскую впадину и в ней нашёлся ещё ряд багов, но конец уже виден 😁
👍111
#лытдыбр

Тут с утра в понедельник включаю колонки, чтобы с утреца под музычку перед работой поковырять свою ECS-библиотеку, щёлкаю выключателем своих Microlab Solo 1, а колонки внезапно громко гудят. Покрутил в компе звук, потом вооюбще джек из него выдернул — один хрен гудят. Решил открутить заднюю крышку, посмотреть, что там, — я ж в детстве занимался электротехникой, перед тем как понять, что руки у меня растут из жопы и надо становиться программистом) Удивился оттого, насколько внутри моих легендарных дорохо-бохато Solo 1 всё дёшево — вся плата усилителя неряшливо заляпана компаундом, на самой плате не распаяны какие-то элементы, в цепи питания никакой стабилизации, тупо диодный мост и два жирных электролитических конденсатора, один из которых, как я и ожидал исходя из симптомов, от старости сверху треснул и потёк, заляпав всё уже подсохшими грязно-жёлтыми каплями электролита. Второй, скорее всего, в таком же состоянии, но на нём сверху гордая наклейка QC pass 😁

Ну и я прикинул, что могу, конечно, пойти в магазин радиодеталей, купить паяльник, припой, флюс, найти там такие же конденсаторы, аккуратно отковырять компаунд, отпаять кондёры, аккуратно впаять новые, но аккуратно — это точно не про меня. Поэтому нашёл местную контору по починке электроники за пару кварталов от своего дома и отнёс её туда, где мне сказали, что во вторник позвонят, но произошёл polako moment polako — сербск. "не спеши", "помедленнее", поэтому во вторник не позвонили, и в среду тоже. Сегодня выдалась хорошая солнечная погода (а вчера был и завтра будет адовый дождь с ветром 20 м/с), решил пройтись до конторы и узнать, чокак. Прихожу — а там закрыто и на двери листочек с надписью по-сербски "сегодня, 21.11, не работаем, спасибо за понимание". Видать, не одному мне погода понравилась 😂
😁4🫡1
#лытдыбр #common_lisp

На той неделе ковырялся с переопределением компонентов на лету в своём ECS-фреймворке, приделал-таки либу для многопотока bordeaux-threads, так что с помощью глобального мьютекса, костылей и веточек оно таки заработало, но я обнаружил целую россыпь багов поменбше. Закоммитил новый код в локальную веточку и начал чинить баги помельче, но от этого начали фейлиться старые тесты. Кароч я посмотрел на свой, откровенного говоря, уже довольно фаршевый код фреймворка, психанул и решил переписать его с использованием лисповского MetaObject Protocol, потому что по сути всё вот это вот переопределение на лету там поддерживается изкоробки — благо, умные люди из лиспового коммьюнити мне уже говорили, мол, а чего MOP не используешь.

Попробую при этом сохранить уже существующий интерфейс у фреймворка, и ещё и предусмотреть, чтобы не было больших проблем с производительностью, чтобы в названии cl-fast-ecs можно было оставить слово fast 😅
На данный момент в MOP я разбираюсь примерно никак, поэтому, собсно, скачал и начал читать фундаментальный труд по MOP — "The Art of Metaobject Protocol" Кизалиса. Надеюсь, успею за разумное время осуществить задуманное)
🔥14
#лытдыбр

Кто по скидке себе купил четвёртую дьяблу и Last Epoch для чилла в канун нового года слежения за состоянием индустрии дьяблоклонов, тот я 😅
🤩4
#common_lisp

Меж тем в воскресенье в Тбилиси прошёл митап по функциональщине, на котором был крутой доклад про оптимизацию кода на Common Lisp от Димы Игнатьева, широко известного в узких кругах как love5an — благодаря его троллингу в начале 10-х я заинтересовался лиспом)) Из доклада даже я вынес для себя что-то новое 😊

Ссылка с таймкодом вот
👀8🔥2
#лытдыбр #common_lisp

Ну штош, сегодня дочитал The Art of MetaObject Protocol (точнее, дошёл до того места, где эта книга перетекает в нудный справочник по MOP), а вчера на практическом опыте (см. рис. 1) убедился, что скорость доступа к слотам CLOS-объектов такая же (если не выше), как и скорость доступа к слотам defstruct-структур, хотя я всю жизнь думал, что слоты объектов медленнее 🤯 Да даже документация к SBCL утверждает, что

> The cost is roughly 1.6 times that of an open coded structure slot accessor.

Причём, что интересно, этот вывод верен как минимум для трёх компиляторов — SBCL, CCL и Franz Allegro ©® CL, я проверял)

Получается, что затеянный рефакторинг моего ECS-фреймворка не только упростит его код и решит проблемы с переопределением компонентов при работающих системах, но и с точки зрения производительности не сделает хуже — по крайней мере, если отталкиваться от нарисованного у меня в голове плана этого рефакторинга; а как известно, в бою первым гибнет план боя 😅

В общем, осталось найти время и силы на то, чтобы перелопатить свой код 😁
🔥11👍1👌1
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #common_lisp

Итак, после полутора недель возни переделал внутрянку своей ECS-библиотеки на использование CLOS-классов вместо структур для добавления возможности переопределения компонентов на лету, во время работы систем, но мёрджить пока рано — есть целый ряд мелочей, которые хотелось бы улучшить, да и тесты проходят только на двух компиляторах, SBCL и CCL, с другими нет-нет, да что-то отвалится 😅 Надеюсь, хотя бы до НГ успею зкончить эту уже поднадоевшую задачу)
🔥13👀1
#лытдыбр

Судя по всему, я скорее всего таки успею до НГ сделать рефакторинг своей ECS-библиотеки на CLOS-классы, тесты для всех компиляторов уже проходят 😊

Ну и по причине неизбежно надвигающихся каникул на моём мини-канале Шепелявый Щитпост 30 и 31 декабря запланирована двухдневка новогодних мемасиков, после которой канал тоже уйдёт на недельку на каникулы. Подписывайтесь, если ещё не, чтобы кекать каждый час, поедая мандаринки и шурша мишурой 😁🎄
🔥10
#common_lisp #лытдыбр

На новый год мейнтейнеры SBCL решили в качестве подарка пользователям не уступать традиции выпускать по новой версии каждый месяц и выпустить новую юбилейную версию 2.5.0, а у меня, как обычно, обновились соответствующие docker-образа для геймдева. Правда, фикс проблемы, из-за которой на особенно сложных окнах в моей GUI-либе cl-liballegro-nuklear SBCL крэшится с внутренней ошибкой, попадёт только в следующую версию (его закоммитили буквально через несколько часов после релиза), а это, считай, в феврале. Ну да ничего, есть много других вещей, над которыми нужно поработать в следующем году 😊
🔥75
This media is not supported in your browser
VIEW IN TELEGRAM
А на этот НГ присоединяюсь к пожеланиям вот такого же душного как и я спикера:
🥰134💊2👍1😢1
#лытдыбр #common_lisp

Ну штош, праздники плавно подходят к концу, и я наконец доделал фичу в своём ECS-фреймворке на CL, которую начал ещё в прошлом году 🌚 А именно, определение внутренних Struct-of-Arrays хранилищ данных компонентов через defclass, а не defstuct, что позволяет гораздо проще и без багов переопределять компоненты "на лету", прямо во время работы систем, а именно — добавлять/удалять новые поля в компонентах и менять их типы. Как сообщает git, 533 additions и 307 deletions, заняло гораздо больше времени, чем я рассчитывал, но результатом доволен.

Сначала я вообще хотел навертеть там мьютексов, и даже выяснил, что захват мьютекса в SBCL занимает всего 2 тысячных миллисекунды, но потом я узнал о таком великолепном механизме CLOS, как UPDATE-INSTANCE-FOR-REDEFINED-CLASS, который позволяет кастомизировать процесс обновления существующих инстансов классов в соответствии с новым определением класса, причём этот механизм работает лениво, т.е. обновление происходит только при первом обращении к инстансу, получается, мьютекс не нужен 😊 Самым тяжким, наверное, было заставить этот механизм работать одинаково под всеми шестью поддерживаемыми мной реализациями Common Lisp, потому что стандарт стандартом, но в мелочах они часто отличаются.

Ещё у меня в коментах спрашивали, что там с производительностью, так вот, буквально сегодня утром закончил замеры — в бенчмарке создаётся 10к объектов с тремя компонентами, и затем 10к раз вызывается (через run-systems) система, обращающаяся ко всем трём компонентам и делающая с ними нехитрую арифметику с тригонометрией. Выяснилось, что замена хранилищ данных на классы замедляет скорость работы буквально в рамках погрешности, на пару процентов 🎉 Более того, я закодил так, что в релизном варианте (при добавлении кейворда :ecs-unsafe в *features*) данные хранятся по-старому, в структурах. По ходу дела я также выяснил, что этот релизный вариант всего процентов на 5-6 быстрее не-релизного варианта, который по умолчанию.

В общем, наконец с этой задачей окончено, можно двигаться дальше, есть много планов на этот год, включая попытку в коммерческий релиз игры на Common Lisp 🤩
🔥19
#лытдыбр #common_lisp

Между делом тут запилил в ECS-фреймворке давно напрашивавшийся рефакторинг — позаменял все глобальные переменные на те, которые предоставляет библиотека global-vars — они почти как настоящие лисповские переменные с динамической областью видимости, только быстрее, потому что шарятся между тредами, как в какой-нибудь прямолинейной C-шке и всегда являются bound, т.е. у них всегда есть значение. В итоге небольшая система move, для которой я хвастался дизассемблерным листингом в туториале по ECS, занимавшим 210 байт, теперь ужалась до 169 байт стройного и прямолинейного ассемблерного кода! 🎉 Хотя тут, судя по всему, и разработчики компилятора SBCL постарались, он как будто более уверенно обращается с переменными с плавающей запятой.

В общем, пытаюсь отвлечься от традиционного ежегодного бюроктатического ада с ВНЖ, как могу 😅
111
#лытдыбр #common_lisp

Не далее, чем сегодня утром, в лисповый биндинг cl-liballegro замёрджили мой пулл-реквест с макросами, упрощающими доступ к полям структур из liballegro — ещё один пунктик из TODO-списка в постмортеме к моему первому рогалику выполнен 😌

Автор библиотеки мне ещё по ходу дела накидал фидбека, так что в итоге совместными усилиями получилась вообще красота, теперь вместо чудовищного

(print (cffi:foreign-slot-value mouse-state '(:struct al:mouse-state) 'al::buttons))


можно просто и красиво написать

(al:with-mouse-state-slots () mouse-state
(print buttons))


😊
🔥14👏2
Good news everyone 😊
This media is not supported in your browser
VIEW IN TELEGRAM
Maxima скомпилировали для запуска в браузере!

Maxima это программа для работы с математическими выражениями. Примечательно то, что эта система написана на Common Lisp.

И вот недавно на Reddit появилось сообщение, что Maxima удалось скомпилировать в WebAssembley так что теперь её можно запустить прямо в браузере.

Я записал для вас небольшую гифку с демкой, а кому интересно, тот может сам потыкать в пример развернутый на сайте:

http://maxima-on-wasm.pages.dev/

Что в этой истории примечательного? То что компиляция в WebAssembly расширяет возможности использования Common Lisp. Я пока не погружался в детали того как это работает, но судя по тому, что в данном проекте использовался ECL (Embeddable Common Lisp), могу предположить, что Maxima транслировали в C, а затем уже собрали в WebAssembly.

#commonlisp #news
🔥11
#лытдыбр

Ну штош, сегодня с утра успешно продлил ещё на год свой мультипаспорт черногорский ВНЖ. Пока пешочком шёл от местного МВД до дома, любуясь заснеженными верхушками гор, осознал, что я в самоизгнании, получается, уже третий год. Как там поёт Шеннон Кёртис, And then sometimes you blink and it's been years 😔

Теперь можно немношк выдохнуть и фигачить дальше, игра саму себя в стиме не выпустит 😅
12
#соцсети

Тут подписчик подогнал стикеры с маскотом Common Lisp, за что ему большая благодарность 😊
7
#лытдыбр

Нет в мире IT вещи, которая бесит сильнее, чем Discord под Linux с его самой беспомощной в мире системой обновлений. Почуяв на своих серверах хоть дуновение запашка новой версии, он наглухо отказывается запускаться (см. рис. 1), любезно открывая тебе в браузере веб-страничку, где ты должен сам скачать (!) дистрибутив, аж в целых 2 (прописью: двух) вариантах: пакет для Debian-подобных линуксов и тарбол с бинарниками. И что же Discord делает после того, как ты вручную (!!) устанавливаешь его обновление? Качает, блядь, обновления (см. рис. 2).

Мне кажется, за такой способ обновления софта нужно всю команду разработки ссылать на урановые рудники, чтобы другим неповадно было 🤬
🔥10😁4🥴1