文章目录
概述
以下内容来自文心一言的自动生成
什么是 Common Lisp
Common
Lisp(缩写为CL)是Lisp编程语言的一种方言,与Scheme合称为现代两大Lisp方言。下面我将从概念和历史两个方面来详细介绍Common
Lisp。概念
定义与标准
- Common Lisp是为了标准化此前众多的Lisp分支而开发的,其标准由ANSI X3.226-1994定义。它本身并不是一个具体的实现,而是各个Lisp实现所遵循的规范。
- Common Lisp是一个现代的、多重范式的、高性能、可编译的标准化ANSI编程语言。它支持过程编程、函数编程和面向对象编程等多种编程范式。
语言特性
- Common Lisp操作的数据是动态数据类型,但也可用类型声明来提高效率和增强安全性。
- 它具有高度灵活性,对象化编程以及快速的框架能力,提供优异的支持。
- Common Lisp拥有强大的宏能力,使编程者在编码时能够定制自己的应用,并给编程者提供了高度灵活的运行环境,可在运行时修改和调试程序。
- 其多重范式语言特性还允许编程者选择适当的方法和范式来适应编写的应用程序。
数据类型与结构
- Common Lisp拥有丰富的数据类型,包括整数、分数、浮点数、复数等数字类型,以及链表、向量、位向量、字符串等顺序类型。
- 它还使用内名(Symbol)作为数据对象的唯一命名,这在其他语言中较为少见。
历史
起源与发展
- Common Lisp起源于1956年John McCarthy发明的Lisp语言。Lisp在1956年被设计用于“符号数据处理”,而Lisp这个名字本身就来源于其最擅长的工作:列表处理(LISt
Processing)。- 随着时间的推移,Lisp得到了长足的发展。Common Lisp作为Lisp的现代版本,很好地支持了一组常用的现代数据类型,并提供了Java、Python和C++等语言的异常系统里所没有的充分灵活性。
标准化过程
- 在20世纪80年代,随着多种Lisp方言的出现,Lisp社区开始担心可能走向分裂。为了应对这一担忧,一个由Lisp黑客组成的草根组织于1981年成立,旨在集既有Lisp方言之所长,定义一种新的称为Common
Lisp的标准化Lisp语言。- 他们的工作成果被记录在Guy Steele的《Common Lisp: the Language》(CLtL)一书里,该书相当于Lisp的圣经。
- 到1986年,首批Common Lisp实现诞生了。1996年,美国国家标准化组织(ANSI)发布了一个建立在CLtL之上并加以扩展的Common
Lisp标准,其中增加了一些主要的新特性,包括CLOS和状态系统。现代应用
- 今天的Common Lisp已经进化得更像其他的开源语言,用户编写他们所需要的库并开放给其他人。开源的Common Lisp实现如SBCL、ClozureCL、CLisp等得到了广泛应用。
- Common Lisp在商业领域也有广泛应用,如Lispworks和AllegroCL等商业实现提供了丰富的功能和强大的性能。
综上所述,Common
Lisp作为一种强大的编程语言,在概念上融合了多种编程范式和丰富的数据类型,在历史上则经历了从起源到标准化的漫长过程,并在现代应用中展现了其独特的魅力和价值。应用领域
Common Lisp作为一种多范式的通用程序语言,具有广泛的应用领域。以下是Common Lisp的几个主要应用领域:
1. 人工智能
Common
Lisp在人工智能领域有着广泛的应用,这主要得益于其强大的元编程能力和动态特性。它常被用于构建专家系统、自然语言处理系统和机器学习模型等。Common
Lisp的宏系统允许开发者在编译时对代码进行宏展开和转换,这种灵活性使得在AI应用中实现复杂的逻辑和算法变得更加容易。2. 自然语言处理
在自然语言处理(NLP)领域,Common
Lisp同样表现出色。由于其支持面向对象编程和泛型编程,开发者可以构建出高效、可扩展的NLP系统。同时,Common
Lisp的丰富标准库提供了大量用于文本处理和分析的工具,进一步降低了NLP应用的开发难度。3. 数据分析
对于需要处理大量数据和进行复杂统计分析的应用场景,Common
Lisp也是一个不错的选择。它提供了丰富的数据处理和统计分析工具,能够支持大规模数据处理和复杂数据分析任务。此外,Common
Lisp的运行时重编译特性使得在数据分析过程中可以根据需要动态地调整和优化代码。4. 系统编程
Common Lisp的底层访问能力和强大的宏系统使其也适用于系统级编程和高性能计算。开发者可以利用Common
Lisp来编写与操作系统底层交互的代码,或者开发需要高性能计算支持的应用。5. Web开发
虽然Common
Lisp在Web开发领域的市场份额相对较小,但它仍然提供了多个Web开发框架(如Hunchentoot和Weblocks)用于构建高性能和可扩展的Web应用程序。这些框架支持常见的Web开发任务,如路由、模板渲染和数据库交互等。6. 教育与研究
Common
Lisp还常被用于教育和研究领域。由于其语法简洁、功能强大且易于学习,许多高校和研究机构选择将其作为教学语言或研究工具。通过学习Common
Lisp,学生可以深入了解编程语言的本质和编程范式的基本概念。7. 其他领域
除了上述领域外,Common Lisp还可以应用于其他许多领域,如游戏开发、图形界面开发等。由于其灵活性和可扩展性,Common
Lisp几乎可以应用于任何需要编程的领域。综上所述,Common
Lisp是一种功能强大、应用广泛的编程语言。它在人工智能、自然语言处理、数据分析、系统编程、Web开发以及教育与研究等领域都有着重要的应用价值。随着技术的不断发展和普及,相信Common
Lisp将在更多领域展现出其独特的魅力和优势。
基础
-
安装sbcl
在上面点击选择一个适合自己的即可,下载后安装。
-
当然,除了sbcl,还有其它可安装的,在下面网站列举了几个
https://portacle.github.io/ -
sbcl中输入中文
>chcp 65001
Active code page: 65001
>sbcl
C:\Users\myhas
This is SBCL 2.4.7, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* "ddd"
"ddd"
* "大家"
"大家"
*
- 四则运算
* 10
10
* 20
20
* (- 8 9)
-1
* (/ 4 8)
1/2
* (* 9 10)
90
*
- 函数
* (format t "hi,张三")
hi,张三
NIL
* (defun hi () (format t "hi,张三"))
HI
* (hi)
hi,张三
NIL
*(defun hello (name) (format t "hi,~a" name))
HELLO
0[2] (hello "wangwu")
hi,wangwu
NIL
在 Lisp 中 使用 format 函数
大多数 Lisp 方言(如 Common Lisp)都提供了 format 函数,该函数允许你以类似于 C 语言中 printf
函数的方式构建字符串。format 函数可以接受一个格式字符串和一系列的参数,这些参数将按照格式字符串中的说明插入到结果字符串中。(format nil "Hello, ~a!" "world") ; 输出: "Hello, world!"
在这个例子中,~a 是一个格式说明符,用于指示 format 函数将下一个参数作为字符串插入。
- 运行代码
0[2] (load "e:/learn/learn1.lisp")
hi,wangwu
T
0[2]
0[2] (hello "王五")
hi,王五
NIL
客户数据
增加客户
- 客户信息
(defvar clients (list "A" "B" "C"))
0[7] (defun new-client (name age) (list :name name :age age))
NEW-CLIENT
0[7] (new-client "张古" 28)
(:NAME "张古" :AGE 28)
0[4] (getf (list :a 1 :b 2) :b)
2
- 增加客户
0[8] (list (list :name "sss" :age 33)(list :name "www" :age 28))
((:NAME "sss" :AGE 33) (:NAME "www" :AGE 28))
0[5] (defvar *client-db* nil)
*CLIENT-DB*
0[5] (defun add-client (clt) (push clt *client-db*))
ADD-CLIENT
0[5] (add-client (new-client "张三" 28))
((:NAME "张三" :AGE 28))
0[6] (add-client (new-client "李四" 31))
((:NAME "李四" :AGE 31) (:NAME "张三" :AGE 28))
0[6] (add-client (new-client "王五" 23))
((:NAME "王五" :AGE 23) (:NAME "李四" :AGE 31) (:NAME "张三" :AGE 28))
0[6] *client-db*
((:NAME "王五" :AGE 23) (:NAME "李四" :AGE 31) (:NAME "张三" :AGE 28))
0[9] (defun show-clients () (dolist (clt *client-db*) (format t "~{~a: ~8t ~a ~% ~}~%" clt)))
SHOW-CLIENTS
0[3] (show-clients )
NAME: 王五
AGE: 23
NAME: 李四
AGE: 31
NAME: 张三
AGE: 28
NIL
format
下面内容由文心一言自动生成
Lisp中的format
函数是一个强大的输出格式化工具,它允许开发者以灵活的方式格式化字符串和数值。format
函数的基本语法如下:
lisp (format destination control-string &rest format-arguments)
destination
:输出目标,通常是一个流(如标准输出流t
或文件流)或nil
(表示不输出到任何地方,但计算格式化字符串)。control-string
:控制字符串,用于指定如何格式化format-arguments
中的参数。&rest format-arguments
:一个或多个格式化参数,根据control-string
中的指令进行格式化。
控制字符串中的指令
控制字符串由文本和格式指令组成,格式指令以波浪线(~
)开头,后跟一个或多个字符来指定格式化选项。以下是一些常见的格式指令:
-
基本文本输出:
~A
:将参数转换为文本表示,适用于大多数类型。~S
:类似于~A
,但尝试以可被read
函数读回的形式输出,字符串会被包含在引号内。
-
数字输出:
~D
:输出十进制整数。~X
:输出十六进制整数(小写字母)。~x
:输出十六进制整数(大写字母)。~O
:输出八进制整数。~B
:输出二进制整数。~F
、~E
、~G
、~S
(浮点):用于格式化浮点数,其中~F
和~S
通常用于固定点表示,~E
用于科学计数法。~$
:用于货币格式,可以指定小数点后的位数。
-
宽度、精度和对齐:
- 可以在指令前添加数字来指定最小宽度,如
~10A
表示输出至少10个字符宽度的文本,不足部分用空格填充。 - 可以在宽度后添加逗号分隔的精度说明,如
~10,2F
表示输出宽度至少为10个字符的浮点数,小数点后有两位。 - 使用
@
、:
等修饰符可以改变对齐方式或大小写处理。
- 可以在指令前添加数字来指定最小宽度,如
-
特殊字符:
~%
:换行符。~&
:条件换行符,仅在需要时换行。~T
:定义列的起始位置,用于对齐输出。
-
其他:
~R
:将数字转换为英文单词形式的字符串。~P
:用于文件名或路径的格式化。
示例
以下是一些使用format
函数的示例:
(format t "The value is: ~A" 123) ; 输出: The value is: 123
(format t "The list is: ~S" '(1 2 3)) ; 输出: The list is: (1 2 3)
(format t "Hexadecimal: ~X" 255) ; 输出: Hexadecimal: FF
(format t "Fixed-point number: ~10,2F" 3.14159) ; 输出: Fixed-point number: 3.14
(format t "Currency: ~$" 123.456) ; 输出可能依赖于实现,但通常是货币格式
(format t "Newline ~% and conditional newline ~&") ; 输出: Newline
; 然后是一个新行,但~&不会在这里产生新行
请注意,format
函数的具体行为可能会因Lisp方言(如Common Lisp、Scheme等)的不同而有所差异。上述示例和说明主要基于Common Lisp的通用行为,但其他方言可能会有细微的差别。 在Lisp中,特别是Common Lisp中,~{
和 ~}
是一对特殊的格式控制符,它们用于处理列表(list)或向量(vector)的格式化输出。这对控制符允许你以迭代的方式格式化列表或向量中的每个元素,而不需要显式地编写循环来逐个处理元素。
~{
下面内容由文心一言自动生成
使用 ~{
开始一个列表或向量的格式化,并使用 ~}
来结束它。在 ~{
和 ~}
之间,你可以指定一个或多个格式指令,这些指令将应用于列表或向量中的每个元素。
示例
假设你有一个数字列表,并希望将它们格式化为十进制数,每个数后面跟着一个空格,你可以这样做:
(format t "~{~D ~}" '(1 2 3 4 5))
这将输出:
1 2 3 4 5
注意,在 ~D
(十进制整数)之后有一个空格,这个空格也会被复制到每个元素之后。
嵌套格式
你还可以嵌套使用格式控制符,以更复杂的方式格式化列表或向量中的元素。例如,如果你有一个包含字符串和数字的列表,并希望以不同的方式格式化它们,你可以这样做:
(format t "~{~:[~A~;~D~] ~}" '("one" 2 "three" 4))
这里使用了 ~:[...~;...]
条件格式控制符,它根据列表元素的类型(在这个例子中是字符串还是数字)来选择不同的格式化选项。但是,请注意,上面的代码在Common Lisp中可能不会直接工作,因为 ~:[...~;...]
需要一个条件表达式来判断,而直接根据类型选择并不直接支持。不过,你可以通过编写一个函数来生成适当的格式字符串或使用其他技术来实现类似的效果。
然而,对于简单的类型区分和格式化,你可能需要编写更复杂的逻辑或使用其他Lisp特性(如宏)来动态生成格式字符串。
注意
- 不同的Lisp方言(如Scheme)可能不支持
~{
和~}
这样的格式控制符,或者它们可能有不同的语法和行为。 - 在使用这些格式控制符时,请确保你的Lisp环境支持它们,并查阅相应的文档以了解详细的语法和用法。
- 格式化字符串的复杂性和可读性可能会随着嵌套和条件逻辑的增加而降低,因此请务必保持代码的清晰和可维护性。
参考文献
- https://common-lisp.net/
- 文心一言
- 《实用Common Lisp编程》