Common Lisp/CL 案例研究
本章的目的是提供一组深入的示例或案例研究,说明如何在 Common Lisp 中实现程序。这里目标是让你感受一下完整的 Common Lisp 应用程序可能是什么样子。这一点很重要,因为典型的 Common Lisp 应用程序通常不像许多小部分拼凑在一起那样。程序员在 Common Lisp 中可以达到的独特抽象级别倾向于促使程序将语言定制到目的,并导致开发的整体效率。
本章的另一个目的是突出显示在其他部分中忽略的一些包。一些 Common Lisp 应用程序/项目,由于各种原因,不适合放在本书的其他地方。一些被排除是因为 Common Lisp 初学者不会觉得它有趣,另一些是因为使用它们有很大的学习障碍,需要太多文字来解释,还有一些可能是由于最近的开发而变得不稳定,或者停滞不前并遭受了比特腐烂。这些项目仍然有一些非常酷的部分,现在你对 Common Lisp 有了扎实的了解,我们可以介绍这些包,并花更多的时间解释必要的东西。
众所周知,Common Lisp 语言缺乏可移植的 GUI 解决方案。我们之前讨论过 LTK,它适用于任何安装了 wish 的人,但对于一些应用程序来说,它令人讨厌地慢。提供 GUI 的另一种方法是通过 Web 浏览器。动态网页的 Web 技术(javascript + AJAX + 服务器端程序)已经发展到足以满足大多数 GUI 功能的需求。人们付出了很多努力,让它在任何运行浏览器的计算机上看起来都一样。此外,您可以非常轻松地让您的应用程序在本地和远程运行。当然,它也会相当浪费 CPU 和内存,但 c'est la vie。
- Common Lisp 中的基于 Web 的游戏
- WebBlocks
- Uncommon Web (UCW)
请耐心等待,因为这是一个相当复杂的计算理论主题。通过编写非确定性代码,可以轻松地编写出解决 NP 问题的方案。没有这样的机器能够在多项式时间内执行该代码,但有一些非确定性模拟器可以在指数时间内执行该代码。即使这样的模拟器需要很长时间才能找到一个足够大的输入的解决方案,它仍然可以用来在几分钟内快速制作一个简单的实现。更重要的是,这个原型可以被开发,以提供更好的性能或使用近似值来有效地找到接近的解决方案。
几种语言都有非确定性模拟器。Prolog(通过回溯搜索)和 Scheme(通过延续)就浮现在脑海中。Common Lisp 有一个提供这种功能的包;它被称为 Screamer。我们之前讨论过 Screamer,但它值得进一步深入的例子。Screamer 对你的代码执行所谓的 CPS 转换,从而产生对非确定性行为的模拟。
- 使用 Screamer 做一些有趣的事情
Screamer 在 CLiki 上
面向上下文编程是一种新的编程范式,其中代码执行的上下文会修改它的行为。设计者将其视为对面向对象编程和面向方面编程想要解决的思想的进一步发展。
- 使用 ContextL 做一些事情
早期版本的 Lisp 在计算机代数(计算机辅助的代数和微积分问题操作和求解)和自动定理证明(计算机辅助的数学定理证明)方面开创了先河。
- 一个数学简化程序
- 从 Maxima 使用 Common Lisp,从 Common Lisp 使用 Maxima
- 使用 ACL2 证明