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

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

Стою перед сложным выбором, в какую сторону начать бухтеть:
• Экзотической ОС Ш1ИДОШ5;
• Мейнтейнеров MSYS, которые даже не берут на себя труд запустить тот софт, который они распространяют;
• Г-на Фукамачи, который пишет код так, как будто его никто не видит.

Прямо дилемма 🤔
😁5🤔1
#common_lisp #лытдыбр

Есть у меня в гуёвой библиотеке cl-liballegro-nuklear макрос, with-style-item, который вызывает сишную функцию nk_style_push_style_item, которая, в свою очередь, принимает на вход среди всего прочего два указателя, на "контекст" (по сути точка входа в сишную библиотеку, структура, в которой хранится вся нужная инфа о текущем состоянии GUI), и указатель на ту деталь стиля оформления, которая меняется внутри этой структуры, по сути тот же первый указатель, но со (сравнительно) небольшим оффсетом. Так вот, как выяснилось по итогам экспериментов и треда на реддите, SBCL не умеет аллоцировать свои обёртки для сишных указателей на стеке. От слова "совсем". Наглядная демонстрация:

> (macroexpand-1 '(nk:with-style-item c nk:+style-window-fixed-background+
(nk::style-item-image* i)))
(LET ((#:ITEM353 (CL-LIBALLEGRO-NUKLEAR:STYLE-ITEM-IMAGE* I))
(#:OFFSET354
(CFFI-SYS:INC-POINTER C
CL-LIBALLEGRO-NUKLEAR:+STYLE-WINDOW-FIXED-BACKGROUND+)))
(DECLARE (DYNAMIC-EXTENT #:ITEM353 #:OFFSET354))
(CL-LIBALLEGRO-NUKLEAR:STYLE-PUSH-STYLE-ITEM C #:OFFSET354 #:ITEM353)
(CL-LIBALLEGRO-NUKLEAR:STYLE-POP-STYLE-ITEM C))


> (disassemble #'(lambda (c i)
(declare (type cffi:foreign-pointer c i)
(optimize (speed 3) (safety 0) (debug 0)))
(nk:with-style-item c nk:+style-window-fixed-background+
(nk::style-item-image* i))
nil))
; ... snip ...
; full: https://gist.github.com/lockie/24fa8c730eb82f53e7e79db418a71b8b
; 343: L2: 6A10 PUSH 16
; 345: FF142578050050 CALL [#x50000578] ; #x52A004F0: ALLOC-TRAMP
; 34C: 5F POP RDI
; 34D: 4080CF0F OR DIL, 15
; 351: EB9A JMP L0


Обратите внимание, как SBCL упорно ложит с прибором на декларацию dynamic-extent и выделяет под CFFI-ный указатель 16 байт (видимо, сам указатель и тэг типа) с кучи. Чтобы такое зафиксить, придётся лезть глубоко в кишки SBCL и перетирать с его разработчиками, а мне чёт неловко таких серьёзных людей от их дел отвлекать 😅
#лытдыбр #common_lisp

Сегодня закончил с оптимизацией функции поиска пути персонажа по алгоритму A* — теперь уже ни в самой функции, ни в её окрестностях улучшать в плане производительности нечего, всё вылизано до блеска. В итоге путь в сложном лабиринте с большим количеством длинных коридоров и поворотов на 180° со скриншота находится чуть меньше, чем за половину миллисекунды. Это, наверное, не очень впечатляющий результат для какой-нибудь RTS, но в столь специфичном жанре нужны будут свои хаки вроде кэширования путей или предварительного вычисления графа с компонентами связности для карты и запуска A* на нём. Если сравнивать с моим кринжовым опытом реализации A* на лиспах четырёхлетней давности, который глючный, дёрганый и тормозной, сейчас получился прямо огонь 🔥
🔥9
#мемасики

Мы или не мы?
😁1😢1
#статьи

Опубликовал на хабре перевод статьи о том, как Lisp в космос летал. В целом от этой истории вайб, конечно, максимально похож на вот этот кадр
10
#лытдыбр

Опа, приплыли. Подкрался незаметно, хоть виден был издалека.
Надо Nyxt расчехлять. Ну или там Qutebrowser накрайняк.
💩1
#проекты #лытдыбр

Делаю финальную вычитку первой части руководства по своему микрофреймворку cl-fast-ecs, и опять наталкиваюсь на плохие новости — какой-то долбоёб выкупил домен liballeg точка org и снёс оттуда сайт либы liballegro, которую я использую в каждом первом своём проекте. Это ж в скольких местах теперь придётся ссылку менять на нормальную 😩
😢4
#лытдыбр #common_lisp

Наконец опубликовал первую часть туториала по ECS-фреймворку cl-fast-ecs: https://habr.com/ru/articles/767342 , вы знаете, куда насыпать апвоутов 😊

Он у меня занял на порядок больше времени и сил, чем я планировал, наконец можно немношк выдохнуть
🔥9
#лытдыбр

В эту пасмурную, дождливую и вялую субботу itch.io даёт повод улыбнуться 😊🫖
🤔2
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр #проекты #common_lisp

Итак, в рамках идущего уже третий день Autumn Lisp Game Jam 2023 я наконец добил простейшее дерево поведения для персонажа вида "выбрать любого другого персонажа в области видимости, подбежать к нему и сделать ближнебойный BOINK".
Но мне не нравится то, что я написал 😅 Сами узлы дерева в рамках модели ECS у меня сейчас хранится неоптимально, приводя к большому количеству промахов по кэшу, поэтому настало время переписывать весь код, код сам себя не перепишет 😂
🎄5💯1
#лытдыбр #проекты #common_lisp

В итоге проблему с промахами деревьев по кэшу решил опять-таки кодогенерацией — макрос define-behaviour-tree генерирует пачку вызовов макросов ecs:defcomponent и ecs:defsystem, которые, в свою очередь, уже генерируют вызовы обычных функций по возне с данными компонентов в массивах. Макрос этот настолько чудовищный, что простенькое тестовое дерево со скриншота SBCL компилирует больше секунды! Никогда такого не видел 😅

Кажется, мой девиз — "в любой непонятной ситуации кодогенерируй" 😂
😱4👍1
#лытдыбр #проекты

Сегодня с утреца начал собирать из разрозненных фрагментов кода игру для отправки на осенний Lisp Game Jam, только с тем, чтобы с ужасом обнаружить, что у меня криво работает алгоритм поиска пути A* на пустой карте без препятствий, а именно, персонаж вместо того, чтобы идти по прямой, выделывает какие-то адские вензеля. Спустя три часа, один git bisect и несколько миллионов нервных клеток я обнаружил тупейшую багу, которую допустил, когда одновременно копировал и оптимизировал реализацию очереди с приоритетами себе в проект (см. рис. 1).

Продолжу сборку финальной игры после обеда, есть даже шансы успеть сделать что-то не абсолютно кривое 😅
🔥2🤔1
#лытдыбр #проекты #common_lisp

Штош, вот и подъехал результат моих ударных трудов прошлой недели в рамках осеннего Lisp Game Jam: Mana Break, симулятор колонии с непрямым управлением 🤪 Выглядит, соглашусь, непритязательно, — картодел из меня никакой, а на художественный вкус медведь в детстве наступил, — но зато с технической точки зрения впечатляет: в игре полтора десятка персонажей с шестью вариантами сложного многоступенчатого поведения, а FPS при этом остаётся в районе 800, и даже если сделать их не 15, а тысячу, FPS проседает до 500, чего по-прежнему более чем достаточно 😊

В общем, деревья поведения — технология крутая, но я пока только одной ножкой попробовал водичку, нужно исследовать границы применимости дальше, чем и продолжу заниматься на следующей неделе, пока нужно немношк выдохнуть)
🔥14👍1
#лытдыбр

Штош, вот и прошла неделя, как я проработал на своей новой фуллтайм работе — мечта мечтой, а денешки тоже нужны. Именно поэтому пока сделал паузу в утреннем стриминге на Twitch, думаю, на следующей неделе буду к нему потихоньку возвращаться, вместе с дальнейшей работой над своим игровым движком на Common Lisp в виде хобби.

На работе веслаю вебсервисы на питоне, и, что забавно, не далее, чем вчера, когда прикидывал в голове, как написать код двух логически похожих функций, пришёл к выводу, что в питоне страшно не хватает лисповых макросов 😅 Гусары, молчать про Hylang, если я это притащу на работу, на меня все посмотрят, как на ебанутого, включая меня самого)
4😁3
#лытдыбр

Сегодня на утреннем стриме прикидывал, как бы получше разложить деревья поведения на модель хранения данных ECS, чтобы и работало быстро (как сейчас), и можно было создавать новые деревья в рантайме. В итоге нарисовал абсолютно шизофреничный план (см. рис. 1), прямо как тот чувак с мема с сигаретой в зубах рядом с доской, утыканной красными нитками. И только минут за пять до конца до меня дошло, что раз уж я кодогенерирую на всю голову, чем стираю грань между компалтаймом и рантаймом, мне вроде как не зашкварно вызывать eval для создания новых функций в рантайме, что позволит мне совместить лучшее из двух миров — и рыбку съесть, и, так сказать, принять участие в культурной программе. Завтра с утра попробую всё это перевести в код 😅
🔥5
#мысль_в_душе

Открою новую рубрику такой внезапной мыслью, пришедшей, пока откисал в ду́ше после йоги:
суффикс -ng в названиях некоторых опенсорсных проектов (чтобы за примером далеко не ходить, syslog-ng) — это MOTHERFUCKING EVANGELION REFERENCE, потому что NG можно расшифровать как Neon Genesis 😅
🤯3🤔2🤣2
#лытдыбр #common_lisp

Тут в личку в мастодоне принесли статью-реакцию на мой туториал по ECS: https://edoput.it/2023/11/19/data-oriented-clos.html вот уж не думал, что доживу до публичных диссов на свои статьи 😅
Статья сыроватая. Автор, сам, видимо, большой специалист в макросах, пишет, что типа всё круто, но я, во-первых, изобрёл для ECS свой язык, не являющийся Lisp (сложно спорить, это само определение DSL), и что во-вторых, я переизобрёл обновление структур данных на ходу (это тоже верно), хотя такое есть в CLOS (Common Lisp Object System). Ну и дальше теоретизирует, мол, можно сделать то же самое, но поверх CLOS с использованием MOP (MetaObject Protocol), потому что там под капотом можно заставить объекты храниться как угодно, хоть в кастомных аренах. Тут уже мне не хватает знаний для оценки его правоты — CLOS я всегда недолюбливал из-за тормознутости, а осилить MOP никогда не хватало терпения 😂
В общем, можно либо попробовать-таки занырнуть в MOP, либо спокойно положить в бэклог пунктик "переписать интерфейс с рукодельных макросов на CLOS" и сделать такое где-нибудь ближе к версии 1.0 😊
🏆8🔥1
#лытдыбр #common_lisp

Продолжаю в свободное от работы время потихоньку ковырять на утренних стримах свой игровой движок на Common Lisp, уже почти допилил чистовую реализацию деревьев поведения, и тут столкнулся с интересным багом в ECS-фреймворке — при интерактивном переопределении компонента он удаляется с тех сущностей, где он имел место быть, даже если все слоты в компоненте остались нетронутыми. У меня про это даже есть древнее TODO от марта сего года, потому что я поленился сразу прописать полноценное копирование данных при переопределении компонента. Этот недосмотр на самом деле сильно снижает юзабельность интерактивной разработки, с помощью которой можно продавать лисп неофитам 😅
Штош, примерный план, как это можно сделать, накидал, попробую реализовать на завтрашнем стриме 😊
4👍2
This media is not supported in your browser
VIEW IN TELEGRAM
#лытдыбр

Кажется, в номинации "краш года" есть победитель, причём с большим отрывом 😊
Этим крашем была Ника Тарасевич ❤️
👍21
#common_lisp

Буквально только что случился TASK FAILED SUCCESSFULLY. Предыстория такова: у меня есть реп, в котором через Github CI билдится версия компилятора Common Lisp SBCL с поддержкой Windows 7, последней худо-бедно юзабельной версии шиндуса. В версии 2.3.10 авторы SBCL что-то наворотили с процессом сборки, и мои хитрые сборочные скрипты сломались, а с наскока их починить не получилось, так что отложил на потом.
Решил сегодня попробовать ещё один подход к снаряду, чуть-чуть поковырялся, но опять ничего не вышло 😩 Собрался уже плюнуть, потом смотрю — версия SBCL обновилась до 2.3.11, они же каждый месяц релизы фигачат, как горячие пирожки. Дай, думаю, для порядка тоже версию бампану, один чёрт не соберётся. Не глядя пушу апдейт, собрался уже пойти смотреть подкаст с Тарасевич, смотрю — два письма от github пришло, ух клятi microsoft. В первом говорят, что извините, ваш пайплайн зафейлился, во втором — ваш новый релиз 2.3.11 готов. Оказывается:
1. Разработчики SBCL таки вправили сборочную систему на место,
2. всё скомпилировалось, но под конец github'овский билдер жиденько пукнул, не оказавшись в состоянии зааплоадить артефакт сборки куда надо,
3. но релиз с нужным файлом всё-таки создался.

Так что можно снова наслаждаться сборочками SBCL под винду 😊
🔥43🎉1