• 请不要在回答技术问题时复制粘贴 AI 生成的内容
vitovan
V2EX  ›  程序员

Lisp 与现代 Web 开发

  •  2
     
  •   vitovan · Aug 25, 2015 · 11319 views
    This topic created in 3913 days ago, the information mentioned may be changed or developed.

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

    - 艾伦·凯

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

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

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

    Lisp For the Modern Web cn.jpg

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

    Supplement 1  ·  Aug 25, 2015

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

    • 我有钱
    • 纯粹支持
    Supplement 2  ·  Aug 25, 2015
    Supplement 3  ·  Aug 26, 2015

    更新:

    脚注:

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

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

    - 2015 年 Common Lisp 生态现状

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

    抱歉,麻烦了。

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

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

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

    你用的是什么系统?
    a15819620038
        38
    a15819620038  
       Aug 26, 2015
    @vitovan Mac OS X 10_9_4 ,谢谢你的帮助
    vitovan
        39
    vitovan  
    OP
       Aug 26, 2015
    @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  
       Aug 26, 2015
    @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
       Aug 27, 2015 via Android
    @a15819620038 哇,明明是你自己解决的么!
    MonkLuf
        42
    MonkLuf  
       Sep 3, 2015
    @kainwen pg 这句话的出处是?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5314 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 193ms · UTC 03:57 · PVG 11:57 · LAX 20:57 · JFK 23:57
    ♥ Do have faith in what you're doing.