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

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

Геймджем геймджемом, а новый релиз топового опенсорсного лиспового компилятора SBCL по расписанию, поэтому сделал новый билд под винду с поддержкой последней нормальной версии Windows 7, и докерфайлы с SBCL и прочими важными инструментами для сборки лисповых игр 😊
6
#лытдыбр

Тут ещё подъехали новости, в лисповых джемах всегда нужно было использовать бесплатные ассеты и ссылаться на них, а теперь ещё и добавили новое правило, что арт, сгенерированный нейросетями, тоже нельзя, потому что, видите ли, для такого арта нельзя сослаться на автора. Я во время джема придумал и сгенерил офигенную обложку к игре, но орги тут наехали, что нельзя, луддиты проклятыя. Пришлось искать человекоделанный арт и проявлять безумные навыки в Gimp, в итоге судите сами — было/стало:
🔥82👍1😁1
#лытдыбр #common_lisp

Ну штош, в воскресенье закончилось голосование в осеннем Lisp Game Jam '24, и по его результатам, мой рогалик на Common Lisp Lispy Rogue занял 6 место из 24, что гораздо лучше, что я ожидал, но всё равно не первое, однако в категории "Entertainment" (how enjoyable is it?) он занял таки первое место, я доволен 😊

Как я уже писал в постмортеме, попробую пофиксить ряд косяков и выступить с ещё одним, более продуманным рогаликом, в марте следующего года на джеме 7DRL ("7 day rogue like"), а пока буду готовиться к важному пока секретному игровому проекту и заодно к третьей части своего туториала по геймдеву на CL — и для того, и для другого понадобится довести до ума свою библиотеку для деревьев поведения 🎄
🔥22
#лытдыбр #common_lisp

Выловил тут проблему с TYPE-ERROR при переопределении компонента "на лету", при работающей игре, про которую писал в постмортеме (см. рис. 1). Оказывается, у меня всё чётенько работает, но штука в том, что Emacs (а, точнее, его плагин для Common Lisp Sly) больно хитрожопый — когда ты прожимаешь C-c C-c, чтобы отправить в лисп-процесс новое определение компонента, он копирует форму, на которой стоит курсор, в отдельный временный файл, и компилирует этот файл в отдельном треде, блэт. Из-за этого код работающих в игре систем запинается в тот момент, когда все функции для работы с компонентом уже переопределены на новые, а сама внутренняя структура с данными компонента у всех сущностей ещё пока старая (но будет заменена на новую буквально миллисекундами позже).

Пока не придумал, как нормально справиться с излишней хитрожопостью Sly, разве что притащить в зависимости либу для многопотока bordeaux-threads и при запуске ecs:run-systems захватывать некий глобальный мьютекс, а при переопределении компонентов проверять, что он отпущен. Такое себе решение, лишняя зависимость и производительность будет чутка хуже — туда-сюда мьютекс хватать-отпускать. Надо с ним переспать, может чего получше придумаю 😄
1
#лытдыбр #common_lisp

На этой неделе произошёл nerd sniping moment, таксказатб — случайно наткнулся на докер-образ msys2-docker-experimental, который, как и я в своих сборочных скриптах для игр, решает проклятую проблему развёртывания windows-окружения для сборки под нормальной ОС (Linux), и, конечно, не мог пройти мимо него: мой вариант этого решения по сути был шаткой конструкцией из костылей, которая от мимолётного дуновения обновлений с грохотом рушилась. Начал ковырять, вроде всё получалось гораздо лучше и стройнее, чем было до этого, но я постоянно наталкивался на невиданные ранее баги — например, моя либа cl-liballegro-nuklear не компилировалась, но это я поправил, опять-таки упростив механизм сборки. Потом был какой-то плавающий баг в лисповом CFFI — я для него даже сделал pull request, но он внезапно починился сам 🤷 А вот в пятницу наткнулся на совершенно фантастический баг в пакете ImageMagick для MSYS2, которым я подготавливаю иконки для виндусового инсталлера — указываешь ему в качестве файла для вывода абсолютный путь, и он с какого-то рожна автоматом дописывает в начало /msys64 и, конечно, такого пути не находит и фейлится. Дабл-ю Ти Эф, как говорится, баг этот я обворкэраундил, но осадочек остался.

В итоге только сегодня всё добил до конца, проверив новую сборку под винду на проекте Cycle of Evil. Внёс изменения в шаблон игры на Common Lisp и заодно сделал автоматическую сборку докер-образов для сборки лисповых игр, жутко люблю такие штуки — меня хлебом не корми, только дай сборку чего-нибудь автоматизировать 😊
🔥6👾1
#лытдыбр

Подписчик тут в чате подсказал, что баг с Imagemagick — и не баг вовсе, а фича, причём отключаемая; подпискичи у меня лучшие вообще 🥰

Там тоже есть тонкости, но в общем пофиксил и это в сборочном скрипте шаблона игры, ещё один шажок на пути к полностью автоматизированному люксовому гейскому космическому капитализму 😊
👍71
#лытдыбр #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