我想写一个Lisp Web应用程序只是为了好玩.我发现了关于Lisp网络应用程序的这个问题,但所有答案看起来都很复杂.在查看答案中提供的链接后,解决方案看起来非常复杂.
如果我只想要一个简单的"hello world"Lisp网络应用程序,有没有一种简单的方法呢?
这个答案看起来很复杂,但我认为启动和运行一个简单的Lisp Web应用程序要比学习其他更多令人敬畏的Lisp容易,所以它可能是值得的.
这里有一些非常棒的Common Lisp书籍,内容介绍到网页应用程序章节:实用Common Lisp和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服务在那里编程,更好地支持SBCL线程.也许一些CL向导可以在这里提出一些其他提示.这才对我有用.
对于CL-HTTP,可以将服务器加载到Lisp中并执行:
(defun hello-world (url stream)
(http:with-successful-response (stream :text)
(princ "hello world" stream)))
Run Code Online (Sandbox Code Playgroud)
以上是响应函数.响应函数有两个参数:URL和流.响应函数添加了通常的响应标头,并说它返回'text'.在此,我们只需将字符串打印到输出流.
(http:export-url #u"/hello-world"
:computed
:response-function 'hello-world)
Run Code Online (Sandbox Code Playgroud)
上面导出一个与默认上下文(默认服务器名称和端口)合并的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
Run Code Online (Sandbox Code Playgroud)
而已.