【问题标题】:How can I do web programming with Lisp or Scheme?如何使用 Lisp 或 Scheme 进行 Web 编程?
【发布时间】:2010-11-19 12:28:18
【问题描述】:

我通常使用 PHP、Ruby 或 Perl 编写 Web 应用程序。我正在开始学习 Scheme,我想尝试一些使用这种语言的 web 项目。但是我找不到最适合这个的环境。

我正在寻找以下功能:

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

所以,提前感谢所有回复。

【问题讨论】:

标签: lisp scheme


【解决方案1】:

Racket 拥有您需要的一切。请参阅 Racket 网络服务器 tutorial,然后查看 documentation。 Web 服务器已经存在了一段时间,它有很多 功能。可能唯一没有包含的是 mysql 接口,但它作为一个包存在于PLaneT(Racket 包分发工具)上。

更新:Racket 现在带有 DB 支持,可与包括 mysql 在内的多个 DB 一起使用。

【讨论】:

  • 第二。 continuation 界面也很有趣——尽管它看起来令人困惑,但不要担心;没有它,servlet 接口的其余部分仍然可以工作。不知道mysql接口,我去看看,谢谢!
  • 自 09 年以来,Racket 已获得内置数据库支持。支持 PostgreSQL、MySQL、SQLite 和 ODBS。见docs.racket-lang.org/db/index.html
【解决方案2】:

你可能想看看Clojure

Clojure 是一种针对 Java 虚拟机的动态编程语言。 [...] Clojure 通过可选的类型提示和类型推断提供对 Java 框架的轻松访问,以确保对 Java 的调用可以避免反射。

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

在 Clojure 中与 Java 的互操作非常简单,因此您可以根据需要重用任何现有的 Java 库。我确信有很多对 Web 开发有用的东西。

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

有一个名为Compojure 的Clojure 网络框架正在开发中。可能还有其他人。

Clojure 的源代码是available on github,位于EPL 下。让它在 Linux 上运行很容易;我只是克隆 git repos 并运行 ant

【讨论】:

  • 感谢您的回复。我对 Java 没有任何经验。是否需要 clojure 设置或使用?
  • 我不认为 Java 是必需的;您将能够很好地开始使用 Clojure。
  • Clojure 在 JVM 上运行,因此您需要安装一个。一旦您脱离 Clojure 的内置类型,使用 Java 类库的经验绝对是一个加分项。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    试试 Weblocks,一个 Common Lisp 网络框架:

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

    【讨论】:

      【解决方案5】:

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

      快速总结:

      • 它使用 Common Lisp
      • 它使用Restas 框架
      • 它包含几乎大多数基本 Web 开发的示例,包括 DB 访问、身份验证、HTML 生成和模板。
      • 由于 Restas 文档已经过时,我的教程是最接近最新文档的。
      • 展示了一些更高级的特性,比如策略,它允许你编写可插拔的接口,例如你可以编写一个数据存储层,并且相对容易地为不同的存储机制编写后端,模块系统允许您编写可重用的组件,例如身份验证框架和类似的东西。
      • 它涵盖了安装 lisp、设置 ASDF 构建系统和 quicklisp 包管理器等内容。
      • 它是在线免费的,一旦我完成它,它也会在leanpub 上免费。源代码在https://github.com/pvlpenev/lispwebtales 上,CC 许可,源代码是 MIT。尚未全部发布,我正在修改中。

      【讨论】:

        【解决方案6】:

        【讨论】:

        • 链接的描述会很好。
        • PLT 方案现在称为 Racket,位于不同的站点:racket-lang.org
        【解决方案7】:

        如果您确切地说是对 Common Lisp 感兴趣并且不想走 weblocks 路线,我建议您使用以下设置:

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

        请注意,以上所有内容均在 GPL 或类似许可下(更适用于 lisp 程序)

        【讨论】:

          【解决方案8】:

          Gambit Scheme 也有自己的网络应用解决方案。它使用Spork 框架,基于Black Hole 模块系统(均由Per Eckerdal 提供)。

          Andrew Whaley 有一个初始的tutorial,关于如何让 Gambit、Black Hole 和 Spork 在 Apache 下使用 mod_proxy 运行 Web 应用程序。你可能想看看那个。

          在(可能)相关说明中,如果您愿意,Gambit 还会将您的内容编译为 C,然后编译为可执行文件。

          【讨论】:

            【解决方案9】:

            Paul Graham(和他的朋友)专门为编写基本的 Web 应用程序制作了一种 lisp 方言。它被称为 Arc,您可以通过 arclanguage.org 获得它。

            它可能不适合真正大型复杂的网站,我不确定它的数据库支持处于什么状态,但 Paul Graham 知道 how to write web applications in lisp,因此 Arc 将使 HTTP/HTML 部分在您花费大部分时间时对您来说很容易你的大脑循环学习 lisp 方式。

            【讨论】:

              【解决方案10】:

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

              我们使用以下堆栈:

              • OpenMCL(开源 Lisp,非常不错)

              • 便携式 Allegroserve(Web 服务器、HTML 生成器)

              • 我们自己的类似 Rails 的工具用于处理 Ajaxy (更新:现已开源为 WuWei

              • cl-json、cl-smtp、md5等多种CL库

              【讨论】:

                【解决方案11】:

                我使用我自己的自定义版本的 Scheme,从 MzScheme 派生。它有一个新的、简单的 Web 应用程序框架、一个内置的 Web 服务器(不是 MzScheme 附带的)和 ODBC 库。 (http://spark-scheme.wikispot.org/Web_applications)。文档可能并不详尽,因为这更像是一种个人工具。但是code repository 中有很多示例代码。

                【讨论】:

                  【解决方案12】:

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

                  • leiningen 依赖管理器使得安装和管理您正在使用的库非常容易。相当不错的插件集。甚至还有一个 Clojurescript 插件,它是一种基于 Clojure 的语言,可以编译为 Javascript。
                  • ring HTTP 服务器抽象。它用于大多数实际的 Web 框架。在进入实际框架之前先了解这一点是个好主意。
                  • hiccup 是用 Clojure 编写的 HTML dsl/模板语言。它非常有表现力!从某种意义上说,让我想起了 Jade。
                  • composure 必须是 Clojure 最流行的 Web 框架。它本质上是一个路由库,例如 express.js

                  【讨论】:

                    【解决方案13】:

                    让我们看看Common Lisp 可以做什么。

                    state of the Common Lisp ecosystem (2015)Awesome Common Lisp 列表向我们展示了几个现代框架(CavemanLucerne,均基于新的 Clack Web 应用程序服务器、Hunchentoot 和其他服务器的接口)。让我们讨论一下我们自己的发现。

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

                    更新:过了一会儿,我发现了 Snooze,作者是 Sly 或 Emacs 的 Yasn-p,我的印象比 Caveman 好得多。声明端点就像声明函数一样,所以一些在 Caveman 中乏味的事情在 Snooze 中是显而易见的,比如访问 url 参数。我没有太多经验,但我建议检查一下。

                    2018 年 6 月更新:也不要错过正在进行的 Weblocks 重写,它将是巨大的! :D http://40ants.com/weblocks/quickstart.html Weblocks 允许构建动态 webapps,无需一行 Javascript,无需分离前后。它是基于组件的,就像 React 一样,但是是服务器端的。截至撰写本文时(2018 年 6 月),它还处于 Alpha 阶段,但正在开发中,并且正在运行,我有几个简单的网络应用程序正在运行。

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

                    我发现 Lucerne 方法更简单,就像 with-params 宏 (real world example) 一样简单:

                    @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.")))
                    

                    穴居人的方式一直是less clear to me

                    Mysql访问

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

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

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

                    我不知道那里是否有表单生成器。 编辑:有:cl-formsformlets,或再次1forms,与 Caveman2 合作。

                    Caveman does not have one(2011 年提出的问题)。

                    过滤用户输入数据的助手(例如 htmlentities、用于输入查询的转义变量等)。

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

                    FLOSS 和 GNU/Linux 友好:✓

                    其他网络资料

                    说到网络,CL地里有other nice libraries

                    • web 服务器:Woo 是一个快速的 HTTP 服务器,比 Nodejs 更快(注意图表...),wookie 是一个异步 http 服务器,
                    • Dexador 是一个 HTTP 客户端
                    • PlumplqueryCLSS 使解析 html 和查询 DOM 变得容易。
                    • cl-bootstrapcl-who 模板引擎提供 twitter-bootstrap 快捷方式(它取代了 Jade/Pug,尽管我们也有常用模板)。

                    Lisp 中的 Ajax

                    (请记住,使用 Weblocks,见上文,我们可能不需要这些)

                    使用ParenScript,我们可以在Common Lisp 中编写JavaScript,而不必遵循我们通常的工作流程,因此我们可以使用fetch Web API 来编写Ajax 调用。

                    【讨论】:

                      【解决方案14】:

                      Clojure 非常适合这个。通过一些非常简短、干净的代码,您可以实现一些非常复杂的应用程序,例如博客或论坛。

                      【讨论】:

                        猜你喜欢
                        • 2011-09-03
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-06-10
                        • 2011-10-17
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-11-11
                        • 1970-01-01
                        相关资源
                        最近更新 更多