#репост
Как говорится, вашими бы устами да мёд пить.
Давно уже понял про себя, что мне куда больше по душе проекты-долгострои, нежели проекты с чётко очерченными дедлайнами, хотя дедлайны, конечно, по-своему тонизируют. Примерно как рука, спросонья обожжённая об горячую плиту тонизируют, ага.
Как говорится, вашими бы устами да мёд пить.
Хабр
Остановись, мгновенье. Медленное программирование — тренд для уставших разработчиков
Как же хочется иногда остановить дикую гонку разработки и получить удовольствие от вдумчивого, размеренного написания кода. Как же не хватает времени на обдумывание алгоритмов и исследование...
❤2👍1
#лытдыбр #common_lisp
Взявшись за написание красивой демки для своей ECS-библиотеки, вот уже во второй раз натыкаюсь на какой-то совершенно адский фундаментальный косяк, который каким-то образом не был выловлен автоматическими тестами. Видимо, придётся сегодня сделать ещё один минорный релиз, а то вдруг Зак наконец разродится новым апдейтом Quicklisp и в нём окажется версия моей библиотеки с багом. Нет слов, как же я на себя зол 😡
Взявшись за написание красивой демки для своей ECS-библиотеки, вот уже во второй раз натыкаюсь на какой-то совершенно адский фундаментальный косяк, который каким-то образом не был выловлен автоматическими тестами. Видимо, придётся сегодня сделать ещё один минорный релиз, а то вдруг Зак наконец разродится новым апдейтом Quicklisp и в нём окажется версия моей библиотеки с багом. Нет слов, как же я на себя зол 😡
GitLab
Fixed bug causing runtime error in MAKE-STORAGE inside of dumped binary (aa9f1e28) · Commits · Andrew Kravchuk / cl-fast-ecs ·…
Blazingly fast Entity-Component-System microframework ⚡📦
🔥2
#репост #common_lisp
Во многом согласен с коллегой по лисповому сообществу, просто не могу не репостнуть 😊
Во многом согласен с коллегой по лисповому сообществу, просто не могу не репостнуть 😊
Forwarded from akater
Я выбрал Лисп по нескольким причинам, но в ретроспективе получается, что многие из них вытекают из «Лисп дает своему пользователю максимальную свободу». (Лиспом я называю язык, где есть defun, defmacro, defmethod, unwind-protect, loop, и все это охотно используется.)
Далеко не все языки дают пользователю много свободы. Многие люди предпочитают, чтобы язык ограничивал их (и их коллег — подозреваю, этот момент для многих важнее). Далеко не все считают, что возможность выстрелить себе в ногу — это хорошо.
Лисп старается максимально удалить себя из пространства между его юзером и задачей, которую решает этот юзер. Многие известные его фичи — sexp-синтаксис, макросы, интерактивность, кондишны — как и менее известные ридер-макросы, методокомбинаторы — это лишь следствия этого подхода.
Мне было и есть неприятно программировать не на Лиспе. И по сей день, когда мне нужно написать какое-то сложное условие для if в shell script, я нередко ищу в вебе, какие буквы там писать — и иногда так и не нахожу! Это безумие. В Лиспе с его универсальным
Лисп обеспечивает «первую свободу» по Столлману больше, чем что-либо еще, т.к. он дает максимум возможностей и удобства модифицировать работающую программу. Никто не пользуется первой свободой так, как пользователи GNU Emacs, и это благодаря Лиспу. И я уверен, что никакая социальная группа юзеров опенсорс в мире не читает исходники так активно, как это делают пользователи Emacs.
Первую свободу дает интерактивность. Можно перекомпилировать отдельную функцию в любой момент, и она становится частью работающей сейчас системы. В Common Lisp нет неизбежной необходимости дублировать выполненные вычисления из-за возникшей в ходе вычисления ошибки, благодаря кондишнам. Состояние программы всегда можно поправить, находясь в самой программе. Я никогда не думаю, что «я пишу код» — я живу в системе, которую расширяю. Это все характеризует интерактивность, недоступную за пределами Лиспа. Помимо интерактивности, в первую свободу делает важный вклад свобода самовыражения.
Не так давно я общался с одним студентом, который активно пишет на Python. Мы обсуждали какой-то его код на Python, и я спросил «почему бы тут не написать switch»? И он сказал «в Python, к сожалению, нет switch». Мне это вновь напомнило, насколько ужасна была бы для меня жизнь как у тех, кто не может себе написать switch, или, скажем, добавить в функции киворды / kwargs по-пайтоновски, если этого нет.
Лисп — это для меня не язык. Это система программирования и способ взаимодействовать с компьютером, разумная альтернатива Юниксу. Я собираюсь так взаимодействовать с компьютером, пока не умру. Сейчас я живу в GNU Emacs, разумеется. Именно Лисп делает это возможным, и альтернатив попросту нет.
Далеко не все языки дают пользователю много свободы. Многие люди предпочитают, чтобы язык ограничивал их (и их коллег — подозреваю, этот момент для многих важнее). Далеко не все считают, что возможность выстрелить себе в ногу — это хорошо.
Лисп старается максимально удалить себя из пространства между его юзером и задачей, которую решает этот юзер. Многие известные его фичи — sexp-синтаксис, макросы, интерактивность, кондишны — как и менее известные ридер-макросы, методокомбинаторы — это лишь следствия этого подхода.
Мне было и есть неприятно программировать не на Лиспе. И по сей день, когда мне нужно написать какое-то сложное условие для if в shell script, я нередко ищу в вебе, какие буквы там писать — и иногда так и не нахожу! Это безумие. В Лиспе с его универсальным
(f x y)
мне этого никогда не нужно делать, и это было первое, что мне в свое время понравилось в первом языке, на котором мне было приятно программировать (Wolfram Language / Mathematica).Лисп обеспечивает «первую свободу» по Столлману больше, чем что-либо еще, т.к. он дает максимум возможностей и удобства модифицировать работающую программу. Никто не пользуется первой свободой так, как пользователи GNU Emacs, и это благодаря Лиспу. И я уверен, что никакая социальная группа юзеров опенсорс в мире не читает исходники так активно, как это делают пользователи Emacs.
Первую свободу дает интерактивность. Можно перекомпилировать отдельную функцию в любой момент, и она становится частью работающей сейчас системы. В Common Lisp нет неизбежной необходимости дублировать выполненные вычисления из-за возникшей в ходе вычисления ошибки, благодаря кондишнам. Состояние программы всегда можно поправить, находясь в самой программе. Я никогда не думаю, что «я пишу код» — я живу в системе, которую расширяю. Это все характеризует интерактивность, недоступную за пределами Лиспа. Помимо интерактивности, в первую свободу делает важный вклад свобода самовыражения.
Не так давно я общался с одним студентом, который активно пишет на Python. Мы обсуждали какой-то его код на Python, и я спросил «почему бы тут не написать switch»? И он сказал «в Python, к сожалению, нет switch». Мне это вновь напомнило, насколько ужасна была бы для меня жизнь как у тех, кто не может себе написать switch, или, скажем, добавить в функции киворды / kwargs по-пайтоновски, если этого нет.
Лисп — это для меня не язык. Это система программирования и способ взаимодействовать с компьютером, разумная альтернатива Юниксу. Я собираюсь так взаимодействовать с компьютером, пока не умру. Сейчас я живу в GNU Emacs, разумеется. Именно Лисп делает это возможным, и альтернатив попросту нет.
🔥6
#common_lisp #лытдыбр
Итак, дёмка моего ECS-фреймворка работает примерно в 5-6 раз медленнее, чем аналогичный код с использованием C-шного фреймворка Flecs. Чего-то подобного я ожидал, но всё равно неприятно. Поверхностный анализ показал, что прорва времени теряется на уровне FFI, при вызове функций для отрисовки из liballegro. Полез разбираться — выяснилось, что в liballegro структура с указанием цвета
Решил для дёмки попробовать какую-нибудь другую графическую либу вместо liballegro, и тут выяснилось, что практически все из них (ну окей, не все, а raylib и SFML), как будто сговорившись, передают структуры с цветом по значению, и только набившая оскомину SDL2 с довольно среднего качества лисповыми биндингами принимает компоненты цвета по-человечески, тупо целочисленными аргументами на стеке, наглядная демонстрация: на SDL выставление цвета отрисовки занимает 153 байта машинных инструкций, вместе с проверкой на ошибки, а на liballegro одно только создание структуры с цветом занимает почти два килобайта (!).
Буду завтра на стриме переписывать дёмку на SDL2, чо 😅
Итак, дёмка моего ECS-фреймворка работает примерно в 5-6 раз медленнее, чем аналогичный код с использованием C-шного фреймворка Flecs. Чего-то подобного я ожидал, но всё равно неприятно. Поверхностный анализ показал, что прорва времени теряется на уровне FFI, при вызове функций для отрисовки из liballegro. Полез разбираться — выяснилось, что в liballegro структура с указанием цвета
ALLEGRO_COLOR
передаётся во все функции "по значению", т.е. не через указатель, а тупо все поля складываются на стек; а документация к лисповому компилятору SBCL гласит, что "Passing of structures by value is not implemented", поэтому CFFI для передачи этой структуры городит в результирующем коде какой-то адский фарш из дженериков и ручного выделения памяти на куче под эту структуру, я вообще удивлён, что это в 5 раз медленнее, а не во все 50.Решил для дёмки попробовать какую-нибудь другую графическую либу вместо liballegro, и тут выяснилось, что практически все из них (ну окей, не все, а raylib и SFML), как будто сговорившись, передают структуры с цветом по значению, и только набившая оскомину SDL2 с довольно среднего качества лисповыми биндингами принимает компоненты цвета по-человечески, тупо целочисленными аргументами на стеке, наглядная демонстрация: на SDL выставление цвета отрисовки занимает 153 байта машинных инструкций, вместе с проверкой на ошибки, а на liballegro одно только создание структуры с цветом занимает почти два килобайта (!).
Буду завтра на стриме переписывать дёмку на SDL2, чо 😅
❤5🤪1
#лытдыбр
Выбор ссылки, которая станет превью поста в телеграме — это, блядь, какая-то безвыигрышная лотерея: как ты не ебись, оно сделает так, как не нужно, и это один из немногих косяков, который становится лишь очевиднее после того, как заводишь свой канал. В который раз уже повторюсь, что более косоёбого мессенджера, чем телеграм, я в жизни ни разу не видел, а я настолько мастодонт, что застал ещё ICQ и Miranda. Сколько г-н Дуров вбухал в маркетинг, чтобы все этим костыльным говном пользовались, мне даже примерно представить страшно.
Выбор ссылки, которая станет превью поста в телеграме — это, блядь, какая-то безвыигрышная лотерея: как ты не ебись, оно сделает так, как не нужно, и это один из немногих косяков, который становится лишь очевиднее после того, как заводишь свой канал. В который раз уже повторюсь, что более косоёбого мессенджера, чем телеграм, я в жизни ни разу не видел, а я настолько мастодонт, что застал ещё ICQ и Miranda. Сколько г-н Дуров вбухал в маркетинг, чтобы все этим костыльным говном пользовались, мне даже примерно представить страшно.
😁1
#лытдыбр #видео
Вчера хвастался своей реализацией самодельного интерпретатора лиспа на сишечьке, сделанной между делом в рамках бесплатного курса. Спасибо Андрею за то, что взял за руку и протащил по этому пути 😁
Упаси меня боже занырнуть в эту сторону с головой и начать писать компилятор своего диалекта лиспа в LLVM-биткод, мне же тогда точно спать станет некогда 😅
Вчера хвастался своей реализацией самодельного интерпретатора лиспа на сишечьке, сделанной между делом в рамках бесплатного курса. Спасибо Андрею за то, что взял за руку и протащил по этому пути 😁
YouTube
Liscript (пишем свой Лисп) - 6
🔥3😁1
#common_lisp
Сегодня с утра на стриме с удивлением узнал на опыте, что в SBCL декларация
Сегодня с утра на стриме с удивлением узнал на опыте, что в SBCL декларация
(optimize (space 0))
приводит не к увеличению производительности (хотя казалось бы, если компилятору насрать на всё, включая размер, он потенциально может сделать более большой, но более быстро работающий код), а вовсе наоборот — к деградации скорости работы, причём в моём случае аж в два раза. Век живи — век учись 😅🔥1
#clojure
Минутка бесстыдной рекламы: вот уже в этот четверг, 27 апреля, начнётся первый поток курса Clojure Developer в Otus, к которому ваш покорный немножко приложил руку, и, более того, будет вести в нём несколько занятий. Команда курса собрана очень сильная, поэтому, если всегда хотелось занырнуть в мир разработки на Clojure, добро пожаловать 😊
Минутка бесстыдной рекламы: вот уже в этот четверг, 27 апреля, начнётся первый поток курса Clojure Developer в Otus, к которому ваш покорный немножко приложил руку, и, более того, будет вести в нём несколько занятий. Команда курса собрана очень сильная, поэтому, если всегда хотелось занырнуть в мир разработки на Clojure, добро пожаловать 😊
otus.ru
Курс clojure Developer
Best Practices по одному из любимых языков разработчиков
❤2
#лытдыбр
Хотел тут на этой неделе сделать небольшую паузу и подкопить немного сил перед предстоящим в конце мая Lisp game jam 2023, но жизнь внесла свои коррективы — во вторник на улице шёл град, я закрыл все ставни на балконе, пошёл в магаз, а когда минут через десять вернулся, полбалкона в граде, а в самой квартире (съёмной, на секундочку) всё плавает в воде по щиколотку, хорошо хоть ничего не закоротило, кроме блока питания к ноутбуку. Как мне потом объясняли, град на балкон умудрился попасть каким-то невероятным образом через ливневую канализацию. В итоге вместе с хозяйкой весь день вычёрпывали воду и паниковали по поводу паркета, и до сих пор абсолютно все мышцы в моём теле болят 😭 Такой вот непреднамеренный отдых, лол
Хотел тут на этой неделе сделать небольшую паузу и подкопить немного сил перед предстоящим в конце мая Lisp game jam 2023, но жизнь внесла свои коррективы — во вторник на улице шёл град, я закрыл все ставни на балконе, пошёл в магаз, а когда минут через десять вернулся, полбалкона в граде, а в самой квартире (съёмной, на секундочку) всё плавает в воде по щиколотку, хорошо хоть ничего не закоротило, кроме блока питания к ноутбуку. Как мне потом объясняли, град на балкон умудрился попасть каким-то невероятным образом через ливневую канализацию. В итоге вместе с хозяйкой весь день вычёрпывали воду и паниковали по поводу паркета, и до сих пор абсолютно все мышцы в моём теле болят 😭 Такой вот непреднамеренный отдых, лол
🤯1😢1
#лытдыбр #common_lisp #проекты
В рамках подготовки к Lisp game jam возродил тут проект по сборке бинарников SBCL под старые виндусы (включая шиндус 7 — официальный бинарь с sbcl.org работает только под десяткой+). Провозился несколько часов, разобрался с Github Actions и даже зарепортил баг в SBCL — система сборки у него, конечно, заслуживает эпитета "хтонический", но в конечном итоге последняя версия (2.3.4) успешно работает. Забирайте, кому нужно 😊
В рамках подготовки к Lisp game jam возродил тут проект по сборке бинарников SBCL под старые виндусы (включая шиндус 7 — официальный бинарь с sbcl.org работает только под десяткой+). Провозился несколько часов, разобрался с Github Actions и даже зарепортил баг в SBCL — система сборки у него, конечно, заслуживает эпитета "хтонический", но в конечном итоге последняя версия (2.3.4) успешно работает. Забирайте, кому нужно 😊
🔥5
#статьи #common_lisp
Лентой принесло статью про лиспы, которой хотелось бы поделиться. Автор исследует вопрос, что же вообще делает какой-то конкретный язык Lisp'ом; утверждает, что любой акт программирования — это акт создания своего языка, даже когда ты этого не замечаешь, а затем акт его использования (тут на ум сразу приходят шаблоны Django или SQL). Наконец, автор приводит пару примеров из практики на Common Lisp приходит к выводу, что лисп — это любой язык, в котором есть возможность конструировать свои (суб-)языки. Можно спорить о том, насколько часто эта возможность используется (в той же Clojure вроде как многие бестпрактисы отсоветывают писать свои макросы), но в целом со статьёй согласен, лёгкость написания DSL в лиспах — это самая его убойная киллерфича, как мне кажется.
Лентой принесло статью про лиспы, которой хотелось бы поделиться. Автор исследует вопрос, что же вообще делает какой-то конкретный язык Lisp'ом; утверждает, что любой акт программирования — это акт создания своего языка, даже когда ты этого не замечаешь, а затем акт его использования (тут на ум сразу приходят шаблоны Django или SQL). Наконец, автор приводит пару примеров из практики на Common Lisp приходит к выводу, что лисп — это любой язык, в котором есть возможность конструировать свои (суб-)языки. Можно спорить о том, насколько часто эта возможность используется (в той же Clojure вроде как многие бестпрактисы отсоветывают писать свои макросы), но в целом со статьёй согласен, лёгкость написания DSL в лиспах — это самая его убойная киллерфича, как мне кажется.
www.tfeb.org
Nirvana
An article constructed from several emails from my friend Zyni, reproduced with her permission. Note that Zyni's first language is not English....
👍1
#мемасики
В зарубежных интернетах есть такой мемчик, The missile knows where it is, выстёбывающий формалистский текст ради текста (как раз такой, который любит генерировать модный нынче ChatGPT), совершенно шизоидного содержания, типа "ракета знает, где находится, потому что знает, где она не находится". Так вот, на днях наткнулся на ютубе на двухминутный видос с этим текстом, наложенным на демонстрацию кода на JS, и меня чёт вообще порвало 🤣
В зарубежных интернетах есть такой мемчик, The missile knows where it is, выстёбывающий формалистский текст ради текста (как раз такой, который любит генерировать модный нынче ChatGPT), совершенно шизоидного содержания, типа "ракета знает, где находится, потому что знает, где она не находится". Так вот, на днях наткнулся на ютубе на двухминутный видос с этим текстом, наложенным на демонстрацию кода на JS, и меня чёт вообще порвало 🤣
#common_lisp
В рамках подготовки к Lisp Game Jam 2023 уже сделяль шаблон для игрового проекта с использованием SDL2, которую я раньше избегал в пользу liballegro. Как выясняется, мне были уготованы пара открытий чудных: во-первых, в биндинге SDL2 к CL очень много "медвежьих услуг" в стиле автоматического удаления сишных указателей с кучи через финалайзеры
Во-вторых, GC в SBCL, конечно, весьма чудной, что под линуксом (см. рис. 1), что под шиндой (см. рис. 2). Сказали ему при компиляции, что общий размер доступной ему кучи 2 Гб, и он не особо шевелится вплоть до момента, пока не будет сожран гигабайт с хвостиком 😂
В рамках подготовки к Lisp Game Jam 2023 уже сделяль шаблон для игрового проекта с использованием SDL2, которую я раньше избегал в пользу liballegro. Как выясняется, мне были уготованы пара открытий чудных: во-первых, в биндинге SDL2 к CL очень много "медвежьих услуг" в стиле автоматического удаления сишных указателей с кучи через финалайзеры
trivial-garbage
, как будто я сам не могу условный free
дёрнуть (а если так сделать вместе с финалайзером, то через неопределённый период времени игра крэшится или тупо зависает).Во-вторых, GC в SBCL, конечно, весьма чудной, что под линуксом (см. рис. 1), что под шиндой (см. рис. 2). Сказали ему при компиляции, что общий размер доступной ему кучи 2 Гб, и он не особо шевелится вплоть до момента, пока не будет сожран гигабайт с хвостиком 😂
🤔2
#common_lisp
Итак, вот уже в эту пятницу начнётся Lisp game jam. Я к его началу собрался подготовить cokiecutter-шаблон для игры на CL, с выбором варианта middleware-библиотеки (SDL2, liballegro, raylib) и с автоматической сборкой готовых бинарников для трёх основных платформ (Linux, MacOS, Windows). Так вот, сегодня с утра доделал вариант с raylib, который на удивление занимает меньше всего кода и меньше всего места в скомпилированном виде. Под линукс и шинду уже всё готово, это, на секундочку, шесть протестированных вариантов сборки. Попробовал ткнуться в сборку под MacOS, установив у себя в kvm-виртуалку Monterey (а затем и High Sierra в VirtualBox), и я должен сказать, что там не работает НИХУЯ, по буквам: Николай, Иван, Харитон, Ульяна, Ярослав. Ну то есть код с использованием liballegro крэшится где-то в недрах кода макоси при её, liballegro, инициализации, код SDL2 намертво залипает на каком-то мьютексе внутряхоткрыто и смело прямо в лицо, что
Теперь надо написать статью на хабр с анонсом геймджема, и ещё поспать бы, а то на улице жара такая, а я не выспался 🥱
Итак, вот уже в эту пятницу начнётся Lisp game jam. Я к его началу собрался подготовить cokiecutter-шаблон для игры на CL, с выбором варианта middleware-библиотеки (SDL2, liballegro, raylib) и с автоматической сборкой готовых бинарников для трёх основных платформ (Linux, MacOS, Windows). Так вот, сегодня с утра доделал вариант с raylib, который на удивление занимает меньше всего кода и меньше всего места в скомпилированном виде. Под линукс и шинду уже всё готово, это, на секундочку, шесть протестированных вариантов сборки. Попробовал ткнуться в сборку под MacOS, установив у себя в kvm-виртуалку Monterey (а затем и High Sierra в VirtualBox), и я должен сказать, что там не работает НИХУЯ, по буквам: Николай, Иван, Харитон, Ульяна, Ярослав. Ну то есть код с использованием liballegro крэшится где-то в недрах кода макоси при её, liballegro, инициализации, код SDL2 намертво залипает на каком-то мьютексе внутрях
cl-sdl2
, и только raylib говорит Failed to initialize Graphic Device
, хотя хочу заметить, что под виндой с софтверным рендерером в том же VirtualBox все три варианта прекрасно бегают. По хорошему, надо бы попробовать сделать в KVM GPU pass-through, но моя Nvidia поддерживается только в High Sierra и ранее, а хайсьерра в QEMU не ставится, мотивируя отказ тем, что не может до серверов эппла достучаться, хотя интернет у неё есть. А это я ещё даже не прикасался к теме компиляции под Apple Silicon, там вообще гроб гроб кладбище пидор. В общем, решил пока подзабить на макось, если будет по ходу дела время, попробую чё-то поковырять, в идеале вообще нужно где-то приобрести старенький мак и на нём экспериментировать, но это уже не для моих финансовых условий.Теперь надо написать статью на хабр с анонсом геймджема, и ещё поспать бы, а то на улице жара такая, а я не выспался 🥱
🔥4
#common_lisp #проекты
Ну штош, выкатил на гитхаб свой шаблон для игры на Common Lisp 🎉 Эх, давненько я так плотно с CI пайплайнами не развлекался 😅
Завтра на стриме, наверное, вернусь к ECS-библиотеке, надеюсь, ещё пару мажорных фич успею реализовать до пятницы.
Ну штош, выкатил на гитхаб свой шаблон для игры на Common Lisp 🎉 Эх, давненько я так плотно с CI пайплайнами не развлекался 😅
Завтра на стриме, наверное, вернусь к ECS-библиотеке, надеюсь, ещё пару мажорных фич успею реализовать до пятницы.
GitHub
GitHub - lockie/cookiecutter-lisp-game: A cookiecutter template for Common Lisp videogame projects
A cookiecutter template for Common Lisp videogame projects - lockie/cookiecutter-lisp-game
🔥2
#common_lisp #статьи
Давно хотел запостить на хабр перевод программной статьи г-жи Хафнер про особенности использования Common Lisp в разработке игр, и вот наконец подвернулась оказия)
Апвоуты приветствуются ❤️
https://habr.com/ru/articles/737316
Давно хотел запостить на хабр перевод программной статьи г-жи Хафнер про особенности использования Common Lisp в разработке игр, и вот наконец подвернулась оказия)
Апвоуты приветствуются ❤️
https://habr.com/ru/articles/737316
Хабр
Использование высокодинамичного языка для разработки
Преимущества и навыки, полученные при использовании Common Lisp в разработке игр Разработка игр является увлекательной задачей. Игры требуют быстрого цикла разработки, высокой интерактивности и задают...
❤6