我想编写一个Lisp Web应用程序,只是为了好玩。我发现this question关于Lisp网络应用程序,但所有答案看起来都很复杂。在查看答案中提供的链接后,解决方案似乎真的复杂。
如果我只想要一个简单的“hello world”Lisp网络应用程序,有没有一种简单的方法可以做到这一点?
答案 0 :(得分:6)
这个答案看起来很复杂,但我认为开始运行一个简单的Lisp Web应用程序比学习其他更多有趣的Lisp容易,所以它可能是值得的。
有一些非常棒的Common Lisp书籍,其中包含介绍到网络应用的章节:Practical Common Lisp和Land of Lisp。
Land of Lisp中有一章介绍如何使用套接字构建一个简单的Web服务器。这是非常简陋的,但我认为它将成为“hello world”类型的Lisp应用程序的一个很好的起点。
Practical Common Lisp中的章节处于更高层次,适用于名为Allegro Serve的成熟服务器。后面的章节构建了一个MP3流媒体应用程序。
实用Common Lisp是免费提供的,这是感兴趣的章节:http://gigamonkeys.com/book/practical-web-programming-with-allegroserve.html
我认为这两本书都是开始使用Common Lisp(作为一个刚刚开始自己的人)的好资源,虽然Land of Lisp更加轻松,更有趣,尽管它确实涵盖了一些有趣的问题,如懒惰评估和搜索游戏树。实用的Common Lisp更实用,但这并不是一件坏事。它的目标是专业程序员,因此它的语气会更严重一些。
一句警告:
AFAIK Common Lisp没有一种真正标准的网络编程方式,所以这是Lisp学习的一个领域,如果你没有选择与你碰巧的书相同的实现,你会遇到问题读数。
Lisp之地全程使用CLisp,但如果你跟随附近的这篇博文,你可以使用SBCL:http://blog.ciaranbradley.com/crossing-the-streams-land-of-lisp-chapter-12-0
实用Common Lisp正如我所说的那样使用Allegro Serve,我认为他们的网站上有一个版本的Allegro Lisp可供本书使用。但是,您也可以使用Portable Allegro Serve。如果您使用的是Mac OS X和SBCL,请小心(就像我一样):SBCL的线程支持在OS X上是实验性的,所以如果你走这条路线,最好的办法是在VM中安装Ubuntu,然后apt-get install sbcl
并在那里进行Allegro Serve编程,更好地支持SBCL线程。也许一些CL向导可以在这里提出一些其他提示。这才对我有用。
答案 1 :(得分:6)
对于 CL-HTTP ,可以将服务器加载到Lisp中并执行:
(defun hello-world (url stream)
(http:with-successful-response (stream :text)
(princ "hello world" stream)))
以上是响应功能。响应函数有两个参数:URL和流。响应函数添加了通常的响应标头,并说它返回'text'。在这个中我们只是将一个字符串打印到输出流。
(http:export-url #u"/hello-world"
:computed
:response-function 'hello-world)
上方导出与默认上下文(默认服务器名称和端口)合并的URL 。 #u是用于创建URL对象的读取宏。 URL导出为:COMPUTED,因此需要:RESPONSE-FUNCTION来计算响应。我们传入上面定义的函数。
当客户端向该服务器发送带有URL的GET请求时,它会调用该URL的响应函数并提供输出流。
然后生成此内容:
CL-USER 4 > (http:show-raw-url #u"/hello-world")
Status Code: 200 (OK)
Server Version: http/1.1
Date: Wed, 29 Dec 2010 23:39:52 GMT
Server: CL-HTTP/70.218 (LispWorks; 2.1.8)
Content-Type: text/plain; charset=ISO-8859-1
Transfer-Encoding: chunked
hello world
就是这样。
答案 2 :(得分:2)
PLT Racket是一个非常全功能的Scheme方言,可以做到这一点。他们有一个简单的教程here,在其中他们开发了一个小型CMS,以及一些关于Racket Web服务器here的讨论。如果我是你,我会试试。他们的“你好世界”看起来像这样:
(define (start request)
'(html
(head (title "My Blog"))
(body (h1 "Under construction"))))
看,它不是那么糟糕!
(如果Clojure算作Lisp,当然,有几个Web应用程序框架也处于不同的开发状态。)
答案 3 :(得分:1)
Here是最近一篇关于在Common Lisp中构建一个简单的webapp的文章。
答案 4 :(得分:1)
看一看“Making a small Lisp project with quickproject and Quicklisp”的例子比“Hello World”稍微复杂一点。
答案 5 :(得分:1)
一个简单的Hello世界应该是hunchentoot和cl-who。
(defparameter *httpd*
(hunchentoot:start
(make-instance 'hunchentoot:acceptor
:port 8080)))
(princ "Hunchentoot started on port ")
(princ *httpd-port*)
(terpri)
(hunchentoot:define-easy-handler (hello-world (:uri "/hello"))
()
(with-html-output (*standard-output* nil :indent t)
(:html
(:head
(:title "Hello World"))
(:body
(:p "Hello world!...")))))
有关详情,请访问:http://weitz.de/hunchentoot/,http://zaries.wordpress.com/2010/11/09/lisp-web-server-from-scratch-using-hunchentoot-and-nginx/
要安装hunchentoot,请使用quicklisp(这是最简单的)。
(ql:quickload :hunchentoot)
答案 6 :(得分:0)
这是blog post设置SBCL和Hunchentoot以提供hello-world页面。
我不会声称这是设置网络应用的最佳方式,但它非常简单。
答案 7 :(得分:0)
好吧,我不完全确定你的意思是“网络应用”。当我把一个动态网站组合在一起时,我通常会以CGI的心态工作。 这是一个指向Common Lisp的CGI设置的链接http://www.cl-user.net/asp/jf8v/sdataQvStnw8XWwrFDQ3xCR8X8yBX8yBXnMq=/sdataQu3F $ sSHnB ==
由于我还不确定的原因,大多数Lisp Web工作似乎都围绕着一个用Lisp构建的Web服务器,而不是让Apache或IIS调用Lisp软件来解析.lisp文件。