Pull to refresh
31
0
Александр Артёменко @Svetlyak

Пользователь

Send message

Запускать бота в продакшн под screen это жесть. Лучше бы показали как для systemd сделать небольшой конфижек и запустить как демона, с рестартами логами и прочим.

Последняя демка выглядит особенно круто.

Жду продолжения!

Знаю, сам использую SBCL. Просто часто Lisp причисляют к мёртвым языкам.

Не понимаю, почему в списке нет LISP? Он не такой уж влиятельный? Или пока ещё не мёртвый?

Хочешь ещё поугорать – начни изучать Common Lisp. Лет через 10 сможешь и про него такую же статью написать, даже пожалуй похлеще :)

О! Спасибо!
Скрестить бы create-element с Spinneret и LASS – цены бы ему не было!

А вообще идея с использованием JSCL прикольная. У меня для Reblocks иногда приходится писать какой-нибудь JS код, но я для этого использую Parenscript.

Скажи, а как у тебя реализована работа с DOM на стороне клиента? Вызов стандартных JS функций и тд. Я бы с удовольствием тоже заиспользовал JSCL вместо Parenscript.

Да, сейчас Ultralisp.org действительно не выкачивает GIT сабмодули и я не натыкался на проекты которые бы не работали из-за этого :)

Думаю это не сложно будет поддержать. Попробую добавить на днях.

Попробуй добавить свой проект на мой Ultralisp.org. Там dist будет обновляться сразу после пуша в Git репозиторий.

А ещё хочу упомянуть пару библиотек – Reblocks (она позволяет писать всю бизнес-логику на Common Lisp и запускает её на бэкенде, а на фронт отдаёт команды, как поменять DOM дерево), а так же CLOG – она вроде больше похожа на твой OMGlib, только более продвинутая на данный момент.

Нет бы сразу Common Lisp использовать и не изобретать с нуля то, что известно человечеству уже лет 50.

Когда настоящий синьор пишет код, Чак Норрис тихо плачет в сторонке.

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

Синьор делает так:

  1. Узнает о проблеме

  2. Локализует проблему

  3. Фиксит проблему

  4. Пишет про проблему в блог или на Хабр, чтобы Google смог проиндексировать страницу и показывать её в поиске джунам :)

Да, забыл сказать. С недавних пор Ultralisp поддерживает не только формат метаданных Quicklisp, но и CLPI. CLPI, это альтернатива Quicklisp, формат данных используемый в Common Lisp Package Manager (https://www.clpm.dev/)

Да именно так.

Более того, Ultralisp автоматически настраивает вебхук в проекте на GitHub, и собирает новую версию диста, как только ты запушишь изменения.

А ещё, в нём можно делать свои "дисты". Например ты в такой дист можешь включить форки каких-то библиотек, которые нужны только тебе. В общем дисте они не будут видны.

К примеру, в такой дист я начал собирать расширения для Lispworks: https://ultralisp.org/dists/lispworks В Quicklisp их в принципе не включат, потому что туда включают только проекты, которые компилируются под SBCL.

Я на Common Lisp пилю аналог питоновского PyPi: https://ultralisp.org. Это хостинг для более чем тысячи CL библиотек, куда можно в несколько кликов добавлять новые прямо с GitHub.

Ну и ещё есть на гитхабе десятки небольших CL библиотек в организации https://github.com/40ants/, если конечно можно считать их pet-прожектами.

Для этого надо запустить процесс кодогенерации и напечатать получившийся результат. Например в REPL.

Есть такой Python пакет – «meta». В нём есть утилиты для работы с AST, в том числе и для печати AST дерева. Можно использовать его.

В этом туториале можно почитать подробнее: macropy3.readthedocs.io/en/latest/ast.html

А в Common Lisp, к примеру, раскрытие макросов встроено в язык и в IDE. Его можно вот так вызвать из REPL:

;; Сначала определим макрос:
CL-USER> (defmacro trace-forms ((&optional (stream t))
                        &body body)
           `(progn ,@(loop for form in body
                           collect `(format ,stream "~S -> ~S~%"
                                            ',form
                                            ,form))))
TRACE-FORMS

;; Вот так он работает:
CL-USER> (trace-forms ()
           1
           :foo
           "bar"
           (+ 1 3))
1 -> 1
:FOO -> :FOO
"bar" -> "bar"
(+ 1 3) -> 4
NIL

;; А так можно посмотреть,  в какой код он раскрывается:
CL-USER> (macroexpand-1
          '(trace-forms ()
            1
            :foo
            "bar"
            (+ 1 3)))
(PROGN
 (FORMAT T "~S -> ~S~%" '1 1)
 (FORMAT T "~S -> ~S~%" ':FOO :FOO)
 (FORMAT T "~S -> ~S~%" '"bar" "bar")
 (FORMAT T "~S -> ~S~%" '(+ 1 3) (+ 1 3)))
T
Да, так бывает. Нужно соблюдать баланс.
С помощью макросов можно сложные вещи делать более простыми в использовании.

Так же можно оптимизировать код под конкретную зада, собирая функции из AST по кусочкам.

Это такой же инструмент, как например ООП. Просто другой.
Он открывает новые возможности для людей, обладающих фантазией.
У меня, кстати, есть ещё одна разработка – скрипт, который проходится по всем форкам и ищет несмердженные в апстрим ветки. Про такое тоже можно как-то напоминать владельцу основного репозитория. В форках иногда попадаются полезные доработки, которые люди по разным причинам не превращают в пуллы и не вливают в апстрим.
1
23 ...

Information

Rating
Does not participate
Location
Россия
Works in
Registered
Activity