Изучаю Common Lisp, иногда люблю поразмышлять над вопросами мироздания, о чем и планирую писать сюда, и надеюсь, это будет читаемо. Да, иногда обозначенные выше тему будут пересекаться, как же иначе.
В остальном, наверное, обычный обитатель федиверса: *nix, FOSS, шифрование, и прочая атрибутика сущности без личной жизни.
Кажется, базовый функционал AppDealer готов. Можно устанавливать и удалять приложения, а также выводить список установленных на данный момент. При удалении приложения помещаются в аналог "корзины", которую можно почистить командой purge.
Перед тем, как начинать плавно причесывать код, хотелось бы сделать еще несколько функциональных нововведений: возможность посмотреть, что сейчас в корзине, (возможно) восстановление файлов из корзины, а также установка приложения с переопределенными аттрибутами (имя файла, название команды, название приложения), и изменение аттрибутов уже установленных.
Впрочем, приложение можно начинать использовать и без этого. Для этого достаточно скомпилировать main.scm с помощью chicken-scheme, предварительно установив egg sqlite3.
После допиливания базового функционала хотелось бы сконцентрироваться на рефакторинге. И я даже не про приведение к более функциональному стилю: не знаю, получится ли вообще такое, особенно если учесть, что по сути каждое действие имеет "сторонние эффекты", и чистых функций почти нет. Я говорю хотя бы про переход от include к import (ибо, кажется, в chicken-scheme нет защиты от двойного включения), более адекватная обработка ошибок (а то сейчас валятся стэктрейсы), и, возможно, какая-нибудь система сборки (хотя бы скрипт, проверяющий наличие зависимостей).
И все же, несмотря на то, что работа еще далека от полного завершения, определенные выводы можно сделать уже сейчас. Дало ли мне это какие-нибудь новые знания? Да, но не совсем ожидаемые: до этого мне не приходилось работать с SQLite. Было ли написание кода на Scheme чем-нибудь особенным? Скорее нет. Возможно, причина в том, что у меня не получилось достигнуть "дзена" ФП, и вся кодовая база -- натягивание совы на глобус. Было ли мне интересно и весело? Да, конечно, иначе бы оно так далеко не зашло. Буду ли я использовать этот софт? Вероятно. Я довольно часто пользуюсь AppImage, ибо предпочитаю его, а не flatpak, при отсутствии пакета в репозиториях. Будет ли его использовать кто-то другой? Зависит от кого-то другого...
Напоминаю, что на проект можно посмотреть вот здесь: https://git.disroot.org/lambda-yam/appdealer
С удовольствием посмотрю ваши идеи, ПРы, жалобы и угрозы.
Кажется, базовый функционал AppDealer готов. Можно устанавливать и удалять приложения, а также выводить список установленных на данный момент. При удалении приложения помещаются в аналог "корзины", которую можно почистить командой purge.
Перед тем, как начинать плавно причесывать код, хотелось бы сделать еще несколько функциональных нововведений: возможность посмотреть, что сейчас в корзине, (возможно) восстановление файлов из корзины, а также установка...
Кажется, базовый функционал AppDealer готов. Можно устанавливать и удалять приложения, а также выводить список установленных на данный момент. При удалении приложения помещаются в аналог "корзины", которую можно почистить командой purge.
Перед тем, как начинать плавно причесывать код, хотелось бы сделать еще несколько функциональных нововведений: возможность посмотреть, что сейчас в корзине, (возможно) восстановление файлов из корзины, а также установка приложения с переопределенными аттрибутами (имя файла, название команды, название приложения), и изменение аттрибутов уже установленных.
Впрочем, приложение можно начинать использовать и без этого. Для этого достаточно скомпилировать main.scm с помощью chicken-scheme, предварительно установив egg sqlite3.
После допиливания базового функционала хотелось бы сконцентрироваться на рефакторинге. И я даже не про приведение к более функциональному стилю: не знаю, получится ли вообще такое, особенно если учесть, что по сути каждое действие имеет "сторонние эффекты", и чистых функций почти нет. Я говорю хотя бы про переход от include к import (ибо, кажется, в chicken-scheme нет защиты от двойного включения), более адекватная обработка ошибок (а то сейчас валятся стэктрейсы), и, возможно, какая-нибудь система сборки (хотя бы скрипт, проверяющий наличие зависимостей).
И все же, несмотря на то, что работа еще далека от полного завершения, определенные выводы можно сделать уже сейчас. Дало ли мне это какие-нибудь новые знания? Да, но не совсем ожидаемые: до этого мне не приходилось работать с SQLite. Было ли написание кода на Scheme чем-нибудь особенным? Скорее нет. Возможно, причина в том, что у меня не получилось достигнуть "дзена" ФП, и вся кодовая база -- натягивание совы на глобус. Было ли мне интересно и весело? Да, конечно, иначе бы оно так далеко не зашло. Буду ли я использовать этот софт? Вероятно. Я довольно часто пользуюсь AppImage, ибо предпочитаю его, а не flatpak, при отсутствии пакета в репозиториях. Будет ли его использовать кто-то другой? Зависит от кого-то другого...
Напоминаю, что на проект можно посмотреть вот здесь: https://git.disroot.org/lambda-yam/appdealerhttps://git.disroot.org/lambda-yam/appdealer
С удовольствием посмотрю ваши идеи, ПРы, жалобы и угрозы.
Кажется, базовый функционал AppDealer готов. Можно устанавливать и удалять приложения, а также выводить список установленных на данный момент. При удалении приложения помещаются в аналог "корзины", которую можно почистить командой purge.
Перед тем, как начинать плавно причесывать код, хотелось бы сделать еще несколько функциональных нововведений: возможность посмотреть, что сейчас в корзине, (возможно) восстановление файлов из корзины, а также установка...
Посетила тут мысль, запишу сюда, чтобы не забыть.
Для дополнительной сохранности от ошибок можно при выполнении команды удаления чистить только символическую ссылку и базу данных, а сам AppImage перемещать в папку, которая по сути будет аналогом "корзины". И сделать отдельную команду purge для окончательного удаления всего содержимого этой папки.
Места, вроде бы, сейчас в достатке, можно ради дополнительной страховки повременить с удалением.
Сомневаюсь, правда, что конкретно мне оно окажется полезным.
Посетила тут мысль, запишу сюда, чтобы не забыть.
Для дополнительной сохранности от ошибок можно при выполнении команды удаления чистить только символическую ссылку и базу данных, а сам AppImage перемещать в папку, которая по сути будет аналогом "корзины". И сделать отдельную команду purge для окончательного удаления всего содержимого этой папки.
Места, вроде бы, сейчас в достатке, можно ради дополнительной...
Кажется, у меня получилось прикрутить задуманные алгоритмы установки и вывода списка. Даже сложно поверить, что когда получится реализовать удаление, оно станет относительно используемым. Есть, правда, ощущение, что по количеству велосипедов мой код в ближайшее время начнет обгонять прогрессивные города. В будущем постараюсь использовать больше зависимостей, а пока пусть будет так. Кто знает, может, этим проектом кто-нибудь всерьез начнет пользоваться, придется тогда браться за ум.
Ну что же, раз firefox отказывается дружить с FreeBSD, то логично попробовать вместо него Chromium. На выбор было аж целых два: обычный и ungoogled.
По итогу установлен ungoogled, ибо таков путь криптошизов, хоть я и чувствую, как с каждой секундой его использования этот титул от меня ускользает.
Вроде бы вкладки на нем не крашатся, но вот колесико мышки все еще себя странно ведет. Поисковик подкидывает инфу, что qemu как-то криво его маппит в гостевую ОС, если это FreeBSD. Походу пока что придется с этим смириться.
Ну что же, раз firefox отказывается дружить с FreeBSD, то логично попробовать вместо него Chromium. На выбор было аж целых два: обычный и ungoogled.
По итогу установлен ungoogled, ибо таков путь криптошизов, хоть я и чувствую, как с каждой секундой его использования этот титул от меня ускользает.
Вроде бы вкладки на нем не крашатся, но вот колесико мышки все еще себя странно ведет. Поисковик подкидывает...
Итак, вот уже середина октября, а от меня ни слуху, ни духу.
Неужели мои слова вновь оказались пустыми, и проект заброшен, толком и не начавшись?
А вот и нет.
Теперь помимо компа сижу на виртуалке с FreeBSD. Там не очень стабильно работает огнелис, и вкладки постоянно падают, на давая залогиниться в щепку, а Badwolf misskey вообще отказывается принимать за что-то адекватное и подходящее (что, в целом, не слишком далеко от правды).
Начат ли проект?
Да, вот ссылка на репозиторий, можешь зайти и почитать, если интересно: https://git.disroot.org/lambda-yam/appdealer
В целом стараюсь поддерживать код структурированным, руководствуясь своим опытом в ООП и чувством прекрасного, но из-за этого имена некоторых процедур неоправданно велики.
На данный момент реализована примитивная работа с базой данных и заготовки для работы с файловыми путями. Не особо много, но стоит принять во внимание, что это не стандартная библиотека языка, да и опыта с sqlite у меня до этого момента не было.
Но в целом прогресс есть, и довольно неплохой, по моим скромным оценкам. Правда, временами приходится городить велосипеды, и у меня вот вообще нет уверенности в том, что этот код воплощает Ъ-функциональную парадигму. Возможно, по меркам Scheme он ужасен и требует сожжения. Время и опыт покажут.
Итак, вот уже середина октября, а от меня ни слуху, ни духу.
Неужели мои слова вновь оказались пустыми, и проект заброшен, толком и не начавшись?
А вот и нет.
Теперь помимо компа сижу на виртуалке с FreeBSD. Там не очень стабильно работает огнелис, и вкладки постоянно падают, на давая залогиниться в щепку, а Badwolf misskey вообще отказывается принимать...
Выяснилось, что Codeberg считает почту на cock.li не подходящей для регистрации, поскольку она легко создается.
Впрочем, в отказе также была почта, куда можно было написать просьбу зарегистрироваться именно с такой почтой, описав причину, так что еще не все потеряно. В итоге к ним ушло мое обещание, что я буду хорошей лямбдой, и не буду делать гадостей и глупостей. Посмотрим, к чему приведет, но пока что публикация исходников appdealer задерживается. Возможно, оно и к лучшему, потому что пока это все еще нефункциональный кусок секспрешшенов (s-experssions, а не то, что вы подумали). До этого не доводилось работать с базами данных, и приходится это экстренно наверстывать.
Выяснилось, что Codeberg считает почту на cock.li не подходящей для регистрации, поскольку она легко создается.
Впрочем, в отказе также была почта, куда можно было написать просьбу зарегистрироваться именно с такой почтой, описав причину, так что еще не все потеряно. В итоге к ним ушло мое обещание, что я буду хорошей лямбдой, и не буду делать гадостей и глупостей. Посмотрим, к чему приведет, но пока что публикация исходников appdealer задерживается....
Итак, теперь помимо SICPа я пытаюсь в разработку собственного велосипеда на Chicken Scheme.
Что?
Менеджер пакетов. Хотя ладно, это, конечно, громко сказано. Скорее программа, которая будет вести учет AppImage-приложений, скидывать их в одну папку, а также генерировать символические ссылки. Планирую реализовать возможность изменения отдельных аттрибутов, будь то имя файла, имя ссылки или же имя приложения. Ну и удаление / вывод списка установленных тоже будут возможны. Это MVP.
Когда?
Вы серьезно собираетесь этим пользоваться? Это же адовый велосипед, подобные решения уже наверняка давно реализованы. Но если вы -- такой же фанат Lisp и софта на нем -- здорово. Ради вас постараюсь выкатить что-то в этом месяце.
FLOSS?
Да, планирую GPL третьей версии. Хотя опять же, кому оно будет нужно... пока даже не знаю, куда залью сырцы.
Помощь нужна?
Да, будет круто, если вы сможете посмотреть и поревьювить код, когда выкачу хотя бы что-то стоящее. Денежек не прошу. О, и объясните концепт монад, тоже было бы круто. Хочу попробовать написать монады-обертки над ФС и БД.
А что уже сделано?
Парсинг имени файла на основе принятых конвенций нейминга Appimage, примитивный парсинг опций командной строки, продумана общая архитектура.
А зачем?
Порофлить, погененить контент :lainSmile:
Итак, теперь помимо SICPа я пытаюсь в разработку собственного велосипеда на Chicken Scheme.
Что?
Менеджер пакетов. Хотя ладно, это, конечно, громко сказано. Скорее программа, которая будет вести учет AppImage-приложений, скидывать их в одну папку, а также генерировать символические ссылки. Планирую реализовать возможность изменения отдельных аттрибутов,...
@lambda_yam@shitpost.poridge.club в программировании монада - это интерфейс. Тип M<_> (в нотации а-ля плюсы (или раст?)) может имплементировать монаду, если поддерживает две операции:
- return : A -> M<A>, т.е. умеет "оборачивать" любое значение
- bind : (M<A>, A -> M<B>) -> M<B>, т.е. позволяет к значению типа M<A> прицепить "коллбек" A -> M<B> и получить значение типа M<B>
Примеры: Maybe<_>, Result<E, _>, Promise<_>, List<_>
Так, я в порядке, я все еще самурай, и, хоть и с перерывами, но все еще ковыряюсь в sicp (правда, надо бы почаще).
Правда теперь с появлением бумажной копии его решения раскиданы по самым разным устройствам. Предлагаю считать моё отсутствие здесь... отпуском. Ну а что, у работяг оно имеется в наличии, путь и здесь будет.
Правда, пока что думаю, как бы разнообразить свой щитпостинг. Сомневаюсь, что многим интересны отчеты по упражнениям.
Может, действительно начать пилить какой-нибудь сайд-проект? В голове разве что менеджер appimage-ей, который автоматом будет пихать их в единое место, создавать симлинки и мб даже выдергивать из их squashfs .desktop-файлы. Да, такое наверняка уже имеется, но прикиньте такое на scheme!
Мне вот, страшно прикидывать, я же кукухой поеду :lainstress:
Хотя это тоже контент...
Так, я в порядке, я все еще самурай, и, хоть и с перерывами, но все еще ковыряюсь в sicp (правда, надо бы почаще).
Правда теперь с появлением бумажной копии его решения раскиданы по самым разным устройствам. Предлагаю считать моё отсутствие здесь... отпуском. Ну а что, у работяг оно имеется в наличии, путь и здесь будет.
Правда, пока что думаю, как бы разнообразить свой щитпостинг. Сомневаюсь, что...
Ура!
У меня наконец-то получилось прорваться через мою лень... то есть гранит науки и завершить первую главу sicp.
Стоит признаться, что в свободное время без компьютера в доступе мои руки все же доходили до чтения второй главы, хоть и без упражнений.
Реализовывать новые типы данных, "запирая" поля внутри анонимных процедур... сомневаюсь, что у меня получилось бы до такого додуматься. То, как авторы книги манипулируют Scheme, и как Scheme позволяет так собой манипулировать, впечатляет.
Вообще у меня до этого была идея попробовать реализовать какой-нибудь диалект лиспа без сборки мусора, реализовав управление памятью по типу RAII, однако же теперь понимаю, что с учетом наличия зависимости некоторых байндингов от лямбд, которые могут существовать в совершенно ином контексте, задачка эта будет гораздо сложнее, чем мне представлялось на первый взгляд (а у меня и до этого не было особых иллюзий насчет сложности данного проекта).
Впрочем, посмотрим, может, что-то и получится. Вроде бы последние упражнения в SICP как раз посвящены разработке собственного компилятора.
Ура!
У меня наконец-то получилось прорваться через мою лень... то есть гранит науки и завершить первую главу sicp.
Стоит признаться, что в свободное время без компьютера в доступе мои руки все же доходили до чтения второй главы, хоть и без упражнений.
Реализовывать новые типы данных, "запирая" поля внутри анонимных процедур... сомневаюсь, что у меня...
Что могу сказать, параграф про процедуры как обощенные методы хоть и занял приличное количество времени, но не был таким "душным" в плане упражнений, как некоторые предыдущие: достаточно было просто прикинуть, как лучше всего применить уже реализованные процедуры для решения новых задач. Идея была для меня вполне понятной, однако мои кривые руки все же внедряли косяки в реализации, из-за чего получались некорректные результаты.
А прогресс-то очень даже неплохой! Впереди последний параграф первой головы, тема вроде бы выглядит довольно понятной, но я же знаю атмосферу учебника, наверняка все это будет показано на примерах, которые будут требовать определенных математических знаний, и я буду дольше въезжать в эти концепции, нежели осваивать тему. А упражнений там приличное количество.
Что могу сказать, параграф про процедуры как обощенные методы хоть и занял приличное количество времени, но не был таким "душным" в плане упражнений, как некоторые предыдущие: достаточно было просто прикинуть, как лучше всего применить уже реализованные процедуры для решения новых задач. Идея была для меня вполне понятной, однако мои кривые руки все же внедряли косяки в реализации, из-за чего получались некорректные результаты.
А прогресс-то очень...
Как делаю это я: пишу функцию суммирования с коэффициентом, которая также принимает функцию-мутатор коэффициента с логикой "Если 2 -- то 4, иначе 2".
:lainsad:
Мой мозг отказывается понимать концепт конгруэнтности чисел в рамках Малой Теоремы Ферма в целом, и теста Миллера-Рабина в частности. Как 1 по модулю любого числа может быть не 1? Или я неправильно понимаю концепцию модуля в данном случае?
Вроде бы сопутствующий код подтверждает, что это по сути остаток от деления, но в таком случае вопрос остается актуальным.
Уфф, 6 дней с последнего поста, и почти полное отсутствие прогресса в SICP.
Хочется покодить "для себя", познать Scheme в комплексных задачках, но в такие моменты в голове у меня обычно мартышка, бьющая в тарелки.
В голову пришла разве что реализация бинарных деревьев, которыми сейчас и занимаюсь.
Вообще очень не хватает кастомных типов данных, видимо, через это надо будет перерасти и воспринимать все как вектор или список.
Возможно, получится сделать получение значений по ключевым словам, но мой разум слишком испорчен словарями, которые, оказывается, присутствуют только начиная с R6RS.
Уфф, 6 дней с последнего поста, и почти полное отсутствие прогресса в SICP.
Хочется покодить "для себя", познать Scheme в комплексных задачках, но в такие моменты в голове у меня обычно мартышка, бьющая в тарелки.
В голову пришла разве что реализация бинарных деревьев, которыми сейчас и занимаюсь.
Вообще очень не хватает кастомных типов данных, видимо,...
Окей, с подключением тестов разобрались, оказалось, что в Chicken Scheme имеется конструкция (include "file.scm"), которая работает примерно как соответствующая препроцессорная директива в Си.
А раз я на таком рубеже, то, пожалуй, стоит выложить все сделанное в свой репозиторий: https://git.bloat.cat/lambda-yam/sicp-solutions/src/branch/main/chapter-1
Эхх, все же соблазн подсмотреть решение для 1.19 (итеративный расчет числа Фибоначчи со сложностью по времени O(logn))был слишком велик, потому что идей не было.
Оказывается, мои вчерашние потуги были в правильном направлении, более того, мне оставался буквально шаг до осознания.
Теперь немного грустно от того, что не хватило усидчивости добить свой ход мыслей до конца.
Немного боюсь приступать к последнему упражнению из текущего раздела :lain_lurk:
В связи с этим активно прокрастинирую, погружаясь в абсолютно нерелевантную для SICP тему: макросы. Возможно, они появятся позже, но у меня чесались руки написать нормальную функцию для прогона тестов, чтобы не пиать каждый раз print и сопоставлять с результатом. Что (не)характерно, у меня получилось, и выглядит довольно красиво. Примерно вот такой вывод в случае успеха:
OK (+ 2 3): = 5 5
И вот такой в случае неудачи:
FAIL: (+ 2 2): expected 5, got 4
Кстати, создается впечатление, что в Scheme макросы более комплексные, чем в Common Lisp: имеется несколько "трансформеров", которые, если я правильно понимаю (а я пока что очень слабо понимаю) по-разному взаимодействуют с вызывающей средой. Благо, мне пока что хватило самой примитивной конструкции.
Немного боюсь приступать к последнему упражнению из текущего раздела :lain_lurk:
В связи с этим активно прокрастинирую, погружаясь в абсолютно нерелевантную для SICP тему: макросы. Возможно, они появятся позже, но у меня чесались руки написать нормальную функцию для прогона тестов, чтобы не пиать каждый раз print и сопоставлять с результатом. Что (не)характерно, у меня получилось, и выглядит довольно красиво. Примерно вот такой вывод в случае успеха:
Ну класс, макросы по каким-то причинам отказываются вызываться из скомпилированной библиотеки.
Круто, что Chicken Scheme умеет собирать .so, но вот, видимо, макросы -- часть синтаксиса, а в библиотеке ожидаются функции.
Если так подумать -- то логично. Макросы же разворачиваются на этапе компиляции, так что в библиотеке их отсутствие логично.
Надо придумать, как можно из этого выкрутиться.