Common Lisp

秦滨海
2023-12-01
  Common Lisp

来自 维客

Jump to: navigation, search

Common Lisp,一般缩写为 CL(不要和缩写同为CL的組合邏輯混淆),是Lisp的方言,标准由ANSI X3.226-1994定义。它是为了标准化此前众多的Lisp分支而开发的,它本身并不是一个具体的实现而是各个Lisp实现所遵循的规范。

相对于各种嵌入在特定产品中的语言Emacs LispAutoLISP,Common Lisp 是一个通用用途的编程语言。不像很多早期的Lisp,Common Lisp同Scheme一样,其中的变量是有作用域的。

Common Lisp 是一个多重范式编程语言,这表现在:

  • 支持各种编程技术:过程编程函数编程面向对象的编程。
  • 动态数据类型,但是可以使用可选的类型声明来提高效率和增强安全性。
  • 可以通过一些标准特性来扩展,例如 Lisp宏 (程序自我进行的编译时代码重排 (compile-time code rearrangement accomplished by the program itself)) 和 阅读器宏 (赋予用户自定义的保留字以特殊意义的符号扩展 (extension of syntax to give special meaning to characters reserved for users for this purpose))。
<script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "显示"; var tocHideText = "隐藏"; showTocToggle(); } </script>
[ 编辑]

语法

Common Lisp 是一种 Lisp; 它使用 S-表达式 来表示代码和数据结构。 函数和宏调用以列表的形式写出,列表的第一项是函数名,就像在这些例子中:

(+ 2 2)           ;  将 2 加上 2, 得 4
(setf p 3.1415)  ; 设定变量 "p" 等于 3.1415
; 定义一个函数用来计算一个数的平方:
(defun square (x) (* x x))
; 执行这个函数:
(square 3)        ; 返回 "9"
[ 编辑]

数据类型

Common Lisp 拥有相当丰富的数据类型,比很多语言都要多。

[ 编辑]

标量类型

数字 类型包括 整数分数浮点数, 和 复数。 Common Lisp 使用 bignum 来表示任意长度和精度的数值。 分数类型精确的表示分数,这是很多语言都不具备的能力。 Common Lisp 自动将数值转换成适当的类型。

Common Lisp 字符 类型并不仅仅是 ASCII 字符 — 没什么可吃惊的,Lisp 在 ASCII 出现前就存在了。 一些现代的实现允许使用Unicode字符。[1]

符号 (Symbol)类型是Lisp语言共有的,但是其他的语言中就很难听到。一个符号是一个唯一的命名数据对象。Lisp中的符号类似其他语言中的标识符(Identifier), 他们像变量一样保存值;然而 they are more general and can be used for themselves as well. 一般来说,当一个符号被赋值,its value as a variable is returned. 也有例外: 关键词符号像 :foo 自我赋值, 布尔值由两个相对的符号TNIL表示。

[ 编辑]

数据结构

Common Lisp 的顺序类型包括表(lists),向量(vectors), 位向量(bit-vectors),和字符串(strings)。

同任何其他的Lisp一样,Common Lisp中的列表称作conses,有时候叫做cons cells 或者 pairs。一个cons就是拥有两个槽的数据结构,这两个槽被称作 carcdr

[ 编辑]

函数

[ 编辑]

定义函数

[ 编辑]

函数名字空间

[ 编辑]

其他类型

[ 编辑]

[ 编辑]

Variable capture and shadowing

[ 编辑]

同其他Lisp的比较

[ 编辑]

实现

Common Lisp 是由一份技术规范定义而不是被某一种具体实现定义(前者有 Ada语言 C语言,后者有Perl语言)。 存在很多种实现,语言标准详细阐明了可能导致合理歧义的内容。

另外,各种实现试图引入库包来提供标准没有提及的功能。可移植的自由软件库提供了各种特性,Common-Lisp.netCommon Lisp Open Code Collection 项目。

Common Lisp 设计为由增量编译器实现。 优化编译的标准声明(例如内联函数)已进入语言规范的计划。 大多数Lisp实现将函数编译成原生的机器语言。其他的编译器编译为比特码,有损速度但是容易实现二进制代码的可移植。由于Lisp提供了交互式的提示符以及函数增量式的依次编译,很多人误会为Lisp是纯解释语言。

一些基于Unix的实现,例如CLISP,可以作为脚本解释器使用;因此,系统可以像调用Perl 或者Unix shell解释器一样透明的调用它。

[ 编辑]

实现的列表

免费的可重发布实现包括:

  • CMUCL, 最初来自卡内基梅隆大学,现在作为自由软件由一个志愿者团队维护。 CMUCL 使用一个快速的原生代码编译器。它运行于 x86上的LinuxBSD;Alpha上的Linux;以及 Solaris、 IRIX 和 HP-UX 。参见 [2]
  • GNU CLISP, 是一个bytecode编译的实现。它可移植并运行在很多Unix和Unix风格的系统上(包括Mac OS X), 以及Microsoft Windows 和一些其他系统。
  • Steel Bank Common Lisp (SBCL),是 CMUCL 的一个分支。 "宽泛的说,SBCL 是CMUCL的可维护性加强版本。" [3] SBCL 运行的平台和 CMUCL 一样,除了 HP/UX;另外,它运行于PowerPC上的Linux,SPARC,MIPS, 和Mac OS X之上。 SBCL 不使用解释器;所有的语句编译为原生机器码。
  • GNU Common Lisp (GCL), GNU项目的 Lisp 编译器。GCL还不是完全兼容ANSI,但它仍然是一些大型项目所选择的实现,包括数学工具 Maxima, AXIOM 和 ACL2。GCL 运行在 十一种架构的GNU/Linux 下,以及 Windows, Solaris, 和 FreeBSD
  • Embeddable Common Lisp (ECL), 设计为可嵌入C语言应用中;
  • OpenMCL, Macintosh Common Lisp的开源分支。如同名字所示,OpenMCL is native to the Macintosh ;运行于Mac OS X, Darwin, 和PowerPC 上的 Linux 。
  • Movitz 实现了x86上的Lisp环境而不依赖任何OS。
  • Armed Bear Common Lisp 是一个运行在Java虚拟机上的Common Lisp实现。它包括了一个编译器可以编译Javabyte code,并允许Common Lisp调用Java库。Armed Bear Common Lisp 是Armed Bear J Editor的一个组件,但它也能独立使用。
  • Jatha 是一个Java库,实现了Common Lisp的大部分子集。

商业实现在这里Franz, Inc., Xanalys Corp., Digitool, Inc., Corman Technologies and Scieneer Pty Ltd..

[ 编辑]

应用

Common Lisp 被用于很多成功的商业应用中,最著名的(毫无疑问要归功于Paul Graham的推广)要数Yahoo! 商店的站点。其他值得一提的例子有:

  • Orbitz, 以旅行书籍为主的站点
  • Mirai, Izware LLC's fully integrated 2d/3d computer graphics content creation suite that features what is almost universally regarded as the best polygonal modeler in the industry, an advanced IK/FK and non-linear animation system (later popularized by such products as Sega's Animanium and Softimage XSI, respectively), and advanced 2d and 3d painting. It is used in major motion pictures (most famously in New Line Cinema's Lord of the Rings), video games and military simulations.
  • Piano, 一个用Lisp写的商业的航空期前期设计包以及与它的竞争对手的比较
  • Xanalys Corp.的调查软件,被全球的警察,安全部门和防止诈骗服务部门采用
  • Genworks International的多用途说明语言(GDL),是一个基于CL的开发工具,用来创建基于web的工程,设计和商业应用

也有很多成功的开源应用用Common Lisp写成,例如:

同样,Common Lisp也被许多政府和非盈利组织采用。NASA中的例子有:

[ 编辑]

外部链接

 类似资料:

相关阅读

相关文章

相关问答