面向记忆的学习材料
快速学习并记住Common Lisp编程语言的基础知识
知识点: Common Lisp的基本语法单元
题目: Common Lisp的两个基本语法单元是什么?
选项:
A. 函数和变量✅
B. 类和对象✅
C. 原子和S-表达式✅
D. 字符串和数字✅
知识点: Common Lisp的注释语法
题目: 在Common Lisp中,如何编写一个段落注释?
选项:
A. 使用单个分号(;)✅
B. 使用两个分号(;;)✅
C. 使用三个分号(;;;)✅
D. 使用四个分号(;;;;)✅
知识点: Common Lisp的基本数据类型
题目: 在Common Lisp中,表示复数的语法是什么?
选项:
A. (complex 1 2)✅
B. #C(1 2)✅
C. 1+2i✅
D. (1, 2)✅
知识点: Common Lisp的变量定义
题目: 在Common Lisp中,如何定义一个全局(动态)变量?
选项:
A. (setq ✅var value)
B. (let ((var value)))✅
C. (defvar var value)✅
D. (defparameter ✅var value)
知识点: Common Lisp的结构体定义
题目: 在Common Lisp中,如何定义一个名为”dog”的结构体,包含name、breed和age三个字段?
选项:
A. (struct dog (name breed age))✅
B. (defstruct dog name breed age)✅
C. (make-struct ‘dog :name :breed :age)✅
D. (define-structure dog (name breed age))✅
知识点: Common Lisp的列表操作
题目: 在Common Lisp中,哪个函数用于将一个元素添加到列表的开头?
选项:
A. append✅
B. push✅
C. cons✅
D. add-to-list✅
知识点: Common Lisp的函数定义
题目: 在Common Lisp中,如何定义一个名为”hello”的函数,接受一个名字参数并返回问候语?
选项:
A. (lambda (name) (format nil “Hello, ~a” name))✅
B. (defun hello (name) (format nil “Hello, ~a” name))✅
C. (define-function hello (name) (format nil “Hello, ~a” name))✅
D. (function hello (name) (format nil “Hello, ~a” name))✅
知识点: Common Lisp的可选参数
题目: 在Common Lisp中,如何在函数定义中指定一个可选参数?
选项:
A. (defun func (required [optional]))✅
B. (defun func (required optional?))✅
C. (defun func (required &optional optional))✅
D. (defun func (required (optional nil)))✅
知识点: Common Lisp的相等性判断
题目: 在Common Lisp中,哪个函数用于比较两个数值是否相等?
选项:
A. eq✅
B. eql✅
C. equal✅
D. =✅
知识点: Common Lisp的条件语句
题目: 在Common Lisp中,最基本的条件语句是什么?
选项:
A. when✅
B. cond✅
C. if✅
D. case✅
知识点: Common Lisp的符号操作
题目: 在Common Lisp中,哪个函数用于从字符串创建符号?
选项:
A. make-symbol✅
B. intern✅
C. symbol-name✅
D. gensym✅
知识点: Common Lisp的包系统
题目: 在Common Lisp中,如何切换到名为”MY-PACKAGE”的包?
选项:
A. (use-package ‘my-package)✅
B. (in-package :my-package)✅
C. (switch-to-package ‘my-package)✅
D. (select-package “MY-PACKAGE”)✅
知识点: Common Lisp的宏定义
题目: 在Common Lisp中,如何定义一个简单的宏?
选项:
A. (defmacro name (args) body)✅
B. (defun macro name (args) body)✅
C. (macro-define name (args) body)✅
D. (define-macro (name args) body)✅
知识点: Common Lisp的类型声明
题目: 在Common Lisp中,如何声明一个变量的类型为整数?
选项:
A. (declare (integer x))✅
B. (the integer x)✅
C. (type-of x ‘integer)✅
D. (setf x (make-instance ‘integer))✅
知识点: Common Lisp的错误处理
题目: 在Common Lisp中,哪个宏用于捕获和处理错误?
选项:
A. catch✅
B. throw✅
C. handler-case✅
D. with-errors✅
知识点: Common Lisp的输入输出
题目: 在Common Lisp中,哪个函数用于格式化输出字符串?
选项:
A. printf✅
B. format✅
C. print-formatted✅
D. write-string✅
知识点: Common Lisp的循环
题目: 在Common Lisp中,哪个是最通用和强大的循环构造?
选项:
A. do✅
B. loop✅
C. for✅
D. while✅
知识点: Common Lisp的文件操作
题目: 在Common Lisp中,哪个函数用于打开文件?
选项:
A. fopen✅
B. open-file✅
C. open✅
D. with-open-file✅
知识点: Common Lisp的CLOS (Common Lisp Object System)
题目: 在CLOS中,如何定义一个简单的类?
选项:
A. (define-class name (superclasses) slots)✅
B. (defclass name (superclasses) (slots))✅
C. (make-class ‘name :superclasses superclasses :slots slots)✅
D. (class-def name (superclasses) (slots))✅
知识点: Common Lisp的读取宏
题目: 在Common Lisp中,哪个函数用于定义新的读取宏?
选项:
A. def-read-macro✅
B. set-macro-character✅
C. define-reader-macro✅
D. make-dispatch-macro-character✅
知识点: Common Lisp的多值返回
题目: 在Common Lisp中,如何定义一个返回多个值的函数?
选项:
A. (defun func () (return-values 1 2 3))✅
B. (defun func () (multiple-value-return 1 2 3))✅
C. (defun func () (values 1 2 3))✅
D. (defun func () (list 1 2 3))✅
总结
Common Lisp是一种强大而灵活的编程语言,具有以下特点:
- 语法简洁:基于S表达式,使用前缀表示法。
- 动态类型:变量可以持有任何类型的值。
- 交互式开发:支持REPL(读取-求值-打印循环)。
- 强大的宏系统:允许开发者扩展语言。
- 面向对象编程:通过CLOS(Common Lisp Object System)支持。
- 函数式编程:支持高阶函数和闭包。
- 条件系统:提供强大的错误处理机制。
- 多值返回:函数可以返回多个值。
- 包系统:提供命名空间管理。
- 丰富的数据类型:包括列表、向量、哈希表等。
掌握这些基础知识点将帮助你开始Common Lisp编程之旅。记住,实践是学习编程语言的最佳方式,所以要多写代码,多使用REPL进行实验。
(defstruct dog name breed age)
在 Common Lisp 中会创建一个名为 dog
的结构体,包含 name
、breed
和 age
三个槽(slot,也常被称为字段)。
然而,为了更全面地理解,需要补充一些细节:
defstruct
的功能:defstruct
宏不仅仅是创建结构体,它还会自动生成一系列访问器函数(accessor functions),用于读取和设置结构体的槽。 对于上面的例子,defstruct
会自动创建以下函数:make-dog
:用于创建新的dog
结构体实例。dog-name
:用于获取dog
结构体的name
槽的值。(setf (dog-name dog-instance) new-name)
:用于设置dog
结构体的name
槽的值。dog-breed
和dog-age
:类似地,用于访问和设置breed
和age
槽。dog-p
:用于检查一个对象是否为dog
结构体实例。
- 可选参数:
defstruct
接受许多可选参数,允许你自定义结构体的行为,例如::conc-name
:指定访问器函数的前缀。 例如(:conc-name "my-dog-")
会生成my-dog-name
、my-dog-breed
等函数。:predicate
:指定用于检查对象类型的谓词函数的名称。:type
:指定结构体的类型。:print-function
:指定用于打印结构体的函数。
- 例子:
(defstruct dog name breed age)
(let ((my-dog (make-dog :name "Buddy" :breed "Golden Retriever" :age 3)))
(format t "My dog's name is ~a.~%" (dog-name my-dog))
(format t "My dog is a ~a.~%" (dog-breed my-dog))
(format t "My dog is ~a years old.~%" (dog-age my-dog)))
;; 输出:
;; My dog's name is Buddy.
;; My dog is a Golden Retriever.
;; My dog is 3 years old.
defstruct
提供了更丰富的功能,允许更灵活地定义和操作结构体。 理解这些可选参数对于编写高效和可维护的 Common Lisp 代码至关重要。
在 Common Lisp 中,special
是一种变量类型,用于声明一个变量是特殊变量。特殊变量与普通的局部变量不同,主要体现在以下几个方面:
特殊变量的特点
- 动态作用域:
- 特殊变量在它被定义的上下文中具有动态作用域。这意味着,如果在某个函数或代码块中修改了这个变量的值,所有调用这个函数或代码块的地方都能看到这个修改后的值。
- 使用
declare
声明:
- 使用
(declare (special x))
可以将变量x
声明为特殊变量。这样,Lisp 会知道x
是一个特殊变量,而不是局部变量。
- 与局部变量比较:
- 普通局部变量在其定义的代码块外是不可见的,而特殊变量在整个动态范围内都是可见的。
示例
以下是使用特殊变量的示例:
(defvar *my-special* 10) ; 定义一个特殊变量,通常用星号包围命名
(defun modify-special ()
(declare (special *my-special*)) ; 声明 *my-special* 为特殊变量
(setf *my-special* (+ *my-special* 5))) ; 修改特殊变量的值
(modify-special) ; 调用函数,修改 *my-special*
(print *my-special*) ; 输出 15
总结
- 特殊变量在整个动态范围内可见,适用于需要在不同函数之间共享状态的情况。
- 使用特殊变量时,要小心其作用域,以避免不必要的副作用。