Common Lisp,一般缩写为 CL(不要和缩写同为CL的組合邏輯混淆),是Lisp的方言,标准由ANSI X3.226-1994定义。它是为了标准化此前众多的Lisp分支而开发的,它本身并不是一个具体的实现而是各个Lisp实现所遵循的规范。 相对于各种嵌入在特定产品中的语言Emacs Lisp 和 AutoLISP,Common Lisp 是一个通用用途的编程语言。不像很多早期的Lisp,Common Lisp同Scheme一样,其中的变量是有作用域的。
[
编辑]
语法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 自我赋值, 布尔值由两个相对的符号T 和 NIL表示。
[
编辑]
数据结构Common Lisp 的顺序类型包括表(lists),向量(vectors), 位向量(bit-vectors),和字符串(strings)。 同任何其他的Lisp一样,Common Lisp中的列表称作conses,有时候叫做cons cells 或者 pairs。一个cons就是拥有两个槽的数据结构,这两个槽被称作 car 和cdr。
[
编辑]
函数
[
编辑]
定义函数
[
编辑]
函数名字空间
[
编辑]
其他类型
[
编辑]
宏
[
编辑]
Variable capture and shadowing
[
编辑]
同其他Lisp的比较
[
编辑]
实现Common Lisp 是由一份技术规范定义而不是被某一种具体实现定义(前者有 Ada语言 和 C语言,后者有Perl语言)。 存在很多种实现,语言标准详细阐明了可能导致合理歧义的内容。 另外,各种实现试图引入库包来提供标准没有提及的功能。可移植的自由软件库提供了各种特性,Common-Lisp.net 和 Common Lisp Open Code Collection 项目。 Common Lisp 设计为由增量编译器实现。 优化编译的标准声明(例如内联函数)已进入语言规范的计划。 大多数Lisp实现将函数编译成原生的机器语言。其他的编译器编译为比特码,有损速度但是容易实现二进制代码的可移植。由于Lisp提供了交互式的提示符以及函数增量式的依次编译,很多人误会为Lisp是纯解释语言。 一些基于Unix的实现,例如CLISP,可以作为脚本解释器使用;因此,系统可以像调用Perl 或者Unix shell解释器一样透明的调用它。
[
编辑]
实现的列表免费的可重发布实现包括:
商业实现在这里Franz, Inc., Xanalys Corp., Digitool, Inc., Corman Technologies and Scieneer Pty Ltd..
[
编辑]
应用Common Lisp 被用于很多成功的商业应用中,最著名的(毫无疑问要归功于Paul Graham的推广)要数Yahoo! 商店的站点。其他值得一提的例子有:
也有很多成功的开源应用用Common Lisp写成,例如:
同样,Common Lisp也被许多政府和非盈利组织采用。NASA中的例子有:
[
编辑]
外部链接
|