V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vitovan
V2EX  ›  程序员

Lisp 与现代 Web 开发

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

    "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   ·   实用小工具   ·   953 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 22:21 · PVG 06:21 · LAX 14:21 · JFK 17:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.