"Lisp 不是一门语言,它是一种构建素材。"
- 艾伦·凯
本文将介绍如何从零开始使用 Lisp 作为后端构建一个现代的 Web 应用程序。
从 Lisp 诞生至今已有 57 年,半个多世纪。什么概念呢?除了 Fortran 没有谁比 Lisp 更古老了,而很少有人说 Fortran 很酷。
你可以在几乎所有的语言当中看到 Lisp 的影子,因为真的: Lisp 不是一门语言,她是人机对话的基本元素。

阅读链接即为全书内容,无须购买。
那为什么要买书呢?
更新:
脚注:
[1] Hunchentoot 不是当下最好的选择:
不要再直接使用 Hunchentoot 。 选择 Clack ,或者更好的一个基于 Clack 的框架。
- 2015 年 Common Lisp 生态现状
|      1wukongkong      2015-08-25 07:36:05 +08:00 书多长啊.... 和链接的一样么 | 
|  |      2vitovan OP @wukongkong 一模一样。 | 
|  |      3vitovan OP @wukongkong 有微调,比如截图等。 | 
|  |      4zjxubinbin      2015-08-25 08:36:31 +08:00  1 不错~mark 了~ | 
|  |      5vitovan OP | 
|  |      6WildCat      2015-08-25 08:51:33 +08:00 via iPhone 免费阅读就是全书内容吗? | 
|  |      8Imivan      2015-08-25 08:56:39 +08:00  1 买买买,支持。 | 
|      9kainwen      2015-08-25 09:00:47 +08:00  2 楼主知道 PG 现在怎么看 Common Lisp 么? PG 原话: "Common Lisp does have a lot of flaws. You would probably be better off with Racket or Clojure"。 有意思的是,似乎现在还有很多技术人员在追捧《黑客与画家》? CL 的很多库都 N 多年没有人维护了,而且 usocket 到现在还不支持 ipv6 。 中国很多脑残 lisp 粉就是被 pg 的书的不良宣传(不是 pg 本人)给害了。。。。 | 
|  |      12zhuangzhuang1988      2015-08-25 09:46:54 +08:00  1 @kainwen 书商太坏了, 营造学 lisp 必须要看《黑客与画家》的气氛, 虽然我也看了, 不过只是当创业书看的. | 
|  |      13brucefeng      2015-08-25 09:47:31 +08:00  1 不错,支持 | 
|  |      14SquirrelMAN      2015-08-25 09:53:00 +08:00 这不是 Hacker news 上的吗 233 | 
|      15alvin2ye      2015-08-25 10:02:47 +08:00  1 果断先付款, 慢慢再看 | 
|  |      16vitovan OP @SquirrelMAN 是,中文版本。 | 
|  |      17adoyle      2015-08-25 10:26:36 +08:00  1 写得不错,感谢 LZ 的分享 | 
|      18R09PR0xF      2015-08-25 10:45:30 +08:00 看成 Lips 了。 | 
|  |      20hansnow      2015-08-25 12:01:20 +08:00  1 被楼主幽默的语言逗坏了,赞一个! | 
|  |      21usapla      2015-08-25 12:06:57 +08:00 我在 “面向世界的编程”部分遇到困难,我用的是 win7PC64 位系统,然后安装 quicklisp.lisp 部分是用 “ sbcl -- load quicklisp.lisp ”命令来执行的,然后执行后,按照提示继续安装。等运行 “ server.lisp ”部分一直提示缺少 libssl32.dll 文件,我把这个缺失文件放到 system32 里, 还是提示缺失,真是头痛 | 
|  |      22vitovan OP | 
|  |      23phoenixlzx      2015-08-25 12:15:55 +08:00  1 好书好书 www mark 一下 | 
|  |      24liuxu      2015-08-25 12:53:05 +08:00 via Android  1 酷毙了 | 
|  |      25jadecoder      2015-08-25 17:36:33 +08:00  1 放进 pocket 里了,今晚地铁看 | 
|  |      26Rand01ph      2015-08-25 18:23:00 +08:00  1 一直支付出错。。。真是难 | 
|  |      27vitovan OP | 
|  |      28bian      2015-08-25 21:27:31 +08:00  1 楼主还是将 lisp 改成 common lisp 吧。毕竟 lisp 有很多方言。。。 | 
|      29bramblex      2015-08-26 01:44:55 +08:00  1 吃豆人哪个是指 Currying 的过程吗?很有意思啊 | 
|  |      30Rico      2015-08-26 13:24:48 +08:00 通过一个叫田春冰河的人知道了这门语言 像是上古时期的一门法术 脑洞一开,觉得掌握不同语言的程序员就像是会不同属性的技能的法师。 Some one like Gandalf | 
|      31nareix      2015-08-26 13:25:26 +08:00 @kainwen 正解啊。 lisp 这种纯语法树的,在当时看来发明轮子很容易,但现在轮子已经比当初完善多了。比如 React/angular 等等。 | 
|  |      323b295      2015-08-26 14:30:06 +08:00 《黑客与画家》是在高三看得。当时还到处和别人吹鼓 lisp 。试下用 lisp 造一下东西,应该更能体会 lisp 吧。 | 
|      33yannxia      2015-08-26 14:52:04 +08:00 很多年前, LISP 就和 Java 一样火,甚至于更火,现在呢? | 
|  |      34a15819620038      2015-08-26 16:54:02 +08:00 | 
|  |      35vitovan OP @a15819620038 哈!那......  能再详细一些么? 环境?步骤? | 
|  |      36a15819620038      2015-08-26 17:19:20 +08:00 @vitovan  > sbcl --version SBCL 1.1.6.0-3c5581a JSON 的那个例子(之前那个 /hello 例子同样 404 ),代码都是复制进去的。 访问 /, 200 ``` "GET / HTTP/1.1" 200 393 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4 ) AppleWebKit/537.36 (KHTML, like Gecko ) Chrome/44.0.2403.157 Safari/537.36" ``` 访问 /me , 404 ``` "GET /me HTTP/1.1" 404 303 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4 ) AppleWebKit/537.36 (KHTML, like Gecko ) Chrome/44.0.2403.157 Safari/537.36" ``` | 
|  |      37vitovan OP | 
|  |      38a15819620038      2015-08-26 19:29:23 +08:00 @vitovan Mac OS X 10_9_4 ,谢谢你的帮助 | 
|  |      39vitovan OP @a15819620038 你说 “代码都是复制进去的“,指的是直接复制到 REPL 里面然后回车的么? 还是用的加载文件的形式? --- 先把 Hello 搞出来再说,试试启动 sbcl 之后,直接在 REPL 内执行以下代码: (ql:quickload :hunchentoot ) (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242 )) (hunchentoot:define-easy-handler (say-hello :uri "/hello") (name ) (setf (hunchentoot:content-type*) "text/plain") (format nil "嘿, ~a! 我是 Vito! ~%我刚刚用 Lisp 建了个网站!" name )) | 
|  |      40a15819620038      2015-08-26 22:55:21 +08:00 @vitovan Hi ,谢谢你的回答,我解决了 O (∩_∩)O 。 创建 handler 的代码需要在运行服务监听端口代码之前: ``` ;; 调换一下位置 (hunchentoot:define-easy-handler (say-hello :uri "/hello") (name ) (setf (hunchentoot:content-type*) "text/plain") (format nil "嘿, ~a! 我是 Vito! ~%我刚刚用 Lisp 建了个网站!" name )) (hunchentoot:start (make-instance 'hunchentoot:easy-acceptor :port 4242 )) ``` | 
|  |      41vitovan OP @a15819620038 哇,明明是你自己解决的么! | 
|  |      43sammo      2016-08-25 22:27:10 +08:00 |