LINUX.ORG.RU

посоветуйте лисп в питоне

 ,


0

2

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

Я пока нашёл предельно простой

https://github.com/Leden/jsonlisp

И ещё есть https://github.com/e-dorigatti/lispy

Но наверняка кто-то ж сделал что-то серьёзное в этом направлении

★★★★★

Ответ на: комментарий от rupert

Я использовал для написания нетривиального количества кода. Самое интересное, что если вдруг что-то не понравится, и захочешь возвратиться обратно к питону, то у них есть утилита hy2py, которая компилирует hy код практически в идентичный питон, который после этого достаточно только немного причесать.

rupert ★★★★★
()
Ответ на: комментарий от den73

Из питона в hy? Я не видел такого. Да и получится ли хороший результат? Код на питоне практически всегда императивный, а на Hy, как и на других лиспах, идиоматический код имеет функциональный стиль.

rupert ★★★★★
()
Ответ на: комментарий от Nervous

Мне в проекте заменялки нужно генерировать и исполнять скрипты. Скрипты на лиспе генерируются на раз, а скрипты на питоне не пробовал генерировать и наверняка будет в 5 раз менее элегантно. Переводить текущий код на лисп - это для другого проекта. Но и так вообще интересно - писать на лиспе, потом шлифануть ситоном и получится быстрый и нативный лисп с батарейками питона. Чем плохо? Всем хорошо. Во всяком случае, в теории. На практике-то наверняка ничего хорошего не выйдет, например, потеряется возможность отладки, в Питоне она есть, а в этом «Ху» - вряд ли, лисперы же обычно выше этого.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

Насколько я понял, у тебя в проекте встроен питон для скриптования, и ты хочешь, чтобы эти скрипты можно было писать на лиспе и преобразовывать в питон перед исполнением? Но зачем тогда обратное преобразование питон->лисп?

это для другого проекта

Понел. А что за проект?

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от Nervous

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

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

потеряется возможность отладки, в Питоне она есть, а в этом «Ху» - вряд ли,

У него на выходе питон же, можно отлаживать как обычный питон. Наверное. Вот имеется ли там способ соотнести проблемные места в сгенерированном питоне с лисповым исходником — это вопрос.

лисперы же обычно выше этого

За все лиспы не скажу, но в елиспе и кложе отладчики имеются. Наверное, это вопрос размера аудитории (количества потенциальных контрибьюторов), самому всё писать — писалка отвалится.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)

О бедном Crystal замолвите слово (комментарий)

в питон уже как 5 лет как := моржика завезли

можно писать в лисп стиле

всё тело функции есть список где каждый элемент это выражение

т.е список прям один в один соответсвует prog-форме если блюсти дисциплину все элементы это := инициализация а последний сама программа в виде либо просто выражения либо того или иного дополнения

т.е. всё по классике в любом большом языке всегда есть подмножество почти полностью эквивалентное лиспу :)

qulinxao3
()
Ответ на: комментарий от qulinxao3

моржика завезли

можно писать в лисп стиле

Код — неструктурированный текст вместо структурированных данных -> нормальных макросов нет, с иммутабельностью жопа — максимум императивный еле-еле недолисп.

Именно поэтому Hy и ClojureScript имеют смысл, хотя питон с жопаскриптом в принципе и сами по себе жизнеспособны — батарейки от платформы, благодать от лиспа. Win-win. Developer Sanity Matters.

Там ещё Fennel есть для Lua. Они на свет лезут!11

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от rupert

Ну что, спасибо! Прямо приятная игрушка, хотя и косяки разные есть. То, что они мужественно выпилили let, который не лезет в python, было неприятным сюрпризом, но говорит об их адекватности (в моём понимании адекватности).

Документация недостаточна, без SO нельзя разобраться.

Пока переписал только вызов главной функции, выглядит так.

(import группировка_лексем)
(import json)
(import sys)

(defn ГлавнаяСкрипта [аргв]
  (when (!= (len аргв) 2)
    (ПишиСправкуИУмри))
  (setv аргт (json.loads (second аргв)))
  (группировка_лексем.Главная аргт))


(defn ПишиСправкуИУмри ()
  (print "Принимает в качестве параметра JSON выражение, структуру см. в исходнике"
         :file sys.stderr)
  (sys.exit 1)
  )

(defmain [&rest аргв]
  (ГлавнаяСкрипта аргв))

При этом основной модуль (группировка_лексем) написан на Питоне. Пока рано говорить об успехе - надо теперь суметь сгенерировать скрипт и выполнить его. Думаю, получится, но там ещё собственно содержательной работы полно.

Есть режим для VSCode, но что-то он у меня плохо от распечатки стека к коду переходит. Отладчик не пытался смотреть пока что.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

они мужественно выпилили let

Сначала выпилили, а теперь вроде опять впилили: https://docs.hylang.org/en/stable/api.html#let
Там вроде был разговор про реализацию let через walrus operator.

Они еще многое, что раньше было в языке, перенесли в библиотеку hyrule.

rupert ★★★★★
()
Ответ на: комментарий от rupert

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

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

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

cobold ★★★★★
()
Ответ на: комментарий от cobold

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

Если с такой точки зрения подходить, то всё снизу доверху от библиотек до скриптов развёртки надо писать на Си++. Тогда все сотрудники будут полностью взаимозаменяемы.

Т.е. чтобы просто уменьшить bus-фактор

Уменьшить? Если лисп знает один сотрудник и другого взять негде, bus-фактор равен 1. Если bus-фактор равен 0, проект уже закрыт.

monk ★★★★★
()
Ответ на: комментарий от den73

Похоже, что не сложилось с hylang - я не нашёл, как в моей версии 0.14.0 (поставившейся из pip для моего отсталого Питона) напечать консы как консы, а не в диком виде. Видимо, в следующей жизни, а сейчас придётся искать другой вариант.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

[печатать] консы как консы, а не в диком виде

А как ты печатаешь? print вроде как и должен потроха печатать, он же обычный питонячий.

$ hy
Hy 0.27.0 using CPython(main) 3.10.12 on Linux
=> '(1 2 3)
'(1 2 3)
=> (print '(1 2 3))
hy.models.Expression([
  hy.models.Integer(1),
  hy.models.Integer(2),
  hy.models.Integer(3)])
=> (hy.repr '(1 2 3))
"'(1 2 3)"
=> (print (hy.repr '(1 2 3)))
'(1 2 3)
Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от Nervous

Спасибо за заботу. Но я же написал, что у меня старая версия hy, а новую я боялся поставить. Логично, что это и могло быть причиной. Сегодня из-за другой библиотеки пришлось разобраться, как организовано сосуществование двух python3 на одной убунте и в 3.7.5 нашёлся более новый hy версии 0.26. Твой пример заработал, и let там тоже работает. Спасибо!

Правда, я уже нашёл для задачи сравнения библиотечку deepdiff, которая работает с json, и там даже есть свой «командный язык» в json, и его «интерпретатор». Как-то так выглядит файл различий:

{
 "values_changed": {
  "root[3][10][5][1]": {
   "new_value": "Error",
   "old_value": "ERROR"
  },
  "root[4][3]": {
   "new_value": "Abc",
   "old_value": "abc"
  }
 }
}

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

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)