🌪️ 旋转与循环:在Lisp的世界里翩翩起舞 2024-09-242024-09-24 作者 C3P00 在这个充满无限可能的编程宇宙里,Lisp就像是一位古老的舞者,以优雅的身姿在功能与数据之间自由穿梭。今天,我们将深入探讨Lisp中的闭包、循环和字符串处理,带你领略这位舞者如何在代码的舞台上翩翩起舞。 🌍 生命的循环:闭包与作用域 生活中,循环往往让人感到乏味,但在Lisp的元宇宙里,循环则是行动的象征,而函数则是通往内心世界的窗口。首先,我们要理解作用域的概念——就如一位演员在舞台上,只能在特定的时间和空间内展现其才华。 全局符号的作用域使得Lisp图像的任何部分都可以达到或修改其值,而其他符号则拥有词法作用域。这意味着这些符号只在被定义的文本块中有效,当文本块结束时,它们不再与原值绑定。比如,参数符号只在函数体内与调用函数的参数绑定,直到函数返回为止。以下是一个简单的示例: (defun my-func (param1 param2) (let ((sum (+ param1 param2))) (print sum))) 在这个函数中,param1和param2的作用域是整个函数体,而sum的作用域则只限于let块内部。这就像一位舞者在舞台上,随着音乐的节奏,只有在特定的旋律中才能展现自己的风采。 🔍 闭包:锁住环境的魔法 在Lisp中,我们可以定义局部符号,使用let或let*来实现。这就像是在舞台上为每位演员准备了自己的道具,确保他们在表演时能够随心所欲。更神奇的是,Lisp允许我们返回一个函数,形成闭包,这样即使源作用域已经结束,定义时的环境依然与函数相伴而生。 看看这个“工厂”函数,它为我们生产加法器: (defun my-adder (grow-by) (let ((sum 0)) (lambda () (incf sum grow-by)))) 在这个例子中,my-adder函数返回一个闭包,能够记住它的环境,保持sum的状态。你可以创建多个加法器,每个加法器都拥有自己的“记忆”: (defvar *two-counter* (my-adder 2)) (defvar *three-counter* (my-adder 3)) (funcall *two-counter*) ; => 2 (funcall *two-counter*) ; => 4 (funcall *three-counter*) ; => 3 这就像是每位舞者都有自己的节奏与风格,尽管在同一个舞台上表演,却展现出不同的魅力。 🔄 循环:编程世界的舞步 在Lisp中,控制流的另一大类便是循环。我们可以使用多种形式的循环,从简单的loop到更复杂的dotimes和dolist。想象一下,舞者在舞台上如何随着音乐的节拍反复舞动。 🎶 永恒的循环 在Lisp中,loop可以形成一个永恒的循环,直到调用return: (let ((n 0)) (loop (princ ".") (if (> n 10) (return n) (incf n)))) 这段代码就像是在舞台上不停地转圈,直到你决定停下来的那一刻。 🔢 固定次数的循环 dotimes允许我们重复执行某个动作固定次数: (dotimes (n 10) (princ ".")) 想象一下,舞者在舞台上跳了十次相同的舞步,观众们不禁为之喝彩。 📜 遍历的循环 dolist则是将每个元素一一展现,如同舞者在每个观众面前展示各自的风采: (dolist (n '(1 2 3 4 5)) (princ n)) 在这里,每一个数字都是一个舞者,依次走上舞台,展现他们的魅力。 🧵 字符串:编程中的语言之舞 在Lisp中,字符串用双引号括起来,形成一个字符的一维数组。Lisp提供了多种字符串操作符,帮助我们在字符的世界中自由舞动。 字符串的魔法 常见的字符串操作包括: (length x):获取字符串长度 (string= x y):比较两个字符串的相等性 (string-upcase x):将字符串转换为大写 (reverse x):反转字符串内容 这些操作就像是舞者在舞台上的各种姿态,灵活多变,令人目不暇接。 🎭 字符与字符串的转换 在Lisp中,字符用#\表示,字符常量也可以用类似的方式定义: #\space ; 表示空格字符 通过这些表达,我们可以在字符串与字符之间自由转换,仿佛舞者能够在不同的舞蹈风格之间自如切换。 📚 结论:在Lisp的舞台上畅游 在Lisp的世界中,闭包、循环与字符串处理如同舞蹈的各个元素,彼此交织,形成了一幅绚丽的编程画卷。每一个功能都是舞者的舞步,每一行代码都是他们的旋律。在这个舞台上,我们不仅能看到代码的美丽,更能感受到编程的乐趣。 📝 参考文献 Common Lisp – The Tutorial Part 7 https://github.com/rabbibotton/clog/blob/main/LEARN.md 面向记忆的学习材料 任务目标 快速学习并记住Common Lisp中关于闭包、循环和字符串处理的重要概念。 知识点: 作用域和闭包题目: 在Common Lisp中,以下哪种符号具有词法作用域(lexical scope)?选项:A. 全局符号✅B. 函数参数✅C. 特殊变量✅D. 宏参数✅显示内容正确答案: B显示内容解析: 在Common Lisp中,全局符号具有全局作用域,可以在整个Lisp镜像中访问或修改。而函数参数等其他符号具有词法作用域,仅在其定义的文本块内有效。函数参数的绑定仅在函数体内有效,直到函数返回。显示内容速记提示: “函数参数,局部有效” 知识点: let和let*的使用 题目: 以下哪种情况下应该使用let*而不是let?选项:A. 当需要定义多个相互独立的局部变量时✅B. 当一个定义需要引用另一个定义时✅C. 当只需要定义一个局部变量时✅D. 当定义的变量都是全局的时✅显示内容正确答案: B显示内容解析: let用于创建局部变量,但如果一个定义需要引用另一个定义,就应该使用let。let*允许后面的定义引用前面的定义,而let中的所有定义是并行的,不能相互引用。显示内容速记提示: “let*允许相互引用” 知识点: 闭包的概念题目: 在Common Lisp中,什么是闭包(closure)?选项:A. 一种特殊的全局变量✅B. 一种循环结构✅C. 一个带有其定义环境的函数✅D. 一种字符串处理方法✅显示内容正确答案: C显示内容解析: 闭包是一个函数,它携带了其定义时的环境。即使函数的源代码范围已经词法关闭(最后的右括号已闭合),定义该函数的环境仍然与之一起存在。这就是为什么它被称为”闭包”。显示内容速记提示: “函数+环境=闭包” 知识点: loop..return循环题目: 在Common Lisp中,如果loop..return结构中从未调用return,会发生什么?选项:A. 循环会立即终止✅B. 循环会执行一次后终止✅C. 循环会无限执行✅D. 会产生编译错误✅显示内容正确答案: C显示内容解析: 在Common Lisp中,如果loop..return结构中从未调用return,循环将永远执行下去。return用于提供退出循环的条件,如果没有这个条件,循环就会一直进行。显示内容速记提示: “无return,永远loop” 知识点: dotimes循环题目: 在Common Lisp的dotimes循环中,循环变量n的取值范围是什么?选项:A. 1 到 n✅B. 0 到 n✅C. 0 到 n-1✅D. 1 到 n-1✅显示内容正确答案: C显示内容解析: 在dotimes循环中,循环变量n的取值范围是0到n-1。循环重复n次,每次循环n等于0, 1, 2, …, 直到n-1。显示内容速记提示: “dotimes从0到n-1” 知识点: dolist循环题目: 在Common Lisp的dolist循环中,循环变量n是如何变化的?选项:A. n每次增加1✅B. n每次减少1✅C. n绑定到列表的下一个元素✅D. n保持不变✅显示内容正确答案: C显示内容解析: 在dolist循环中,每次循环n都会绑定到列表的下一个元素,直到所有元素都被处理完毕。这使得dolist非常适合遍历列表中的所有元素。显示内容速记提示: “dolist绑定下一元素” 知识点: do循环题目: Common Lisp中的do循环有什么特点?选项:A. 只能进行单一循环✅B. 只能处理数字✅C. 允许同时进行多个循环✅D. 必须使用关键字loop✅显示内容正确答案: C显示内容解析: Common Lisp中的do循环允许同时进行多个循环。每个循环都可以定义为(符号 起始值 如何改变符号)的形式。这使得do循环非常灵活,能够处理复杂的循环逻辑。显示内容速记提示: “do支持多循环并行” 知识点: 字符串创建题目: 在Common Lisp中,如何创建字符串?选项:A. 使用单引号✅B. 使用双引号✅C. 使用反引号✅D. 使用括号✅显示内容正确答案: B显示内容解析: 在Common Lisp中,字符串是使用双引号创建的。例如,”Hello, World!”就是一个字符串。字符串在Lisp中被视为字符的一维数组。显示内容速记提示: “双引号创建字符串” 知识点: 字符串操作题目: 以下哪个函数用于获取字符串的长度?选项:A. string-length✅B. str-len✅C. length✅D. size✅显示内容正确答案: C显示内容解析: 在Common Lisp中,length函数用于获取字符串的长度。这个函数不仅可以用于字符串,还可以用于其他序列类型。使用方法为(length x),其中x是要测量长度的字符串。显示内容速记提示: “length测长度” 知识点: 字符串比较题目: Common Lisp中用于比较字符串相等性的函数是?选项:A. string=✅B. equal✅C. eq✅D. eql✅显示内容正确答案: A显示内容解析: 在Common Lisp中,string=函数用于比较两个字符串是否相等。这是一个区分大小写的比较。使用方法为(string= x y),其中x和y是要比较的字符串。显示内容速记提示: “string=比较字符串” 知识点: 字符串大小写转换题目: 如何将字符串转换为大写?选项:A. string-uppercase✅B. string-upcase✅C. upcase-string✅D. to-upper✅显示内容正确答案: B显示内容解析: 在Common Lisp中,string-upcase函数用于将字符串转换为大写。它返回一个新的大写字符串,而不修改原始字符串。使用方法为(string-upcase x),其中x是要转换的字符串。显示内容速记提示: “string-upcase变大写” 知识点: 字符串修剪题目: 哪个函数用于去除字符串两端的空白字符?选项:A. string-trim✅B. string-strip✅C. trim-string✅D. remove-whitespace✅显示内容正确答案: A显示内容解析: 在Common Lisp中,string-trim函数用于去除字符串两端的空白字符。它返回一个新的已修剪的字符串。使用方法为(string-trim ” ” x),其中x是要修剪的字符串,第一个参数指定要修剪的字符(这里是空格)。显示内容速记提示: “string-trim去两端” 知识点: 字符串连接题目: 在Common Lisp中,如何连接多个字符串?选项:A. string-append✅B. concat✅C. concatenate✅D. join✅显示内容正确答案: C显示内容解析: 在Common Lisp中,concatenate函数用于连接多个字符串。使用方法为(concatenate ‘string x y),其中x和y是要连接的字符串。注意第一个参数’string指定了结果的类型。显示内容速记提示: “concatenate连接字符串” 知识点: 字符到字符串的转换题目: 如何将一个字符转换为字符串?选项:A. char-to-string✅B. make-string✅C. string✅D. to-string✅显示内容正确答案: C显示内容解析: 在Common Lisp中,string函数用于将一个字符转换为字符串。使用方法为(string #\x),其中#\x表示要转换的字符。这个函数会返回一个包含该字符的新字符串。显示内容速记提示: “string函数字符变字符串” 知识点: 字符串解析为数字题目: 哪个函数用于将表示整数的字符串转换为数字?选项:A. string-to-number✅B. parse-integer✅C. read-number✅D. to-integer✅显示内容正确答案: B显示内容解析: 在Common Lisp中,parse-integer函数用于将表示整数的字符串转换为数字。使用方法为(parse-integer “123”),它会返回对应的整数值。这个函数只能处理整数,不能处理浮点数。显示内容速记提示: “parse-integer字符串变整数” 知识点: 数据到字符串的转换题目: 如何将任意Lisp对象转换为其打印表示的字符串?选项:A. object-to-string✅B. print-to-string✅C. write-to-string✅D. stringify✅显示内容正确答案: C显示内容解析: 在Common Lisp中,write-to-string函数用于将任意Lisp对象转换为其打印表示的字符串。使用方法为(write-to-string x),其中x是要转换的对象。这个函数会返回一个新的字符串,表示该对象的打印形式。显示内容速记提示: “write-to-string对象变字符串” 知识点: 字符表示题目: 在Common Lisp中,如何表示一个字符?选项:A. ‘c✅B. “c”✅C. #\c✅D. \c✅显示内容正确答案: C显示内容解析: 在Common Lisp中,字符使用#\加上字符本身来表示。例如,#\z表示字符’z’。这种表示方法允许明确地指定单个字符,而不是字符串或符号。显示内容速记提示: “#\表示单个字符” 知识点: 字符操作题目: 哪个函数用于获取字符串中特定位置的字符?选项:A. string-char✅B. char✅C. get-char✅D. elt✅显示内容正确答案: B显示内容解析: 在Common Lisp中,char函数用于获取字符串中特定位置的字符。使用方法为(char my-string x),其中my-string是字符串,x是要获取的字符的索引(从0开始)。这个函数返回指定位置的字符。显示内容速记提示: “char获取特定字符” 知识点: 字符比较题目: 用于比较两个字符是否相等的函数是?选项:A. char-equal✅B. char=✅C. equal-char✅D. eq✅显示内容正确答案: B显示内容解析: 在Common Lisp中,char=函数用于比较两个字符是否相等。这是一个区分大小写的比较。使用方法为(char= x y),其中x和y是要比较的字符。如果两个字符相等,函数返回true。显示内容速记提示: “char=比较字符相等” 知识点: 字符常量题目: 以下哪个不是Common Lisp中预定义的字符常量?选项:A. #\space✅B. #\newline✅C. #\tab✅D. #\comma✅显示内容正确答案: D显示内容解析: Common Lisp预定义了一些特殊的字符常量,包括#\space(空格)、#\newline(换行)、#\tab(制表符)等。但#\comma(逗号)不是预定义的字符常量。其他常用的字符常量还包括#\return(回车)、#\backspace(退格)等。显示内容速记提示: “常用特殊字符有预定义常量” 总结 本学习材料涵盖了Common Lisp中关于闭包、循环和字符串处理的重要概念。主要内容包括: 作用域和闭包:理解全局作用域和词法作用域的区别,以及闭包的概念和应用。 循环结构:介绍了loop..return、dotimes、dolist和do等不同类型的循环,每种循环都有其特定的用途和语法。 字符串操作:包括字符串的创建、比较、修改、连接等基本操作,以及字符串与其他数据类型之间的转换。 字符处理:讲解了字符的表示方法,以及相关的操作函数。 掌握这些概念对于使用Common Lisp进行编程至关重要。建议读者多加练习,特别是在实际编程中运用这些概念,以加深理解。
在这个充满无限可能的编程宇宙里,Lisp就像是一位古老的舞者,以优雅的身姿在功能与数据之间自由穿梭。今天,我们将深入探讨Lisp中的闭包、循环和字符串处理,带你领略这位舞者如何在代码的舞台上翩翩起舞。
🌍 生命的循环:闭包与作用域
生活中,循环往往让人感到乏味,但在Lisp的元宇宙里,循环则是行动的象征,而函数则是通往内心世界的窗口。首先,我们要理解作用域的概念——就如一位演员在舞台上,只能在特定的时间和空间内展现其才华。
全局符号的作用域使得Lisp图像的任何部分都可以达到或修改其值,而其他符号则拥有词法作用域。这意味着这些符号只在被定义的文本块中有效,当文本块结束时,它们不再与原值绑定。比如,参数符号只在函数体内与调用函数的参数绑定,直到函数返回为止。以下是一个简单的示例:
在这个函数中,
param1
和param2
的作用域是整个函数体,而sum
的作用域则只限于let
块内部。这就像一位舞者在舞台上,随着音乐的节奏,只有在特定的旋律中才能展现自己的风采。🔍 闭包:锁住环境的魔法
在Lisp中,我们可以定义局部符号,使用
let
或let*
来实现。这就像是在舞台上为每位演员准备了自己的道具,确保他们在表演时能够随心所欲。更神奇的是,Lisp允许我们返回一个函数,形成闭包,这样即使源作用域已经结束,定义时的环境依然与函数相伴而生。看看这个“工厂”函数,它为我们生产加法器:
在这个例子中,
my-adder
函数返回一个闭包,能够记住它的环境,保持sum
的状态。你可以创建多个加法器,每个加法器都拥有自己的“记忆”:这就像是每位舞者都有自己的节奏与风格,尽管在同一个舞台上表演,却展现出不同的魅力。
🔄 循环:编程世界的舞步
在Lisp中,控制流的另一大类便是循环。我们可以使用多种形式的循环,从简单的
loop
到更复杂的dotimes
和dolist
。想象一下,舞者在舞台上如何随着音乐的节拍反复舞动。🎶 永恒的循环
在Lisp中,
loop
可以形成一个永恒的循环,直到调用return
:这段代码就像是在舞台上不停地转圈,直到你决定停下来的那一刻。
🔢 固定次数的循环
dotimes
允许我们重复执行某个动作固定次数:想象一下,舞者在舞台上跳了十次相同的舞步,观众们不禁为之喝彩。
📜 遍历的循环
dolist
则是将每个元素一一展现,如同舞者在每个观众面前展示各自的风采:在这里,每一个数字都是一个舞者,依次走上舞台,展现他们的魅力。
🧵 字符串:编程中的语言之舞
在Lisp中,字符串用双引号括起来,形成一个字符的一维数组。Lisp提供了多种字符串操作符,帮助我们在字符的世界中自由舞动。
字符串的魔法
常见的字符串操作包括:
(length x)
:获取字符串长度(string= x y)
:比较两个字符串的相等性(string-upcase x)
:将字符串转换为大写(reverse x)
:反转字符串内容这些操作就像是舞者在舞台上的各种姿态,灵活多变,令人目不暇接。
🎭 字符与字符串的转换
在Lisp中,字符用
#\
表示,字符常量也可以用类似的方式定义:通过这些表达,我们可以在字符串与字符之间自由转换,仿佛舞者能够在不同的舞蹈风格之间自如切换。
📚 结论:在Lisp的舞台上畅游
在Lisp的世界中,闭包、循环与字符串处理如同舞蹈的各个元素,彼此交织,形成了一幅绚丽的编程画卷。每一个功能都是舞者的舞步,每一行代码都是他们的旋律。在这个舞台上,我们不仅能看到代码的美丽,更能感受到编程的乐趣。
📝 参考文献
面向记忆的学习材料
任务目标
快速学习并记住Common Lisp中关于闭包、循环和字符串处理的重要概念。
知识点: 作用域和闭包
正确答案: B
解析: 在Common Lisp中,全局符号具有全局作用域,可以在整个Lisp镜像中访问或修改。而函数参数等其他符号具有词法作用域,仅在其定义的文本块内有效。函数参数的绑定仅在函数体内有效,直到函数返回。
速记提示: “函数参数,局部有效”
题目: 在Common Lisp中,以下哪种符号具有词法作用域(lexical scope)?
选项:
A. 全局符号✅
B. 函数参数✅
C. 特殊变量✅
D. 宏参数✅
知识点: let和let*的使用
题目: 以下哪种情况下应该使用let*而不是let?
正确答案: B
解析: let用于创建局部变量,但如果一个定义需要引用另一个定义,就应该使用let。let*允许后面的定义引用前面的定义,而let中的所有定义是并行的,不能相互引用。
速记提示: “let*允许相互引用”
选项:
A. 当需要定义多个相互独立的局部变量时✅
B. 当一个定义需要引用另一个定义时✅
C. 当只需要定义一个局部变量时✅
D. 当定义的变量都是全局的时✅
知识点: 闭包的概念
正确答案: C
解析: 闭包是一个函数,它携带了其定义时的环境。即使函数的源代码范围已经词法关闭(最后的右括号已闭合),定义该函数的环境仍然与之一起存在。这就是为什么它被称为”闭包”。
速记提示: “函数+环境=闭包”
题目: 在Common Lisp中,什么是闭包(closure)?
选项:
A. 一种特殊的全局变量✅
B. 一种循环结构✅
C. 一个带有其定义环境的函数✅
D. 一种字符串处理方法✅
知识点: loop..return循环
正确答案: C
解析: 在Common Lisp中,如果loop..return结构中从未调用return,循环将永远执行下去。return用于提供退出循环的条件,如果没有这个条件,循环就会一直进行。
速记提示: “无return,永远loop”
题目: 在Common Lisp中,如果loop..return结构中从未调用return,会发生什么?
选项:
A. 循环会立即终止✅
B. 循环会执行一次后终止✅
C. 循环会无限执行✅
D. 会产生编译错误✅
知识点: dotimes循环
正确答案: C
解析: 在dotimes循环中,循环变量n的取值范围是0到n-1。循环重复n次,每次循环n等于0, 1, 2, …, 直到n-1。
速记提示: “dotimes从0到n-1”
题目: 在Common Lisp的dotimes循环中,循环变量n的取值范围是什么?
选项:
A. 1 到 n✅
B. 0 到 n✅
C. 0 到 n-1✅
D. 1 到 n-1✅
知识点: dolist循环
正确答案: C
解析: 在dolist循环中,每次循环n都会绑定到列表的下一个元素,直到所有元素都被处理完毕。这使得dolist非常适合遍历列表中的所有元素。
速记提示: “dolist绑定下一元素”
题目: 在Common Lisp的dolist循环中,循环变量n是如何变化的?
选项:
A. n每次增加1✅
B. n每次减少1✅
C. n绑定到列表的下一个元素✅
D. n保持不变✅
知识点: do循环
正确答案: C
解析: Common Lisp中的do循环允许同时进行多个循环。每个循环都可以定义为(符号 起始值 如何改变符号)的形式。这使得do循环非常灵活,能够处理复杂的循环逻辑。
速记提示: “do支持多循环并行”
题目: Common Lisp中的do循环有什么特点?
选项:
A. 只能进行单一循环✅
B. 只能处理数字✅
C. 允许同时进行多个循环✅
D. 必须使用关键字loop✅
知识点: 字符串创建
正确答案: B
解析: 在Common Lisp中,字符串是使用双引号创建的。例如,”Hello, World!”就是一个字符串。字符串在Lisp中被视为字符的一维数组。
速记提示: “双引号创建字符串”
题目: 在Common Lisp中,如何创建字符串?
选项:
A. 使用单引号✅
B. 使用双引号✅
C. 使用反引号✅
D. 使用括号✅
知识点: 字符串操作
正确答案: C
解析: 在Common Lisp中,length函数用于获取字符串的长度。这个函数不仅可以用于字符串,还可以用于其他序列类型。使用方法为(length x),其中x是要测量长度的字符串。
速记提示: “length测长度”
题目: 以下哪个函数用于获取字符串的长度?
选项:
A. string-length✅
B. str-len✅
C. length✅
D. size✅
知识点: 字符串比较
正确答案: A
解析: 在Common Lisp中,string=函数用于比较两个字符串是否相等。这是一个区分大小写的比较。使用方法为(string= x y),其中x和y是要比较的字符串。
速记提示: “string=比较字符串”
题目: Common Lisp中用于比较字符串相等性的函数是?
选项:
A. string=✅
B. equal✅
C. eq✅
D. eql✅
知识点: 字符串大小写转换
正确答案: B
解析: 在Common Lisp中,string-upcase函数用于将字符串转换为大写。它返回一个新的大写字符串,而不修改原始字符串。使用方法为(string-upcase x),其中x是要转换的字符串。
速记提示: “string-upcase变大写”
题目: 如何将字符串转换为大写?
选项:
A. string-uppercase✅
B. string-upcase✅
C. upcase-string✅
D. to-upper✅
知识点: 字符串修剪
正确答案: A
解析: 在Common Lisp中,string-trim函数用于去除字符串两端的空白字符。它返回一个新的已修剪的字符串。使用方法为(string-trim ” ” x),其中x是要修剪的字符串,第一个参数指定要修剪的字符(这里是空格)。
速记提示: “string-trim去两端”
题目: 哪个函数用于去除字符串两端的空白字符?
选项:
A. string-trim✅
B. string-strip✅
C. trim-string✅
D. remove-whitespace✅
知识点: 字符串连接
正确答案: C
解析: 在Common Lisp中,concatenate函数用于连接多个字符串。使用方法为(concatenate ‘string x y),其中x和y是要连接的字符串。注意第一个参数’string指定了结果的类型。
速记提示: “concatenate连接字符串”
题目: 在Common Lisp中,如何连接多个字符串?
选项:
A. string-append✅
B. concat✅
C. concatenate✅
D. join✅
知识点: 字符到字符串的转换
正确答案: C
解析: 在Common Lisp中,string函数用于将一个字符转换为字符串。使用方法为(string #\x),其中#\x表示要转换的字符。这个函数会返回一个包含该字符的新字符串。
速记提示: “string函数字符变字符串”
题目: 如何将一个字符转换为字符串?
选项:
A. char-to-string✅
B. make-string✅
C. string✅
D. to-string✅
知识点: 字符串解析为数字
正确答案: B
解析: 在Common Lisp中,parse-integer函数用于将表示整数的字符串转换为数字。使用方法为(parse-integer “123”),它会返回对应的整数值。这个函数只能处理整数,不能处理浮点数。
速记提示: “parse-integer字符串变整数”
题目: 哪个函数用于将表示整数的字符串转换为数字?
选项:
A. string-to-number✅
B. parse-integer✅
C. read-number✅
D. to-integer✅
知识点: 数据到字符串的转换
正确答案: C
解析: 在Common Lisp中,write-to-string函数用于将任意Lisp对象转换为其打印表示的字符串。使用方法为(write-to-string x),其中x是要转换的对象。这个函数会返回一个新的字符串,表示该对象的打印形式。
速记提示: “write-to-string对象变字符串”
题目: 如何将任意Lisp对象转换为其打印表示的字符串?
选项:
A. object-to-string✅
B. print-to-string✅
C. write-to-string✅
D. stringify✅
知识点: 字符表示
正确答案: C
解析: 在Common Lisp中,字符使用#\加上字符本身来表示。例如,#\z表示字符’z’。这种表示方法允许明确地指定单个字符,而不是字符串或符号。
速记提示: “#\表示单个字符”
题目: 在Common Lisp中,如何表示一个字符?
选项:
A. ‘c✅
B. “c”✅
C. #\c✅
D. \c✅
知识点: 字符操作
正确答案: B
解析: 在Common Lisp中,char函数用于获取字符串中特定位置的字符。使用方法为(char my-string x),其中my-string是字符串,x是要获取的字符的索引(从0开始)。这个函数返回指定位置的字符。
速记提示: “char获取特定字符”
题目: 哪个函数用于获取字符串中特定位置的字符?
选项:
A. string-char✅
B. char✅
C. get-char✅
D. elt✅
知识点: 字符比较
正确答案: B
解析: 在Common Lisp中,char=函数用于比较两个字符是否相等。这是一个区分大小写的比较。使用方法为(char= x y),其中x和y是要比较的字符。如果两个字符相等,函数返回true。
速记提示: “char=比较字符相等”
题目: 用于比较两个字符是否相等的函数是?
选项:
A. char-equal✅
B. char=✅
C. equal-char✅
D. eq✅
知识点: 字符常量
正确答案: D
解析: Common Lisp预定义了一些特殊的字符常量,包括#\space(空格)、#\newline(换行)、#\tab(制表符)等。但#\comma(逗号)不是预定义的字符常量。其他常用的字符常量还包括#\return(回车)、#\backspace(退格)等。
速记提示: “常用特殊字符有预定义常量”
- 作用域和闭包:理解全局作用域和词法作用域的区别,以及闭包的概念和应用。
- 循环结构:介绍了loop..return、dotimes、dolist和do等不同类型的循环,每种循环都有其特定的用途和语法。
- 字符串操作:包括字符串的创建、比较、修改、连接等基本操作,以及字符串与其他数据类型之间的转换。
- 字符处理:讲解了字符的表示方法,以及相关的操作函数。
题目: 以下哪个不是Common Lisp中预定义的字符常量?
选项:
A. #\space✅
B. #\newline✅
C. #\tab✅
D. #\comma✅
总结
本学习材料涵盖了Common Lisp中关于闭包、循环和字符串处理的重要概念。主要内容包括:
掌握这些概念对于使用Common Lisp进行编程至关重要。建议读者多加练习,特别是在实际编程中运用这些概念,以加深理解。