Взаимодействуйте с локально долго работающим образом Common Lisp, возможно, демонизированным, из командной строки
Как можно взаимодействовать с локально долго работающим образом Common Lisp, возможно, демонизированным, из командной строки?
Я знаю, что можно запустить функцию Common Lisp из командной строки терминала, я также знаю об этом.
Мне нужно было бы сделать то же самое, но с локальным, уже давно работающим образом Common Lisp, с возможностью опроса доступных функций из CLI или сценариев оболочки.
Есть ли способ сделать это из CLI, например, вызвать функцию из сценария bash и получить обратно все, что возвращает функция?
Хотя я мог бы, например, создать примитивный веб-сервис, возможно, используя woo или Hunchentoot, вызывая функции и получая возвращаемые значения через curl
или же wget
, но это кажется немного запутанным.
Конечно, это одна из многих возможностей Emacs SLIME, но мне нужно было бы вызывать функции только из CLI, не вызывая Emacs.
Может быть, есть какой-нибудь способ достичь бэкэнда за пределами SLIME?
Если это вообще возможно, какой бы это был идиоматический способ?
Буду благодарен за любые указатели.
Обновить
Дополнительное примечание
Много лет назад я был заинтригован тем, что смог подключиться к длинному образу LISP (я считаю, что в этом случае имя в верхнем регистре должно быть в порядке). Если я правильно помню, это было доступно на prompt.franz.com. Статья, как-то связанная: telnet для удаленного доступа к запущенному приложению
Telnet, конечно, довольно небезопасен, но полезность возможности доступа к приложениям Lisp таким способом по любой причине не может быть завышена, по крайней мере, для некоторых людей.
Несколько дополнительных указателей, и спасибо
Я хотел бы поблагодарить Василия Старынкевича за его обстоятельный и обстоятельный ответ, особенно по теоретическому аспекту. Я искал более практичное направление, специально связанное с Common Lisp. Тем не менее, его ответ очень поучителен.
Я был полностью готов начать писать локальный сервер, возможно, используя одну из замечательных библиотек Common Lisp, например:
- usocket: Универсальная библиотека сокетов для Common Lisp
- iolib: библиотека ввода-вывода Common Lisp
- cl-aync: библиотека асинхронного ввода-вывода для Common Lisp
Но, благодаря Станиславу Кондратьеву, мне не пришлось. Он указал на уже существующее решение, которое хорошо ответит на мой вопрос, ScriptL: сценарии оболочки сделаны похожими на Lisp
Я успешно проверил его на Linux, FreeBSD и OS X, просто убедитесь, что сначала установлена тонкая оболочка поверх системных вызовов POSIX. Среди многих функций (см. README), он позволяет отображать только выбранные функции, безопасность должным образом обрабатывается, и он даже предоставляет пользовательский клиент C, который создается как часть операции загрузки ASDF, и поддерживает ряд новых функций, таких как I/O, вместо netcat
,
2 ответа
Вы можете найти скрипт l полезным: http://quickdocs.org/scriptl/. Тем не менее, это зависит от iolib, который зависит от некоторой нестандартной библиотеки C или C++, поэтому его сборка не совсем проста.
Действительно возможно связываться с сервером swank, если вы ознакомитесь с протоколом swank, который, по-видимому, недостаточно документирован (см., Например, здесь: https://github.com/astine/swank-client/blob/master/swank-description.markdown). Однако это предоставляет сокет TCP по сети, что может быть небезопасно. Однажды я тоже это попробовал, но меня не устраивала скорость IPC.
Некоторое время назад я написал довольно наивный SBCL-специфичный сервер, который использует сокет локального домена для связи и клиент на C. Это очень сыро, но вы могли бы взглянуть: https://github.com/quasus/lispserver. В частности, он поддерживает интерактивный ввод-вывод и коды выхода. Сервер и клиент составляют ядро простой среды для развертывания программного обеспечения в стиле Unix. Не стесняйтесь брать код и / или связываться со мной для объяснений, предложений и т. Д.
Это определенно зависит от операционной системы, потому что вы хотите некоторый межпроцессный обмен данными, и они предоставляются ОС.
Предположим, у вас есть POSIX- подобная ОС, например, Linux.
Затем вы можете установить сокет (7) или fifo(7), в который вы отправляете s-выражения для оценки. Конечно, вам нужно адаптировать программу Common Lisp для добавления такого REPL.
У SBCL есть некоторые сетевые средства, которые вы могли бы использовать.
Конечно, вы должны сначала понять, как IPC работает в вашей ОС. Если это Linux, вы можете прочитать " Расширенное программирование Linux"(оно сосредоточено на программировании на C, которое является низкоуровневым способом использования служб ОС в POSIX, но вы можете адаптировать то, что вы узнали, к SBCL). И действительно, стандарт Common Lisp может не иметь официального интерфейса POSIX, поэтому вам необходимо погрузиться в детали реализации.
Возможно, вам следует больше узнать о разъемах BSD. Есть тонны учебников по ним. Тогда вы можете использовать TCP-сокеты (см. Tcp (7)) или Unix (см. Unix (7)). Опытные пользователи могут использовать небезопасные telnet
команда. Или вы можете заставить свое программное обеспечение использовать SSL, или, возможно, некоторые libssh, например, использовать ssh
как их клиент.
Вы можете решить и задокументировать, что протокол между пользовательскими приложениями и вашей программой: отправьте some-sexpr (на задокументированном сокете) из кода пользовательского приложения на ваш сервер, который завершается двойной новой строкой или фидом формы, и получите ваш серверeval
это и отправить обратно результат или какое-то сообщение об ошибке. Я делал подобные вещи в MELT, и это не имеет большого значения. Будьте осторожны с буферизацией.
Я предполагаю, что вы предполагаете, что у вас есть ответственные и компетентные пользователи (так что не открывайте такой удаленный REPL в дикий Интернет!).Если вы беспокоитесь о злонамеренном или глупом использовании удаленного REPL, оно становится сложным.
В качестве альтернативы, сделайте ваш сервер веб-приложением (используя в нем некоторую библиотеку HTTP-сервера) и попросите пользователей использовать их браузер или некоторую клиентскую программу HTTP (curl
) или библиотека ( libcurl) для взаимодействия с ней.