LINUX.ORG.RU

Сообщения lovesan

 

bike 0.15.0 - кардинальное решение проблем с исключениями FPU

Форум — Development

Дотнет, вобщем-то, предназначен для убогих недоязычков. А убогие недоязычки предпочитают не отлавливать исключения FPU, так как не знают, что с ними делать, и уже тем более этого не знают программисты на убогоньких недоязычках - они предпочитают колбасить NaN-ы.

Лисп знает, но многие знания - многие печали.

Поэтому чтобы лучше работать с дотнетом, библиотека теперь отключает отлов всех исключений FPU лиспом.

https://github.com/Lovesan/bike/issues/10#issuecomment-2475022163

Это, в частности, значит, что на линуксе она теперь загружается и работает без лишних телодвижений. То есть можно даже совать в продакшн.

 , , ,

lovesan
()

Монополия TSMC

Форум — Talks

А как вообще так получилось? Как до этого дошло?

Почему никто не пытается ее оспорить? Чревато ведь. И санкциями, и прочей херней - вон не дай Б-г там случится войнушка с Китаем, так всей индустрии электроники придет трындец.

 tsmc, , ,

lovesan
()

bike 0.14.0 - документация!

Форум — Development

Теперь у библиотеки есть полноценная документация, что выгодно отличает ее от поделий на голанге, жопоскрипте и прочих питонах. Таким макаром, скоро лисп-экосистема дорастет до жабовской, или хотя бы, опять же, дотнетной.

https://github.com/Lovesan/bike/blob/master/doc/README.md

Кроме документации, доделал классы, которые могут вызываться из .NET. Вот в частности пример, как реализовать интерфейс IReadOnlyList<object> для лисповых коллекций:

https://github.com/Lovesan/bike/blob/master/examples/callable-classes.lisp

Также, добавил полноценную поддержку ECL. Единственная проблема с ECL в том, что он компилируется через Си, а так как библиотека активно использует компиляцию и кодогенерацию в рантайме(как на стороне .NET, так и в лиспе), то ECL постоянно вызывает компилятор сишечки, например GCC.

Также добавил функциональность по типу apropos, но для .NET классов, неймспейсов и членов классов.

Так, например, такой код:

(type-apropos "xml")

Выведет имена .NET классов, содержащие «xml» (сраную гору их просто; я даже сам не знал что их так много в стандартной библиотеке).

Также, обновление содержит кучу мелких багфиксов и улучшений, о некоторых из них можно почитать в CHANGELOG:

https://github.com/Lovesan/bike/blob/master/CHANGELOG.md

 , , ,

lovesan
()

Garnet - кэш от Microsoft, написан на C#, делает и Redis, и Dragonfly

Форум — Development

Как видно из бенчмарков, это сейчас вообще самый быстрый сервер структур данных на всём диком западе:

https://microsoft.github.io/garnet/docs/benchmarking/results-resp-bench

Парктически полностью совместим с Redis на уровне API, но при этом:

  • Имеет либеральную MIT лицензию, как и все последние крупные проекты MS, и этим крайне выгодно отличается от Redis
  • Написан на C#, и позволяет удобно расширять сервер
  • Делает по производительности и Redis, написанный на Си, и Dragonfly написанный на C++

Последний пункт особенно забавен, надеюсь хоть это у крестолюбцев в голове что-либо прочистит, и вот это дебильное мнение что «сипласплас эта быстра», а также глупые наезды на GC, наконец канут в лету. Кресты в современном мире нахер не нужны, и никакой даже особой производительности не дают. Да и Си, в принципе, тоже нигде не нужен выше уровня ядра.

Я кстати, в свое время написал на C# видеостриминг-сервер, и клиент, практически не используя кресты(было немного C++/CLI для связи с COM итд), и проблем с производительностью там не было. Но что я - вон целый MS Research делает продукты вон какого уровня.

 , , garnet, ,

lovesan
()

Мой .emacs.d - IDE для Common Lisp (работает из коробки)

Форум — Development

Вобщем, причесал тут свои конфиги Емакса, и выложил на гитхаб.

https://github.com/Lovesan/.emacs.d

Для работы потребуется более-менее новый Emacs, такой как 29.1

Ну и SBCL (но в init.el можно раскомментить строчку и прописать свою реализацию, типа ecl). Если еще этого не сделали, также рекомендую загрузить в SBCL quicklisp чтобы библиотеки можно было вообще в пару кликов ставить.

Как только Emacs с такой конфигурацией запускается, он открывает:

  • REPL
  • scratch.lisp файл (какой это файл и где он лежит, можно поменять в init.el)
  • и открывает боковую панельку с tree-view директории scratch.lisp файла.

Дальше можно писать код, или нажать например в REPL запятую(,), и вводить команды SLIME-repl(для начала можно набрать help). inb4 побочные окошки, типа хелпа, закрываются кнопкой q на клавиатуре.

Вощем, включены SLIME, Magit(это интерфейс для гита в емаксе) и всякая мелочь для удобства. Тулбар выключен, менюха оставлена.

Для структурного редактирования кода на лиспе(включая Emacs Lisp), установлен пакет Lispy. Я раньше пользовался parinfer, но он меня окончательно достал. Lispy удобнее и к тому же легче конфигурируется.

SLIME там уже в принципе прилично настроенный, в частности даже есть немного подсветки синтаксиса для моей библиотеки bike

Но самая основная проблема которую я решил за вас(не благодарите), это поменял кейбиндинги Емакса на нормальные.

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

Итак, что я сделал, это я с помощью библиотеки rebinder.el, перенаправил префикс-сочетания C-x и C-c на C-e и C-d соответственно.

Это позволило сделать из емакса нормальный редактор кода. Да, в принципе, не хватало бы еще табов и прочих GUI-плюшек, но зато зацените, без всяких кривых CUA-mode, им наконец-то можно пользоваться.

Биндинги такие:

  • Ctrl+Q - выход из Емакса.

  • Меню/Apps (это такая кнопка рядом с правым контролом) - вызов расширенной команды по имени(типа то что в емаксе называют M-x)

Редактирование:

  • Ctrl+X - вырезать
  • Ctrl+C - копировать
  • Ctrl+V - вставка
  • Ctrl+Z - отмена
  • Ctrl+Y - вернуть
  • Ctrl+A - выделить весь текст

Также, я немного похакал так называемый killring и систему выделения текста, что еще больше приблизило Emacs к нормальным редакторам.

Управление буферами(такое обобщение понятия файла в емаксе):

  • Ctrl+O - открыть файл
  • Ctrl+S - сохранить буфер
  • Ctrl+W - закрыть текущий буфер
  • Alt+влево - предыдущий буфер
  • Alt+вправо - следующий буфер
  • F2 - открыть список буферов
  • Ctrl+PageDown - включает оверлей ace-window, который позволяет быстро переключаться между тайлами емакса(называемыми window). Он над каждым тайлом показывает цифру, которую надо нажать чтобы на него перейти.
  • F8 - показать/скрыть Neotree (это панелька с деревом файлов слева). Кстати в neotree теперь по Ctrl+клик мышью можно менять корень дерева файлов.

Поиск:

  • Ctrl+F - поиск вперед по тексту
  • Ctrl+Shift+F - поиск взад по тексту

Также в окошке поиска можно перемещаться стрелками, так стрелки вправо-влево управляют поиском вперед/назад по тексту, а стрелки вверх-вниз - просмотр история поиска.

Мышку кстати тоже в некоторой степени перебиндил, в частности доп. кнопки mouse-4 и mouse-5 (их обычно в современных ОС вешают на вперед/назад) управляют навигацией по буферам. В принципе, они позволяют выбирать следующий/предыдущий буфер, как Alt+влево/вправо, но с некоторыми нюансами, описанными ниже.

Кейбиндинги для Emacs Lisp и для SLIME:

  • F12 - Перейти к определению. Также, это можно сделать, клинкув на символ мышью, при этом зажимая Control(как во всех современных IDE).
  • F11 - Вернуться назад в стеке определений. Также это делается mouse-4, т.е. мышевой кнопкой «назад».
  • mouse-5 - Кнопка мыши «вперед» работает как своего рода «Redo» по отношению к предыдущей команду, т.е. она опять ныряет в стек определений, если перед этим из него был выход предыдущей командой.
  • F5 - Вычисляет выражение стоящее прямо перед курсором. Т.е. если есть форма (+ 1 2 3), курсор нужно ставить сразу после закрывающей скобки.
  • Alt-вверх - интеллектуальный переход наверх по S-выражению, с использованием Lispy.
  • Alt-вниз - интеллектуальный переход к следующему S-выражению, с использованием Lispy.

Кейбиндинги специально для SLIME:

  • F1 - информация о символе. Если вызывать на пустом месте, в командной строке нужно будет ввести имя символа. Если нажать над символом, то опишут его.
  • F3 - поиск по символам. Выведет список символов и краткое описание. Ищет только по тем символам, которые связаны с функциями, переменными, классами, итд.
  • F4 - Скрыть/показать REPL в текущем тайловом окне.
  • F6 - Скомпилировать и загрузить текущий файл

Пока что больше кастомных кейбиндингов нет, и все остальные на своих местах, но еще раз, надо помнить, что префикс-сочетание С-x перевешано на С-e, а С-c на С-d, так что меняйте это в уме, если где-то в документации по тому же Magit это видите. Но кстати с такими префиксами, работать со всем дефолтом даже удобнее, не так устают пальцы. А, еще в Lispy отрубил клавишу e, чтобы не мешалась, и еще там несколько мелочей в нем отрубил или поправил.

Ксатит вот где можно еще почитать по SLIME, Lispy и Magit:

 , , , ,

lovesan
()

Lisp Asp .Net MVC

Форум — Development

C# официально устарел и отправляется в помойку, т.к. теперь веб-фреймворк Asp .Net Core MVC доступен из Common Lisp.

Можно так писать:

;; Asp.Net MVC controller
(define-dotnet-callable-class (example-controller
                               (:base-type . ControllerBase))
    ()
  ;; Echo the 'Hello' message to client
  (:method index :string ((name :string))
    (format nil "Hello~:[~;, ~:*~a~]!" name)))

https://github.com/Lovesan/bike/blob/master/examples/aspnet-mvc.lisp

На линуксе работает на SBCL и на CCL, проверял.

Конечно, нужно немного дополнительных телодвижений, т.к. .NET прокси-классы генерируются в рантайме, и поэтому их надо руками указывать в качестве контроллеров, но это в принципе все при желании автоматизируется макросами и другими средствами метапрограммирования.

Также, пока bike не поддерживает аттрибуты, но это наверное добавлю позже.

Ну и с extension-методами пока не придумал что делать, пока их классы надо руками писать.

 , , , ,

lovesan
()

Мысли про формы оплаты труда

Форум — Talks

В сфере SE/SA/IT существует только три вменяемых вида оплаты труда. Первый это почасовка, которая применяется для разовых задач(настроить сервак, перекрасить кнопку, итд). Второй вариант это фиксированная сумма, опять же для разовых задач(или этапов задач). Третий вариант это «зарплата в месяц».

Комбинации, особенно первого и последнего - это признак галерного рабовладельческого трешака, от которого надо бежать к херам (трудодни таймшиты, и прочая).

Что касается сроков: и в первом, и во втором случае, заказчик имеет право ставить конкретные сроки решения задачи. В последнем случае право, конечно, имеет, но вот рассчитывать на конкретный результат может только в том случае, если сроки решения задачи измеряются энным количеством месяцев(с округлением, допустим) и требования фиксированы и детально обговорены заранее.

Из чего следует, что схема «зарплата в месяц» эффективна только в следующих случаях:

  • Поддержка, починка багов, и вот это всё
  • R&D и прочие виды разработки, когда ни результат, ни сроки, заранее не определены, а бюджет резиновый(последнее - важно)
  • Фиксированное количество работы и бюджета, превыщающее месяц, но при этом детально распланированное (редкость)

Отсюда вывод - чтобы не угореть от безысходности и корпоративного ада, нужно становиться ИП/самозанятым и делать разовые заказы. Вопрос, почему такое не так уж часто встречается даже там где надо делать какие-то задачи, а не просто уныло поддерживать старье, и почему все хотят тебя посадить на зарплату по ТК? Из-за специфики ТК и вообще законодательства? Из-за лишней бюрократии?

 ,

lovesan
()

Почему Go это плохо, и он вам, на самом деле, не нужен.

Форум — Development

Давайте я вам поясню про язык Go, откуда у него растут корни, и почему его на самом деле не стоит использовать. То что напишу ниже, это взято как из инсайдерской информации, так и из материалов, доступных в интернетах.

Дело в том, что Go это, на самом деле, «решение» внутренних гугловских проблем. Но отнюдь не проблем горизонтального масштабирования серверного ПО, как многие почему-то думают. Он приспособлен специально для использования в гугле вот в каком контексте.

Гугл нанимает большое количество тупых студентов, только-только после вуза или ПТУ, и заставлять их писать хоть какой-то простой код. И делать минимум ошибок, при этом. Для этого Go сделан таким тупым и упрощенным. И выкинут в паблик он только для того, чтобы вероятность, что у такого студента, только пришедшего в гугл, было хоть какое-то знание Go, была выше нуля.

Но дело вот в чем. В гугле, на самом деле, над каждой командой гошников стоит тимлид, или целая группа, который/которая вот этим взаимозаменяемым роботам-гошникам расписывает всю систему, чуть ли не вплоть до состояния конечного автомата, до if-ов, и показывает куда и что писать. Поэтому же Go на корню режет всю креативность, поэтому там нет практически никаких средств абстракции, и поэтому он не дает делать вообще ничего сложного. Дабы программисты на нем вообще ничего лишнего не думали, а кодировали все чуть ли не побуквенно по указаниям умных людей.

Из гугла же идет маразматическая система управления зависимостями Го, которая заточена на монорепы.

Тут возникает вопрос - а почему этому тимлиду не дать в руки кодогенератор, вместо всей этой accidental complexity, возникающей из-за огромного количества строк кода, и из-за затрат на коммуникацию?

А тут надо понимать, как внутри устроены огромные корпорации типа гугла.

Их давно пожрал рак бюрократии. Там у менеджерских и околоменеджерских должностей один из главных критериев промоушнов, или вообще даже ассесмента(усидения на должности), это количество людей у тебя в подчинении. И количество говнокода в вакууме которая твоя команда написала. И вот все эти люди, сидящие на более-менее средне-высоких должностях, постоянно бодаются за эти промоушны и ассесменты. Это их главная и единственная цель. Поэтому, ни о какой эффективности тут речи не идет вообще от слова совсем. Тут главное - корпоративные игры, количество голов в твоем стаде и количество и размер высеров, которые это твое стадо произвело(причем буквально, важны SLOC).

Естественно, это все отражается на качестве продуктов, и это видно как по полному прекращению инноваций в гугле, так и по постоянно мелькающим и закрывающимся высерам этой компании - hangouts, duo, google plus, google wave, и прочее и прочее, можете еще вспомнить много чего.

Если у вас в компании такой «модели управления» нет, и более того, у вас нет возможности нанимать крайне высококвалифицированных людей за крайне много денег, единственное назначение которых будет расписывать стаду гошников(которые тоже стоят немало денег просто из-за количества) систему до уровня конечного автомата, то вам этот язык и вся его экосистема нахрен не сдалась.

Никакой мифической простоты в отладке и в понимании кода Go не приносит. Да и сложность программных систем растет совершенно не из-за понятности/непонятности какой-то отдельной взятой строчки кода или функции. Потому, что, во-первых, понятность это понятие субъективное, во-вторых потому, что, отдельно взятая фунцкия на 5 строк понятна любому опытному программисту, будь она написана хоть на Rust, хоть на Common Lisp.

Сложность программных систем возникает из-за их размера. И Go эту проблему значительно ухудшает. Человек не может удерживать в голове слишком много вещей, даже если каждая отдельная вещь - очень простая. Количество RAM в голове ограничено.

В случае если вы не хотите выкидывать кучу денег просто так, и скорее предпочли бы нанять немного, но более-менее опытных программистов, Go будет только вреден, потому что все вменяемые люди от него, на самом деле, плюются. Он реально отталкивает опытных людей, которые способны понять сложные требования и написать, и поддерживать, более-менее сложные системы уровнем хотя бы нескольких сервисов плюс БД и MQ.

 ,

lovesan
()

Как выучить C# за 21 день имея только опыт Common Lisp? Надо всего лишь...

Форум — Development

Вобщем, я тут в своей библиотеке для интероперабельности Common Lisp и .NET - запилил мега-фичу - прокси-классы.

Это такие классы, лисповые, которые с помощью магии метаобъектного протокола CLOS и немного System.Reflection.Emit - прикидываются .NET классами, а их объекты, соответственно - .NET объектами.

Это позволяет бесшовно интегрироваться с .NET кодом, например реализовывать .NET интерфейсы или вон, идиоматически писать на WPF, с MVVM, биндингами, командами и всем прочим.

Вон пример приложения, это браузер пакетов(лисповых неймспейсов) CL: https://files.catbox.moe/77wdbn.png

https://github.com/Lovesan/bike/blob/master/examples/wpf.lisp (потом как-нибудь еще добавлю пример с Avalonia, чтобы было кроссплатформенно вообще).

Вот соответствующий XAML. Как видно, вьюха напрямую биндится к свойствам вью-моделей, как будто у нее под капотом C#. https://github.com/Lovesan/bike/blob/master/examples/WpfUserControl.xaml

Код в принципе там понятен, особенно тем кто имел дело с WPF/Avalonia. Но документацию надо бы написать, да, работаю над этим. Докстринги это хорошо но мало.

 , , , ,

lovesan
()

Релиз bike 0.13.0. Нужна помощь с сигналами на линуксе. Опять.

Форум — Development

После пары лет наконец выпустил новый релиз своей библиотеки для интероперабельности Common Lisp и .NET

https://github.com/Lovesan/bike/tree/0.13.0

Там есть серьезная issue, касающаяся линукса, с которой вообще нужна была бы помощь. Что-то опять с сигналами не так, на этот раз с SIGFPE.

https://github.com/Lovesan/bike/issues/10

Если для Ъ - после загрузки рантаймов последних версий .NET в лисп(тестировал на SBCL и CCL), лисповый процесс грохается с SIGFPE.

Выглядит это обычно примерно так:

CORRUPTION WARNING in SBCL pid 151 tid 163:
Received signal 8 @ 7f00cbeb2c3b in non-lisp tid 163, resignaling to a lisp thread.
The integrity of this image is possibly compromised.
Continuing with fingers crossed.
Floating point exception (core dumped)

Началось такое с релиза .NET 6 и продолжается до сих пор. Т.е. .NET 5 работает, и .Net Core до него работали тоже.

Проблемы с сигналами на линуксе уже раньше были(так и хочется сказать - потому что сигналы это кривое говно by design), но мы с одним из разработчиков SBCL их закостылили - переписываем дотнетовские сигналы лисповыми, кроме тех которые дотнет нормально обрабатывает.

Для SBCL и в этот раз есть костыль, правда, кривой. Вырубить отлов исключений операций с плавающей точкой. Но тогда, вместо вызова исключений, в случае операций по типу (/ 1.0 0.0) будут возвращаться значения типа +inf, -inf, и всякие там NaN. Что вобщем-то не по стандарту CL и вообще криво.

Возможен ли подобный костыль для CCL и других реализаций - непонятно. Как и непонятно, что вообще в дотнете сломали и поменяли. Сорцы я его смотрел, но они ужасны, огромны, и написаны как говно, особенно в низкоуровневой области, там где C++, работа с ОС и вот это вот все.

 , , , ,

lovesan
()

Илон Маск заопенсорсил твиттерский алгоритм рекомендаций

Форум — Talks

Нет, это не шутка.

https://github.com/twitter/the-algorithm/tree/main

Под AGPL.

По-моему - круто.

 , , ,

lovesan
()

OpenAI как инструмент mass surveillance

Форум — Talks

Будете смеяться, но я только сейчас начал понимать, о чем на самом деле все это время говорил Столлман и сотоварищи.

Всем понятна аналогия о том что «free as in beer» это неправильное понимание свободного ПО, несмотря на то что множество людей его так и понимает, особенно в постсовке.

Свобода ПО это в первую очередь свобода от использования ПО в качестве инструмента принуждения, в том числе инструмента массовой слежки.

И вот что мы видим на примере OpenAI? Куда оно отправляет все данные и все диалоги? А вот хрен знает куда. И как это всё потом используется? Код-то закрыт.

 , , ,

lovesan
()

Metallica или Megadeth?

Форум — Talks

Ну, с прошлой темы прошло достаточно времени, но вот теперь я задался вот этим вопросом. Ну, он куда сложнее. С одной стороны Megadeth часто куда техничнее, чего стоит один Holy Wars, но с другой стороны, Metallica часто имеет куда более внушительные элементы Thrash-метала. Что думаете?

 megadeth, ,

lovesan
()

Portage/Ebuildы для MinGW

Форум — Development

А есть такая штука вообще? Помоему, было бы круто для кросс-компиляции или вообще нативно.

Под винду, под MinGW, собирается и работает куча софта, но руками такое делать довольно муторно. К тому же у библиотек есть куча опций сборки, так что можно было бы задействовать use-флаги и так далее.

Может я проспал, и такое есть, гентой давно не пользовался, но вдруг стало интересно.

А то пилю потихоньку свои скрипты, но вдруг это кривой велосипед, и оно уже сделано?

https://github.com/Lovesan/mingw-xc/

Кстати некоторые вещи(например как собирать NSS) - скопипастил именно из гентовских ебилдов.

 , , ,

lovesan
()

Хватит триггериться на мат

Форум — Linux-org-ru

Я не понимаю уже, это ЛОР или форум для тринадцатилетних девочек-анимешниц? Че удалять то? Не дают парням поговорить нормально, не то слово сказал, так все, подгорает снизу, жаловаться идут в некорректные сообщения.

Че за дела вообще? Че за синдром вахтера? Хватит уже на мат триггериться.

 

lovesan
()

Metallica или Slayer?

Форум — Talks

Че круче? Как думаете?

Я склоняюсь к Metallica \m/

 ,

lovesan
()

SBCL уделывает C++(и шланг, и G++) по производительности

Форум — Talks

https://programming-language-benchmarks.vercel.app/problem/spectral-norm

Немного лучше него, буквально на десяток миллисекунд, справляется rust.

Назовите теперь хоть одну причину использовать плюсы вообще?

Перемещено xaizek из development

 , , ,

lovesan
()

Кто-нибудь играет в Starbase?

Форум — Talks

Сабж.

Супер крутая игруха, только что вышла в Early Access в стиме. Багов, конечно, море, но потенциал огромен. Круче Space Engineers и подобного всего вместе взятого. Редактор космических кораблей - натурально не уступает CAD для авиации.

В фичах - программируемость всего и вся, на специальном басикоподобном языке YOLOL. Чуваки на нем запилили даже GPS-систему навигации. https://isan.to/isan.pdf

Продуманность и детальность системы сборки кораблей просто детальнейшая. Балки свариваем, потом на них заклепками что-то прикрепляем, ко всему надо кабели, а куда-то там и трубы, вообщем хардкор.

Да, также можно грабить корованы.

 ,

lovesan
()

Когда люди перестанут писать на C++?

Форум — Talks

И зачем они это делают до сих пор, не считая поддержки легаси?

Перемещено Shaman007 из development

 

lovesan
()

Навелосипедил квадратные скобки в лиспе

Форум — Development

Тащемто, для полного счастья в bike, кроме прочего, не хватало ридер-макросов, которые бы уменьшали количество круглых скобок, квотирования и прочего текста при вызове дотнета.

Тащемто теперь есть. Вот так можно вызывать методы:

(use-namespace 'System)

[:Console WriteLine "Hello, World!"]

Вот так можно получить текущее время в стринге: (ни одной круглой скобки! может это tcl/tk?)

[[:DateTime %Now] ToString]

А вот так получить значение максимального int32, из специального статического поля соответствующего класса:

[:int $MaxValue]

Более того, можно стучаться в индексеры дикшнрей и прочих объектов, даже круче чем в Clojure:

(let ((dict (new '(Dictionary :string :string))))
  (setf #[dict "Hello"] "World!")
  dict)

И создавать Enum-ы не обременяя себя расставлением запятых:

(use-namespace 'System.Reflection)

#e(BindingFlags Public Static)

На закуску, для любителей ковыряться в байтах, добавил и такую возможность, прямо как в C# только лучше:

(use-namespace 'System.Text)

(let ((dotnet-array [[:Encoding %UTF8] GetBytes "Hello, World!"]))
  (with-fixed (raw-pointer dotnet-array)
   (cffi:mem-ref raw-pointer :uint8)))
;; ==> 72

Не хватает батареек? Тогда мы идем к вам!

 , , ,

lovesan
()

RSS подписка на новые темы