Lisp 与现代 Web 开发 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
vitovan
V2EX    程序员

Lisp 与现代 Web 开发

  •  2
     
  •   vitovan 2015-08-25 06:05:03 +08:00 10946 次点击
    这是一个创建于 3719 天前的主题,其中的信息可能已经有所发展或是发生改变。

    "Lisp 不是一门语言,它是一种构建素材。"

    - 艾伦凯

    本文将介绍如何从零开始使用 Lisp 作为后端构建一个现代的 Web 应用程序。

    从 Lisp 诞生至今已有 57 年,半个多世纪。什么概念呢?除了 Fortran 没有谁比 Lisp 更古老了,而很少有人说 Fortran 很酷。

    你可以在几乎所有的语言当中看到 Lisp 的影子,因为真的: Lisp 不是一门语言,她是人机对话的基本元素。

    Lisp For the Modern Web cn.jpg

    敬请阅读: http://vitovan.com/lispweb3-cn.html

    第 1 条附言    2015-08-25 08:55:19 +08:00

    阅读链接即为全书内容,无须购买。
    那为什么要买书呢?

    • 我有钱
    • 纯粹支持
    第 2 条附言    2015-08-25 09:00:33 +08:00
    第 3 条附言    2015-08-26 11:59:31 +08:00

    更新:

    脚注:

    [1] Hunchentoot 不是当下最好的选择:

    不要再直接使用 Hunchentoot 。 选择 Clack ,或者更好的一个基于 Clack 的框架。 

    - 2015 年 Common Lisp 生态现状

    43 条回复    2016-08-25 22:27:10 +08:00
    wukongkong
        1
    wukongkong  
       2015-08-25 07:36:05 +08:00
    书多长啊....
    和链接的一样么
    vitovan
        2
    vitovan  
    OP
       2015-08-25 07:55:59 +08:00
    @wukongkong 一模一样。
    vitovan
        3
    vitovan  
    OP
       2015-08-25 07:56:26 +08:00
    @wukongkong 有微调,比如截图等。
    zjxubinbin
        4
    zjxubinbin  
       2015-08-25 08:36:31 +08:00   1
    不错~mark 了~
    vitovan
        5
    vitovan  
    OP
       2015-08-25 08:41:20 +08:00 via Android
    WildCat
        6
    WildCat  
       2015-08-25 08:51:33 +08:00 via iPhone
    免费阅读就是全书内容吗?
    vitovan
        7
    vitovan  
    OP
       2015-08-25 08:55:28 +08:00   1
    @WildCat 阅读链接即为全书内容,无须购买。
    Imivan
        8
    Imivan  
       2015-08-25 08:56:39 +08:00   1
    买买买,支持。
    kainwen
        9
    kainwen  
       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 本人)给害了。。。。
    vitovan
        10
    vitovan  
    OP
       2015-08-25 09:11:42 +08:00
    @kainwen 你说的对。
    kainwen
        11
    kainwen  
       2015-08-25 09:43:13 +08:00   1
    @vitovan 我当年就是被害的脑残之一。。。。
    zhuangzhuang1988
        12
    zhuangzhuang1988  
       2015-08-25 09:46:54 +08:00   1
    @kainwen 书商太坏了, 营造学 lisp 必须要看《黑客与画家》的气氛, 虽然我也看了, 不过只是当创业书看的.
    brucefeng
        13
    brucefeng  
       2015-08-25 09:47:31 +08:00   1
    不错,支持
    SquirrelMAN
        14
    SquirrelMAN  
       2015-08-25 09:53:00 +08:00
    这不是 Hacker news 上的吗 233
    alvin2ye
        15
    alvin2ye  
       2015-08-25 10:02:47 +08:00   1
    果断先付款, 慢慢再看
    vitovan
        16
    vitovan  
    OP
       2015-08-25 10:14:26 +08:00
    @SquirrelMAN 是,中文版本。
    adoyle
        17
    adoyle  
       2015-08-25 10:26:36 +08:00   1
    写得不错,感谢 LZ 的分享
    R09PR0xF
        18
    R09PR0xF  
       2015-08-25 10:45:30 +08:00
    看成 Lips 了。
    vitovan
        19
    vitovan  
    OP
       2015-08-25 11:18:05 +08:00 via Android
    @alvin2ye 多谢!
    hansnow
        20
    hansnow  
       2015-08-25 12:01:20 +08:00   1
    被楼主幽默的语言逗坏了,赞一个!
    usapla
        21
    usapla  
       2015-08-25 12:06:57 +08:00
    我在 “面向世界的编程”部分遇到困难,我用的是 win7PC64 位系统,然后安装 quicklisp.lisp 部分是用 “ sbcl -- load quicklisp.lisp ”命令来执行的,然后执行后,按照提示继续安装。等运行 “ server.lisp ”部分一直提示缺少 libssl32.dll 文件,我把这个缺失文件放到 system32 里, 还是提示缺失,真是头痛
    vitovan
        22
    vitovan  
    OP
       2015-08-25 12:11:34 +08:00
    phoenixlzx
        23
    phoenixlzx  
       2015-08-25 12:15:55 +08:00   1
    好书好书 www mark 一下
    liuxu
        24
    liuxu  
       2015-08-25 12:53:05 +08:00 via Android   1
    酷毙了
    jadecoder
        25
    jadecoder  
       2015-08-25 17:36:33 +08:00   1
    放进 pocket 里了,今晚地铁看
    Rand01ph
        26
    Rand01ph  
       2015-08-25 18:23:00 +08:00   1
    一直支付出错。。。真是难
    vitovan
        27
    vitovan  
    OP
       2015-08-25 19:12:00 +08:00 via Android
    @Rand01ph

    抱歉,麻烦了。

    如果实在不行,可以尝试英文版:

    https://www.gitbook.com/book/vitovan/lispweb3/welcome
    bian
        28
    bian  
       2015-08-25 21:27:31 +08:00   1
    楼主还是将 lisp 改成 common lisp 吧。毕竟 lisp 有很多方言。。。
    bramblex
        29
    bramblex  
       2015-08-26 01:44:55 +08:00   1
    吃豆人哪个是指 Currying 的过程吗?很有意思啊
    Rico
        30
    Rico  
       2015-08-26 13:24:48 +08:00
    通过一个叫田春冰河的人知道了这门语言
    像是上古时期的一门法术
    脑洞一开,觉得掌握不同语言的程序员就像是会不同属性的技能的法师。 Some one like Gandalf
    nareix
        31
    nareix  
       2015-08-26 13:25:26 +08:00
    @kainwen 正解啊。 lisp 这种纯语法树的,在当时看来发明轮子很容易,但现在轮子已经比当初完善多了。比如 React/angular 等等。
    3b295
        32
    3b295  
       2015-08-26 14:30:06 +08:00
    《黑客与画家》是在高三看得。当时还到处和别人吹鼓 lisp 。试下用 lisp 造一下东西,应该更能体会 lisp 吧。
    yannxia
        33
    yannxia  
       2015-08-26 14:52:04 +08:00
    很多年前, LISP 就和 Java 一样火,甚至于更火,现在呢?
    a15819620038
        34
    a15819620038  
       2015-08-26 16:54:02 +08:00
    @vitovan Hello ,谢谢你提供的资源,内容很好简单。

    但我按照你书本里面的内容走,发现除了 / 能访问之外,其它带 uri 的例子都是 404 ,请问这个问题是?
    vitovan
        35
    vitovan  
    OP
       2015-08-26 17:11:40 +08:00
    @a15819620038 哈!那...... 能再详细一些么? 环境?步骤?
    a15819620038
        36
    a15819620038  
       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"
    ```
    vitovan
        37
    vitovan  
    OP
       2015-08-26 18:01:26 +08:00
    @a15819620038 如果 /hello 404 的话, JSON 的就更不用考虑了。

    你用的是什么系统?
    a15819620038
        38
    a15819620038  
       2015-08-26 19:29:23 +08:00
    @vitovan Mac OS X 10_9_4 ,谢谢你的帮助
    vitovan
        39
    vitovan  
    OP
       2015-08-26 21:39:58 +08:00
    @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 ))
    a15819620038
        40
    a15819620038  
       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 ))
    ```
    vitovan
        41
    vitovan  
    OP
       2015-08-27 05:09:19 +08:00 via Android
    @a15819620038 哇,明明是你自己解决的么!
    MonkLuf
        42
    MonkLuf  
       2015-09-03 08:44:00 +08:00
    @kainwen pg 这句话的出处是?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5812 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 02:39 PVG 10:39 LAX 19:39 JFK 22:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86