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


78

我通常用PHP,Ruby或Perl编写Web应用程序。我正在研究Scheme,我想尝试使用这种语言的一些Web项目。但是我找不到最佳的环境。

我正在寻找以下功能:

  • 一种获取请求参数的简单方法(类似:get-get#key,get-post#key,get-cookie #key)。
  • MySQL访问。
  • HTML表单生成器,处理,验证器等。
  • 用于过滤用户输入数据的助手(诸如htmlentities,用于转入查询的转义变量等)。
  • 牙线。
  • 与GNU / Linux友好。

因此,在此先感谢所有答复。


1
诸如htmlentities,转义功能,请求包装等之类的内容对于您在Scheme中实现自己来说可能是一个不错的练习,因为您说您只是在开始学习Scheme。
erjiang

Answers:


73

球拍拥有您所需的一切。请参阅Racket Web服务器教程,然后参阅文档。Web服务器已经存在了一段时间,并且具有很多功能。可能唯一未包含的是mysql接口,但作为PLaneT(球拍包分发工具)上的包存在。

更新:Racket现在提供数据库支持,可与包括mysql在内的多个数据库一起使用。


1
第二。延续界面也很有趣-不过不要担心它是否令人困惑;没有它,其余servlet接口仍然可以使用。不了解mysql接口,我会检查一下,谢谢!
亚伦,

1
自从09年以来,Racket已经获得了内置的数据库支持。支持PostgreSQL,MySQL,SQLite和ODBS。参见docs.racket-lang.org/db/index.html
soegaard 2012年

19

您可能想看看Clojure

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

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

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

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

Clojure的Web框架正在开发中,称为Compojure。可能还有其他。

Clojure的源代码可以在EPL下的github找到。在Linux上运行它很容易。我只是克隆git repos并运行ant


谢谢回复。我对Java没有任何经验。是否需要Clojure设置或使用?
卡斯特罗,

1
我不认为Java是必需的。您就可以开始使用Clojure。
Mike Mazur

1
Clojure在JVM上运行,因此您需要安装一个。一旦您不熟悉Clojure的内置类型,对Java类库的使用经验绝对是加分的。
wm_eddie

18

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



10

我已经写了一篇有关该主题的非常详尽的教程/电子书:http : //lispwebtales.ppenev.com/

快速总结:

  • 它使用Common Lisp
  • 它使用Restas框架
  • 它具有用于大多数基本Web开发的示例,包括数据库访问,身份验证,HTML生成和模板化。
  • 由于Restas文档已经过时,我的教程是最新文档中最接近的内容。
  • 显示一些更高级的功能,例如策略,该功能允许您编写可插拔接口,例如,您可以编写数据存储层,并相对轻松地编写用于不同存储机制的后端,该模块系统使您可以编写可重用的组件,例如auth框架之类的东西。
  • 它涵盖了诸如安装lisp,设置ASDF构建系统和quicklisp软件包管理器等内容。
  • 它是在线免费的,一旦我完成它,它将在leanpub上也是免费的。源代码为CC许可,位于https://github.com/pvlpenev/lispwebtales上,源代码为MIT。尚未全部出版,我正在修订中。


8

如果您对Common Lisp感兴趣,并且不想走weblocks路线,我建议您进行以下设置:

  1. 在Linux上使用SBCL但具有多线程支持
  2. 使用Hunchentoot作为网络服务器,它将为您提供所需的所有服务器处理,包括会话和cookie
  3. 使用ClSql与MySql进行通信,它具有足够的文档并且非常稳定。
  4. 对于HTM1代,您可以使用Edi Weitz Cl-WHO博士(非常有据可查)。

请注意,以上所有内容均受GPL或类似许可(对于Lisp程序更有效)


6

Gambit Scheme也为Web应用程序提供了自己的解决方案。它使用基于Black Hole模块系统的Spork框架(均由Per Eckerdal负责)。

Andrew Whaley有一个初始教程,介绍如何使用mod_proxy使Gambit,Black Hole和Spork在Apache下运行Web应用程序。您可能想看看。

在一个(可能)相关的说明中,如果您愿意,Gambit还将把您的东西编译为C,然后编译为可执行文件。


5

保罗·格雷厄姆(Paul Graham)和他的朋友们开发了一种Lisp方言,专门用于编写基本的Web应用程序。它称为Arc,您可以在arclanguage.org上获得它。

它可能不适合真正的大型复杂网站,而且我不确定数据库支持的状态如何,但是Paul Graham知道如何用Lisp编写Web应用程序,因此在您花费最多的时候,Arc会让您轻松使用HTTP / HTML的一部分。您的大脑循环学习口齿不清的方式。


3

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

我们使用以下堆栈:

  • OpenMCL(开源Lisp,非常好)

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

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

  • 各种CL库,例如cl-json,cl-smtp,md5


2

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

  • leiningen依赖管理,这使得是很容易安装和管理库,你正在使用。相当不错的插件集。甚至还有Clojurescript的插件,这是一种基于Clojure的语言,可以编译为Javascript。
  • ringHTTP服务器抽象。它在大多数实际的Web框架中使用。在跳入实际框架之前先学习它是一个相当不错的主意。
  • hiccup是用Clojure编写的HTML DSL /模板语言。它非常有表现力!从某种意义上说,让我想起了玉。
  • composure一定是Clojure最受欢迎的网络框架。它本质上是一个路由库,例如express.js

2

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

Common Lisp生态系统状态(2015年)Awesome Common Lisp列表向我们展示了几个现代框架(CavemanLucerne,它们都基于新的Clack Web应用程序服务器,Hunchentoot和其他服务器的接口)。让我们讨论一下我们自己的发现。

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

更新:稍后,我发现了Sly或Emacs的Yasnippet的创建者Snooze,给人的印象比Caveman更好。声明端点就像声明函数一样,因此在穴居人中有些繁琐的事情在Snooze中很明显,例如访问url参数。我没有太多经验,但是我建议您检查一下。

2018年6月更新:也不要错过正在进行的Weblocks重写,这将是巨大的!:D http://40ants.com/weblocks/quickstart.html Weblocks允许构建动态webapp,而无需一行Javascript,而无需前后分开。它是基于组件的,就像React一样,但是是服务器端的。截至撰写时(2018年6月),它的alpha值非常高,但仍在进行中并且正在运行,我有几个简单的Web应用程序正在运行。

一种获取请求参数的简单方法(类似:get-get#key,get-post#key,get-cookie #key)。

我发现卢塞恩方法更简单,它就像with-params宏一样简单(真实示例):

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

穴居人的方式对我来说不清楚

MySQL访问

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

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

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

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

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

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

批准是输入验证库,但未集成到框架中。

支持FLOSS和GNU / Linux:✓

其他网路内容

说到网络,CL领域还有其他不错的库

  • Web服务器:Woo是一种快速的HTTP服务器,比Nodejs(要注意图表…)要快,wookie是一个异步http服务器,
  • Dexador是一个HTTP客户端
  • 丰满lqueryCLSS可以很容易地解析HTML和查询DOM。
  • cl-bootstrapcl-who模板引擎提供了twitter-bootstrap快捷方式(即使我们也有普通的模板,它也可以替代Jade / Pug)。

Lisp中的Ajax

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

使用ParenScript,我们可以用Common Lisp编写JavaScript,而无需使用通常的工作流程,因此我们可以使用fetchWeb API编写Ajax调用。


0

Clojure对此非常适合。使用一些非常简短的代码,您可以实现一些非常复杂的应用程序,例如博客或论坛。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.