在Lisp中进行(严肃的)Web开发是否可行?

101

显然,几乎任何类型的应用程序都可以使用几乎任何编程语言来编写,特别是像 Lisp(无论是 Scheme 还是 Common Lisp)这样强大的语言。但是将其用于 Web 开发是否切实可行?如果是,什么是一个良好的起点?在哪里可以找到适合此类项目的正确资源(工具、库、文档、最佳实践、示例等)?


2
取决于你所说的“实用”。可能性是存在的,但对于大多数人来说,实用性可能不高。你打算让你的网站托管吗?你会操作自己的专用服务器并拥有根控制权吗?你愿意投入多少努力? - core
Leonardo,我正在撰写一本关于此主题的书籍,并希望得到对Lisp感兴趣的Web开发者的反馈。如果您愿意,请告诉我您是如何想到使用Lisp的,以及您希望在这样一本书中看到什么?我的邮箱是vsedach@gmail.com - user62715
@chris - 最近我为我的一些副业项目设置了Scheme托管;这比我想象的要容易- http://www.gcbhacks.dreamhosters.com/scheme-web-apps/ - gcbenison
2
去读一下保罗·格雷厄姆的文章吧。我怀疑在使用LISP进行Web应用程序讨论方面,他没有遗漏任何东西,而且他是一位伟大的作家。http://paulgraham.com/avg.html 他的主页是:http://paulgraham.com/index.html - Kelly S. French
Google的同志们:在 awesome CL 列表中有更多最新的答案。 - Ehvince
11个回答

81

是的,Web开发是Common Lisp今天的优势之一。

  • 作为Web服务器,使用Hunchentoot,这是由Edmund Weitz博士开发的原名为tbnl的解决方案。

    您可以将其作为Apache的后端使用mod_proxy作为反向代理运行,也可以作为独立服务器运行。

  • 有各种HTML生成解决方案可用,从PHP样式模板到Lisp宏技巧再到XSLT,任君选择。

    HTML-TEMPLATE就是其中一个例子。

  • Closure XML可用于XML解析、序列化、XPath 1.0、XSLT 1.0。 还有Closure HTML可用于HTML标记解析。

    (完全披露:我是Closure XML和Closure HTML的维护者。)

  • 如果您喜欢,Parenscript可以使您的JavaScript体验更加Lisp风格,但当然您也可以自己编写普通的JavaScript代码。

    另一个不错的JavaScript增强解决方案是jwacs,它是用Common Lisp编写的,并通过转换JavaScript以添加continuation支持。

  • Web服务项目可能需要HTTP客户端,除了服务器。

    Drakma是今天用于此目的的库。

    PURI有助于URI操作。

    还有更多! 一个起点是cliki,例如cliki.net/web

在网络上,没有人知道你的服务器是用Common Lisp编写的 :-)

1
这仅适用于Common Lisp和一组工具... - Attila Lendvai
20
在互联网上,没有人知道你是一只狗 - 对吗? - Matt Ball
1
@MattBall 汪汪。呜呜。嗷嗷。 - unsynchronized
1
在互联网上,没有人能听到你的Lisp服务器尖叫。 - kd4ttc

30

使用Common Lisp进行Web开发既高效又有趣。

以下是一些例子:

CL-WHO允许您编写HTML而不会忘记关闭标签。

Weblocks可以通过内置验证声明式地定义表单:

(defview signup (:type form :caption "Sign up")
  (username :satisfies #'valid-username)
  (password :present-as dual-password :parse-as dual-password)
  (receive-newsletter-p :present-as checkbox :parse-as predicate))

它还完全自动支持AJAX,如果浏览器不支持,则回退到普通链接。

cl-prevalence是SQL的一个极其简单的替代品。

最近有相当多的人在将这些技术用于关键任务应用中,并且取得了成功。

事实上,大多数重要的CL开源项目都拥有优秀的社区支持。


19

有一些用于Web开发的Web框架,可以看看以下内容:

如果您想要得到良好支持的Lisp工具,则需要付费。因为开源工具周围的社区并不是很大,所以它们的文档和采用程度都没有像Python上的Django那样高。

以下是一些商业Lisp产品:

值得注意的是,Reddit最初是用Lisp构建的,但作者后来迁移到Python,原因是缺乏使用广泛和有文档的库。 (链接)


他确实说过库是“最大的问题”,但就在那之前,他说“Reddit无法在我的Mac上运行”;当时,Mac只有一个线程CL,无法运行他们的低级套接字代码。这听起来至少也是一个无法克服的障碍。 - Ken
3
我是一个Lisp的粉丝,它正在取代Python成为我的首选语言。但我的工作需要使用C++。我可以找到其他理解Python原型的Python程序员,但在当前Lisp复苏没有更多成功之前,在工作中使用它会遭遇无尽的问题,“为什么不用Python或Ruby?” - Aaron

11

我无法评论其他框架,但是我使用Hunchentoot作为Web服务器非常成功(它可以独立运行,或者您可以将其放在Apache后面)。真正使其突出的是库!

我喜欢在Web上使用Common Lisp的原因是,您可以在运行时调整它。您始终拥有一个REPL来运行服务器代码,然后可以连接到该REPL并更改或检查代码的工作方式,而无需停止任何内容。我曾经在站点正在运行时重新定义函数,下一次调用该函数时,它只需要选择新代码并运行。


1
你知道有什么方法可以让LISP与MongoDB接口吗? - MadPhysicist
13年后,我不得不说这篇文章像一瓶陈年佳酿般经久耐用。我需要一个GUI应用程序(使用Common Lisp编写),可以在Windows和Linux上本地运行或客户端-服务器模式下运行。很遗憾,我没有足够的时间制作多个本机客户端或费心使用Qt/WxWidgets。React.js等框架过于臃肿。Cl-who + Parenscript非常好用,即使在2022年这个堆栈已经相当“古老”的情况下。CL具有足够的能力来弥补这些库的简单性。 - eMko

9
为进一步帮助打破“没有Lisp Web框架”的神话,这里列出了尚未提到的一些框架: 显然,很多人认为Lisp足以编写许多Web框架。
我不使用也不推荐任何Web框架。我更喜欢通过将正交工具(David Lichteblau提到了一些好的工具)结合在一起,并以实际适用于正在构建的应用程序的方式使用设计模式来构建Web应用程序,这是我推荐的方法。Common Lisp提供了丰富的这样的工具和无与伦比的组合能力。
亚当·彼得森去年发表了一篇很好的入门教程,介绍了如何以这种方式开始构建Lisp Web应用程序:

http://www.adampetersen.se/articles/lispweb.htm


8
我认为可以轻松地回答“是的”。
  1. 最早的HTTP服务器之一是cl-http

  2. 围绕DrScheme的Scheme人员在此上花费了大量时间:

  3. www.franz.com在他们自己的Web服务器(AllegroServer)和Web框架(webactions)上运行

  4. 如果你有疑问,请检查Edi Weitz的Common Lisp软件包。它们通常有效。

因此,使用Common Lisp可以进行“严肃”的Web编程。就我而言,我目前还没有决定是否要走Common Lisp路线或Ruby on Rails路线。我两者都比.NET更喜欢...

4

Paul Graham的公司Viaweb 写了一个产品,用Common Lisp编写,随后成为了Yahoo商店。显然,Yahoo后来将它重写为C++。有相当多的网络资源可供Lisp编程使用。


1
如果雅虎的情况是真的,有些人可能认为这是 Common Lisp 作为 Web 语言失败了。但是我会将其视为 Common Lisp 作为 Web 原型语言的成功。 - gcbenison
4
正如保罗·格雷厄姆在《超越平庸》的注释中所说:“在2003年1月,雅虎发布了一个用C++和Perl编写的新版本编辑器。很难说这个程序是否不再使用Lisp,因为为了将这个程序翻译成C ++,他们实际上必须编写一个Lisp解释器:据我所知,所有生成页面模板的源文件仍然是Lisp代码。”因此,我认为重写并非失败。 - protist
Viaweb并不是用Common Lisp原型设计的,以便在另一种语言C++中重写。它的生产者打算使用Lisp编写和运行它,因为他们认为这种语言具有很多明显的优点,如强大的功能、快速的原型设计和快速的生产能力,而且他们非常熟悉Lisp等等。他们使用自己用Lisp编写的版本来运行它,实际上其中的部分代码也是用Lisp编写的。据传闻,在Yahoo收购Viaweb之后,他们已经将其重写了,但我不确定。这是收购方的选择,他们甚至可以使用VBASIC、Pascal或Fortran来编写。 - sçuçu

2
您可以在这个问题中找到一些关于Lisp Web应用程序工具的内容。
另外,听一下Stack Overflow Podcast 27也许会值得,里面Reddit的人们谈到了他们在Lisp上运行网站的经验 (以及他们转向Python的原因)。

2
意见不一。通行的智慧是:最好使用不同的语言,或者说使用不同的网络堆栈,比如LAMP、.NET、Ruby on Rails、Java等等。在lisp中成功的著名网络项目是Paul Graham的ViaWebReddit最初是用lisp实现的,但后来转换为Python。如果您决定使用lisp,请尝试Seibel的书籍:Practical Common Lisp

1
你能不能在你的帖子中再多添加一些FUD呢? - jrockway
@Yuval是正确的。这是常识。Reddit确实进行了切换。我认为这篇文章在询问是否有任何真相在这个常识背后。 - Steve Rowe
1
@jrockway和Steve Rowe - 常识总是有其道理的。我不认为这是FUD。自从ViaWeb以来,我没有听说过任何成功的LISP编写的网站。如果我错了,请纠正我。我认为应该根据编程语言的优点而不是意识形态来使用它们。 - Yuval F

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接