用 Common Lisp 写一个简单的 WEB 程序

恩。林林总总看过一些语言,但一直不能深入。现在终于摆脱了只能写写排序算法的阶段了。。。。。。。

这个小程序花了我两个晚上,实现的功能虽然简单,但在写的过程中还是收获了不少知识的(一些写排序算法学不到的东西)。

比如这个过程中了解很多 Common Lisp 的库, 做服务器的、用来开发网站的、向文本文件中嵌入 Lisp 表达式的、操作数据库的、解析 Markdown 的、生成 html 的、处理正则表达式的、管理配置文件的等等(还有抓取网页的、读取 csv 文件的、在命令行中运行 Lisp 程序的,不过这些这次没有用到)。

又比如对 Common Lisp 在开发实际软件中非常重要的但很少对初学者提起的【流】又多了一些理解和实际经验。

Common Lisp 还是有很多库的、函数式的语言调试起来也比较方便。不过 Common Lisp 的很多库的文档非常的不健全,比如那个叫 cl-markdown 的 markdown 引擎,文档也没有主页也没有。。。。只能看源代码学习它的 API。

大家也可以去尝试自己去写一些简单的小东西,不管用什么语言:-),其实并不像想象中的那么难~~在实践中还是能收获不少东西的。即使并不从事软件开发的工作(比如我),有这样一个自己写软件的人生经历也是不错的~

废话完了,现在简单介绍一下这个程序的功能以及如何安装:

  1. 可以在【写入文章】页面写文章,就像在论坛发帖一样会有一个标题和正文让你输入,写入的文章会被保存到数据库中(支持 markdown,或者说你只能用 markdown 写才能出正常的排版效果)。

  2. 可以在【查询文章】页面通过文章标题查询并显示经过 Markdown 引擎处理后的文章。

  3. 可以通过【删除数据库】按键清理掉所有的文章。

  4. 可以通过【创建数据库】按键建立一个新的数据库(在删除数据库之后建立。其实这两个按键连着操作就是【初始化数据库】,其实可以把他们合成一个函数的,现在先这样吧。。。)

如果扩展一下可以变成一个本地的 wiki(添加在一个页面显示所有文章的功能,添加删除文章的功能,改进一些功能比如搜索不存在在文章的时候给出错误提示等)。用 Common Lisp 写的程序还是很容易扩展的。

下面说说怎么安装:

首先要安装 sbcl 和 sqlite3。

sudo zypper sbcl sqlite3

然后是下载安装 quicklisp。

curl -O http://beta.quicklisp.org/quicklisp.lisp
sbcl --load quicklisp.lisp

运行 sbcl --load quicklisp.lisp 会进入 sbcl,这时候你需要在 sbcl 中运行 (quicklisp-quickstart:install),运行结束后你也可以进一步运行 (ql:add-to-init-file) 让 sbcl 自动载入 quickload。

这时候你的主目录下会多一个 quicklisp 文件夹。将 myapp.tar.gz (6.34 KB) 文件下载解压到 quicklisp/local-projects 内,然后在 sbcl 里运行

(ql:quickload "myapp")
(myapp:start :port 8080)

就好了。现在你就可以通过 127.0.0.1:8080 来访问这个程序了:-),注意 (ql:quickload “myapp”) 可能会运行比较长的时间,因为 quicklisp 需要下载一些依赖的库。打开的网页看起来是这样的( 请先无视糟糕的界面!!! )



现就这样吧,有时间再来说一下这个东西是怎么写出来的,其实非常简单的~只需要很少的 Common Lisp 知识。当然你刚开始可能会看不惯 Lisp 的代码:-)

赞一个。我试着写过一些软件,但是总是写得很慢很慢,毕竟水平局限在那里了……
试着写过 Haskell 的 web 应用,以前很想练好 Haskell,但是实在是受不了蛋疼的依赖关系,另外我的电脑上当时装了 Yesod 这个 framework,它的 server 就是工作有问题,网页做好了还是自动刷新到 404. 最后放弃 Haskell 之后就不太编程序了……

Common Lisp 写排序算法不太方便吧? 比如说快速排序? Lisp 好像没有 array(Haskell 就只有 List)

这个界面很符合我喜爱的风格 :heart_eyes:

这就是误解了,大概大家对 Lisp 的印象更加接近 scheme。Common Lisp 其实是一门非常庞大的语言(有些 scheme 粉丝就不喜欢 Common Lisp 太过于庞大,光比较相等的函数就有几十个、标准库里基本的函数和变量加起来有上千了),初学语法当然就是 Lisp 那种很简单,但深入下去会发现很多细节的东西其实还蛮复杂的。Common Lisp 是支持多种现代的数据结构的。支持列表、数组、哈希表(另外 Common Lisp 把一维数组称为向量、把向量和列表称为序列,都提供专门处理他们的函数)。另外列表中还提供集中轻量级的查询表(plist 和 alist),可以取代庞大的哈希表做一些比较小的数据处理。

Common Lisp 其实还可以声明变量类型的,一些优化后的 Common Lisp 程序跑的和 C 一样快。而且现在大多数 Common Lisp 的实现都是编译的。

我觉得 Common Lisp 还是挺适合初学者的,入手挺快的。当然也有缺点,一些库维护的不好(比如我本来想用 cl-org-mode 的,但是这个项目机能不动了而且连一个可以交付使用的版本都没有… …)、实现太多了, 另外可能不太实用一点 (我这种业余玩玩的当然无所谓啦~~)。Common Lisp 程序员貌似都有点自由散漫、不喜欢合作(一说是 Lisp 太过强大,一个人就能写出很复杂的软件)。所以你会发现 cliki 里面很多程序员搞出一堆功能差不多的库来。真正了不起的、通过大规模协作写出来的软件大多是商业软件,而且价格巨贵。比如 LispWork, 看他演示开发各种软件(特别是 GUI)真心方便,而且编译出来的软件真的很小巧(sbcl 写个 hello world 编译出来独立的软件也有好几 M)。可惜人家要 2500 刀许可证还要续期。。。。另外还有一个用于开发手机软件的平台,也挺贵的。

common lisp 写 web 这里有个教程 lispwebtales.ppenev.com/

这本书我有看过~~但是他用的框架是 RESTAS(其实就是 RESTAS 的教程啦),RESTAS 很不错但是有点复杂(觉得如果用过 PHP 有开发经验的看会比较熟悉吧,初学很多概念都不懂),另外还有一本 Lisp Web 和一本 Using Common Lisp to Build Web Applications。Lisp Web 里提到的方法比较通用一点,没有借助什么 Web 开发的框架,只是用了一个 Lisp 写的服务器完了用一些库用来生成 HTML 页面。最后一本用了一个叫 KPAX 的框架,但是这个东西现在已经跑不起来了。也就是废了。

我观察了一下,Weblocks 和 RESTAS 是比较不错的,可以做很专业的工作,但是也比较复杂一点点。我现在用的是 caveman2,比较轻量级一点,但是比 ningle 又功能多一点(比如支持数据库)。所以最终选择了使用 caveman2。给个链接。Caveman2 - The real web framework

2500 刀? 这个价格都比微软的 Visual Studio 还要贵了啊…… 太不划算了
但是确实商业软件很多编译出来效果好不少。

很老的一家公司了,这个价格也很多年了,一万年打一次折,从来没有听说过降价什么的。估计有一些大公司会用吧,也有狂热粉丝买了自己一个人用的,一买还把每个平台的都买了(它支持 win、FreeBSD、Linux、Mac、Solaris。也有人就此论证 Common Lisp 还是有前途的。还有一些平台甚至不明码标价,是根据收入分成来收费的)。可惜开源的成就远不及商业,很多非常优秀的代码不是商业的就是以前写的还没有移植到现有平台上的。记得一个 Common Lisp 程序员说过,Common Lisp 社区在可预见的十年内要做的工作就是把当初在 MIT 那帮老家伙搞出来的东西移植到现有的平台上来。据说当时的成果真的是非常非常的丰富。随便贴一个 tianchunbinghe.blog.163.com/blog/static/7001200702745739103/

(PS:只能是道听途说了,据说 allegro cl 是不明码标价的,根据收入分成来收费,虽然你可以申请 99 刀的学生版,但只能用一年,而且期限一过你之前编译出来的二进制程序也会失效,只能续期许可证。购买的商业版也是这样,只要许可证一过期代码全部作废。当然我只是听说…)

这样子太过商业化了,实际上也就很难普及了啊普及了……
其实有很多东西普及就是因为不要钱。微软的程序语言都不如以往流行了,Lispworks 实际上肯定是阻碍了 LISP 的发展。 或许采用其他模式能够一方面进一步普及,另一方面也获得更高的总收入。但是可能公司保守,毕竟有风险在哪里的。

开源的成就不及商业,其实开源和商业也是可以兼容的。至少在服务器这些领域开源的 LInux 确实比商业的 Windows 做得好(不过新版 Windows Server+IIS 的速度似乎已经超过 nginx 了) 但是程序语言这样的,编译器要编译出很高的效率,确实需要非常精细的设计和算法能力才行的,开源的很多都是一般的大学生和普通程序员爱好者,是很难和专业比的。

学术圈至少在美国开源很流行,学术实话说我觉得真要比实力还是很强的。IT 产业界可能只有微软的实力可以和学术圈相比(微软不光研究计算机科学,还研究生命科学,剑桥大学的一些生物研究背后都是和微软合作的)。但是学术圈子虽然开源,实在是…… 毕竟学术圈子首先要保住饭碗,要来钱,就要写论文。 Haskell 里面有好几个 GUI 开发的库,最后都没有继续更新了,实话说这些 GUI 库设计看起来很新颖,什么 Reactive Functional Programming,但是难以改变的事实就是作者在论文发表之后就停止更新,然后又会有别的学者来重新造轮子。 最后还是没有一个真正可以拿出来用的……

另外有些太封闭的东西,就算好也不能用,我的导师以前用 Macintosh Lisp 写的代码就全部报废了。《算法导论》CLRS 的作者用苹果 Macdraw 画图,结果 ppc 转 intel 之后 Macdraw 没了,然后那几个教授在前言里高呼“苹果公司请体恤民情把这个软件重新开发出来,否则我们现在还必须精心养护随时可能彻底报废的老 Macbook 用来写书”。 孔子说:不迁怒,不贰过。所以说这些教授们在吃了这么大的亏之后还是继续用这家公司的产品…… :smiling_imp: