Как создать веб-приложение с помощью LISP?

У меня есть опыт работы с C# и JavaScript, и последние несколько лет я работаю с Node.js. В принципе, я очень уверен в этой среде, но один язык всегда привлекал мое внимание: LISP. Я нахожу впечатляющим и весьма захватывающим то, насколько выразительным является LISP, учитывая его минимальные языковые концепции. Это в основном как с jQuery: делайте больше с меньшими затратами ;-)

К сожалению, мой опыт работы с LISP носит более или менее теоретический характер и связан с игрой, но не с серьезным программированием.

Теперь я хотел бы это изменить, но я определенно занимаюсь разработкой веб-приложений (отсюда и Node.js). Моя проблема не в том, чтобы изучать LISP как язык, моя проблема в том, что я не знаю, где и как начать с приложения «Hello LISP world», которое не консольное, а веб-ориентированное. .

Итак, мой вопрос в основном таков: как я могу написать серверное веб-приложение на LISP, похожее на следующее приложение Node.js

var http = require('http');
http.createServer(function (req, res) {
  res.end('Hello world!');
}).listen(3000);

без необходимости множества фреймворков, дополнительных библиотек, прочего и т.д.?

Как бы опытный LISP-программист решил эту задачу? Любые подсказки?


person Golo Roden    schedule 11.08.2013    source источник
comment
Возможно, вам следует подумать об использовании CGI.   -  person Aneri    schedule 11.08.2013
comment
Что ж, да, это может быть идеей, хотя мне не нравится подход CGI к плагинам. Но это может быть идея ... спасибо, что указали на это!   -  person Golo Roden    schedule 11.08.2013
comment
вам, вероятно, следует проверить: stackoverflow.com/questions/556456/   -  person Peter Butkovic    schedule 11.08.2013
comment
Спасибо, это выглядит довольно интересно!   -  person Golo Roden    schedule 11.08.2013
comment
Если Emacs является приемлемой платформой, взгляните на Elnode.   -  person tripleee    schedule 11.08.2013
comment
Не могли бы вы расширить свой запрос на то, чтобы это было без необходимости множества фреймворков, дополнительных библиотек, прочего и так далее? Вы ожидаете, что все будет встроено в основной язык и/или создано вами вручную, или вы хотите узнать о фреймворках и библиотеках, которые упрощают эту работу? В последнем случае у вас уже есть некоторые ответы, указывающие на полезные инструменты, хотя есть и другие, которые можно было бы добавить (например, cl-who — полезное дополнение)... если первое, я хотел бы понять, почему , чтобы лучше всего ответить вам.   -  person lindes    schedule 13.08.2013
comment
В основном я имел в виду, что хотел бы иметь возможность сделать это с наименьшими накладными расходами, насколько это возможно: Итак, никакого сверхархитектурного и очень сложного решения, только простое, короткое и компактное.   -  person Golo Roden    schedule 13.08.2013
comment
Есть TBLN vy WEITZ или Clakc   -  person Sebastian Valencia    schedule 23.10.2013


Ответы (3)


Если у вас есть SBCL и Quicklisp установлен,

(ql:quickload "hunchentoot")
(hunchentoot:start 
  (make-instance 'hunchentoot:easy-acceptor :port 3000))
(hunchentoot:define-easy-handler (foo :uri "/bar") (name)
  (format nil "Hello~@[ ~A~]!" name))

Тогда посетите

http://127.0.0.1:3000/bar?name=World
person huaiyuan    schedule 11.08.2013

Ответ о Hunchentoot действительно подходит для начинающих, и я полностью рекомендую его попробовать.

Единственное существенное отличие от варианта node.js в вопросе заключается в том, что Hunchentoot — это синхронный веб-сервер. Если вы хотите получить такое же асинхронное поведение (на самом деле, зачем вам это, но это тема для другого обсуждения ;), вы должны попробовать что-то еще, например вуки. Аналогичный пример Hello World представлен на его странице документации.

person Vsevolod Dyomkin    schedule 11.08.2013
comment
Спасибо за упоминание Вуки! Я бы также рекомендовал Hunchentoot для начинающих. Синхронная модель примерно в 5 раз проще для понимания. Где Wookie действительно сияет, так это когда вам нужно приложение, чтобы связать разные части вместе (вызов внутренних или сторонних API через HTTP, выполнение запросов к базе данных, получение значений из Redis, постановка в очередь больших заданий в фоновом режиме и т. д. ... все, что требует сетевой ввод-вывод). Он не предназначен для выполнения большой работы, кроме кодирования/декодирования и передачи данных. Остерегайтесь также, отсутствует поддержка асинхронного драйвера. Ваша любимая БД, вероятно, не поддерживается (пока) - person andrew; 27.11.2013

В дополнение к другим ответам, есть также ningle1 и пещерный человек2, которые также хорошо задокументированы. Маршрутизация Ningle очень похожа на Sinatra/Flask.

person PuercoPop    schedule 12.08.2013
comment
Я действительно хорошо провел время с Caveman. Рекомендовал бы его всем. - person Paul Nathan; 13.08.2013