如何使用 Lisp 或 Scheme 进行 Web 编程?

我通常用 PHP、 Ruby 或 Perl 编写网络应用程序。我正在开始研究的方案,我想尝试一些网络项目与这种语言。但我找不到最适合这种情况的环境。

我在寻找以下特征:

  • 获取请求参数的简单方法(比如: get-get # key、 get-post # key、 get-cookie # key)。
  • Myql 访问权限。
  • HTML 表单生成器、处理器、验证器等。
  • 用于过滤用户输入数据的帮助程序(比如 htmltity、 put in 查询的转义变量等)。
  • 牙线。
  • 对 GNU/Linux 友好。

所以,预先感谢所有的回复。

25123 次浏览

你可能想看看 Clojure:

Clojure 是一种面向 Java 虚拟机的动态编程语言。[ ... ] Clojure 提供了对 Java 框架的简单访问,包括可选的类型提示和类型推断,以确保对 Java 的调用可以避免反射。

Clojure 是 Lisp 的一种方言,它与 Lisp 共享代码即数据的哲学和一个强大的宏系统。

在 Clojure,使用 Java 进行互操作非常简单,因此您可以根据需要重用任何现有的 Java 库。我相信有很多对网络开发有用的东西。

Clojure-Contrib 有一个 SQL API,还有一个 ClojureQL,它应该可以满足您的数据库访问需求。

目前正在开发一个名为 镇静的 Clojure Web 框架,可能还有其他的框架。

Clojure 的来源是 英超下的 可在 github 上下载。让它在 Linux 上运行很容易; 我只需克隆 git repos 并运行 ant

Racket 有你需要的一切。参见 Racket Web 服务器 教程文件。网络服务器已经存在了一段时间,它有一个 很多的功能。可能唯一没有包含的是 mysql 接口,但是它在 行星(Racket 包分发工具)上以包的形式存在。

更新: Racket 现在支持 DB,可以与包括 mysql 在内的几个 DBs 一起工作。

Clojure 是最佳人选。使用一些非常简短、干净的代码,您可以实现一些非常复杂的应用程序,比如博客或论坛。

Paul Graham (和他的朋友们)专门为编写基本的 web 应用程序编写了一个 lisp 方言。它叫做 Arc,你可以在 Arclanguage.org买到它。

它可能不适合真正复杂的大型网站,我不知道它的数据库支持是在什么状态,但保罗格雷厄姆知道 如何用 lisp 编写 Web 应用程序,所以 Arc 将使 HTTP/HTML 部分容易,而你花费你的大部分大脑周期学习口齿不清的方式。

我使用自己的自定义 Scheme 版本,源自 MzScheme。它有一个新的、简单的 web 应用程序框架、一个内置的 web 服务器(不是 MzScheme 附带的那个)和 ODBC 库。(http://spark-scheme.wikispot.org/Web_applications).文档可能不是详尽无遗的,因为这更像是一个个人工具。但是在 代码存储库中有大量的示例代码。

试试 Weblock,一个 Common Lisp web 框架:

Http://weblocks.viridian-project.de/

Gambit Scheme 对网络应用程序也有自己的解决方案。它使用 叉子框架,基于 黑洞模块系统(Per Eckerdal 提供)。

Andrew Whaley 有一个关于如何让 Gambit,Black Hole 和 Sport 在 Apache 下使用 mod _ xy 运行 web 应用的初始 教程。你可能想看看那个。

在一个(可能)相关的说明,Gambit 也将编译你的东西到 C,然后到一个可执行文件,如果你觉得这样的倾向。

Weblock 是用 Common Lisp 构建 Web 应用程序的好工具,但对我来说有点太重了。

我们使用以下堆栈:

  • OpenMCL (开源 Lisp,非常好)

  • 便携式 Allegroserver (Web 服务器,HTML 生成器)

  • 我们自己的类似于 Rails 的 Ajaxy 工具(更新: 这个工具现在已经作为 无为开源)

  • 各种 CL 库,如 CL-json、 CL-smtp、 md5

如果你对 Common Lisp 感兴趣并且不想走 weblock 的路线,我推荐以下的设置:

  1. 在 Linux 上使用 SBCL,但支持多线程
  2. 使用 Hunchentoot 作为 Web 服务器,它将为您提供所需的所有服务器处理,包括会话和 cookie
  3. 使用 ClSql 与 MySql 进行通信,它有充足的文档,而且非常稳定。
  4. 对于 HTML 一代,您可以使用 Dr Edi Weitz Cl-WHO (有很好的文档记录)。

请注意,以上所有内容都是在 GPL 或类似许可下完成的(对 lisp 程序更有效的许可)

你可以用 诡计做网页开发。它的标准库包括(sxml simple)模块,该模块对于 html 生成、操作和解析非常有用。Guile库增加了对 http、 cgi 等的支持。Guile-DBI库提供了对 MySQL 和其他数据库的访问。通过这些构建块,您可以实现从简单的 cgi 脚本到使用自己的 HTTP 服务器的 Web 应用程序的所有内容。

我已经写了相当广泛的教程/电子书的主题: http://lispwebtales.ppenev.com/

快速总结:

  • 它使用 Common Lisp
  • 它使用 休斯塔斯框架
  • 它提供了大部分基本 web 开发的例子,包括数据库访问、身份验证、 HTML 生成和模板。
  • 因为 Restas 文档已经过时了,我的教程是最新的文档。
  • 展示了一些更高级的特性,比如策略,它允许你编写可插接口,例如,你可以编写一个数据存储层,为不同的存储机制编写相对容易的后端,模块系统允许你编写可重用的组件,像认证框架之类的东西。
  • 它涵盖了诸如安装 lisp、设置 ASDF 构建系统和 Quick lisp 包管理器等内容。
  • 它是免费的在线,并且只要我完成它将在 Leanpub 上也是免费的。源代码使用 CC 许可证在 https://github.com/pvlpenev/lispwebtales上运行,源代码是 MIT。还没有全部出版,我正在修改。

Clojure 是一种您可能感兴趣的 Lisp 方言。在这一点上有一个相当不错的 web 开发栈。我可以推荐一些东西:

  • leiningen依赖项管理器非常容易安装和管理您正在使用的库。相当不错的一套插件。甚至还有一个 Clojurescript 插件,这是一种基于 Clojure 的语言,可以编译成 Javascript。
  • ring HTTP 服务器抽象。它在大多数实际的 Web 框架中使用。在进入一个实际框架之前首先了解这一点是一个非常好的主意。
  • hiccup是用 Clojure 编写的 HTML dsl/模板语言。很有表现力!某种程度上,让我想起了杰德。
  • composure应该是 Clojure 最流行的 web 框架,它本质上是一个类似于 express.js的路由库。

让我们看看 Common Lisp能做些什么。

Common Lisp 生态系统的状态(2015)超棒的 Common Lisp列表向我们展示了一些现代框架(穴居人卢塞恩,都构建在新的 克拉克 web 应用服务器上,一个用于 Hunchentoot 和其他服务器的接口)。让我们用我们自己的发现来讨论。

更新2019 : Common Lisp Cookbook 上有一个新的教程: https://lispcookbook.github.io/cl-cookbook/web.html,它涵盖了路由、模板引擎、构建自包含的二进制文件、部署等等。

更新 : 过了一会儿,我发现了 打盹,由 Sly 或 Emacs 的 Yasnippet 的创建者创建,并且比“穴居人”有了更好的印象。声明端点就像声明函数一样,所以在 Caveman 中很乏味的一些事情在 Snoze 中很明显,比如访问 url 参数。我对此没有多少经验,但我建议你去看看。

更新2018年6月 : 也不要错过正在进行的 Weblocks 改写,这将是巨大的!: D http://40ants.com/weblocks/quickstart.html Weblock 允许构建动态的网络应用程序,不需要一行 Javascript 代码,不需要前后分离。它是基于组件的,就像 React 一样,但是是服务器端的。这是非常阿尔法的写作(2018年6月) ,但在进展中,它的工作,我有几个简单的网络应用程序的工作。

获取请求参数的简单方法(比如: get-get # key、 get-post # key、 get-cookie # key)。

我发现卢塞恩的方法更简单,它就像一个 ABc0宏(真实世界的例子) :

@route app (:post "/tweet")
(defview tweet ()
(if (lucerne-auth:logged-in-p)
(let ((user (current-user)))
(with-params (tweet)
(utweet.models:tweet user tweet))
(redirect "/"))
(render-template (+index+)
:error "You are not logged in.")))

穴居人的方式一直是 我不太清楚

Myql 访问权限

Caveman 宣传数据库集成(使用 Fukamachi 的 Datafly 和 sxql)。

您可以只使用 clsql 或 Mito ORM: https://lispcookbook.github.io/cl-cookbook/databases.html

HTML 表单生成器、处理器、验证器等。

我不知道外面是否有形态生成器。有: 氯仿手册,或再次 表格1,与 Caveman2一起工作。

穴居人 没有(于2011年提出)。

用于过滤用户输入数据的帮助程序(比如 htmltity、 put in 查询的转义变量等)。

Ratify 是一个输入验证库,但没有集成到框架中。

FLOSS 和 GNU/Linux 友好:

其他网上的东西

说到网络,在 CL 领域有 其他不错的图书馆:

  • Web 服务器: 是一个快速 HTTP 服务器,比 Nodejs 快(注意图表...) ,Wookie是一个异步 HTTP 服务器,
  • Dexador 是一个 HTTP 客户端
  • Plump 我查询课堂使得解析 html 和查询 DOM 变得容易。
  • Cl-bootstrap 模板引擎提供了 twitter-bootstrap 快捷方式(这种方式取代了 Jade/Pug,尽管我们也有通常的模板)。

Lisp 中的 Ajax

(记住,对于 Weblock,如上所述,我们可能不需要它们)

使用 父母脚本,我们可以在 Common Lisp 中编写 JavaScript,而不需要使用我们通常的工作流,因此我们可以使用 fetch web API 来编写 Ajax 调用。

您可能需要考虑用于 养鸡计划糟透了 Web 框架。

  • 本机支持 PostgreSQL 和 SQLite
  • 内置的对会话的轻松支持
  • 一些 webdev 习惯用法的快捷方式,比如 (ajax)过程
  • 您的应用程序可以很容易地编译成一个静态可执行文件(通过 csc -static) ,以便于部署
  • 收集所有鸡只图书馆(鸡蛋)不像其他一些编程语言那样通用,但也不是 糟透了