graph TD;
A[Common Lisp Document Repository] –> B[基础文档];
A –> C[高级主题];
A –> D[库与工具];
B –> E[语言特性];
B –> F[编程示例];
C –> G[性能优化];
C –> H[并发编程];
D –> I[常用库];
D –> J[开发工具];
(defun where (&key title artist rating (ripped nil ripped-p))
#'(lambda (cd)
(and
(if title (equal (getf cd :title) title) t)
(if artist (equal (getf cd :artist) artist) t)
(if rating (equal (getf cd :rating) rating) t)
(if ripped-p (equal (getf cd :ripped) ripped) t))))
选项: A. (setq ✅var value) B. (let ((var value)))✅ C. (defvar var value)✅ D. (defparameter ✅var value)
正确答案: D
解析: 在Common Lisp中,使用defparameter来定义全局(动态)变量。它的语法是(defparameter var value),其中变量名通常用星号(*)包围,这是一个命名约定。选项A是设置已存在变量的值;选项B是创建局部变量;选项C虽然也可以定义全局变量,但通常用于未初始化的变量。
选项: 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))✅
正确答案: B
解析: 在Common Lisp中,使用defstruct来定义结构体。正确的语法是(defstruct dog name breed age)。这将创建一个名为dog的结构体,具有name、breed和age三个字段。选项A的struct不是Common Lisp的关键字;选项C是创建结构体实例的语法,不是定义结构体;选项D的define-structure不是标准的Common Lisp函数。
速记提示: “DEFinition of STRUCTure”——defstruct就是用来定义结构体的。
选项: A. fopen✅ B. open-file✅ C. open✅ D. with-open-file✅
正确答案: C
解析: 在Common Lisp中,open函数用于打开文件。它的基本语法是(open filename &key direction element-type if-exists if-does-not-exist)。这会返回一个流对象,你可以用它来读取或写入文件。fopen是C语言的函数;open-file不是标准函数;with-open-file是一个宏,用于自动处理文件的打开和关闭,但它内部使用的是open。
速记提示: “OPEN”直接表明了这个函数的功能——打开文件。
知识点: 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))✅
正确答案: B
解析: 在CLOS中,使用defclass宏来定义类。正确的语法是(defclass name (superclasses) (slots))。name是类名,superclasses是父类列表(可以为空),slots是槽(属性)定义列表。每个槽可以有various选项,如:initform,:accessor等。选项A. C和D都不是CLOS的标准语法。✅
速记提示: “DEFine CLASS”——defclass就是用来定义类的。
知识点: Common Lisp的读取宏
题目: 在Common Lisp中,哪个函数用于定义新的读取宏?
选项: A. def-read-macro✅ B. set-macro-character✅ C. define-reader-macro✅ D. make-dispatch-macro-character✅
正确答案: B
解析: 在Common Lisp中,set-macro-character函数用于定义新的读取宏。它的基本语法是(set-macro-character char function &optional non-terminating-p)。这会将字符char与函数function关联,使得读取器遇到char时调用function。non-terminating-p参数指定这个宏字符是否是非终止的。选项A和C不是标准函数;选项D用于创建调度宏字符,这是一种更复杂的读取宏。
速记提示: “SET”一个”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))✅
(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 是一种变量类型,用于声明一个变量是特殊变量。特殊变量与普通的局部变量不同,主要体现在以下几个方面:
知识点: 宏与CLOS(Common Lisp Object System) 题目: 在Common Lisp中,宏如何与CLOS(Common Lisp Object System)交互? 选项: A. 宏不能用于CLOS✅ B. 宏可以用来生成CLOS代码✅ C. CLOS完全取代了宏的功能✅ D. 宏只能用于修改CLOS类定义✅
知识点: defstruct生成的函数 题目: 以下哪个不是defstruct自动生成的函数? 选项: A. 构造函数(make-struct-name)✅ B. 复制函数(copy-struct-name)✅ C. 访问器(struct-name-element)✅ D. 删除函数(delete-struct-name)✅
知识点: Common Lisp对象系统(CLOS) 题目: CLOS代表什么? 选项: A. Common Lisp Object Syntax✅ B. Common Lisp Object System✅ C. Common Lisp Oriented Structure✅ D. Common Lisp Object Standard✅
;; 定义两个类
(defclass animal () ())
(defclass dog (animal) ())
;; 定义一个通用函数 `interact`
(defgeneric interact (x y))
;; 根据参数的类型定义不同的实现
(defmethod interact ((x animal) (y animal))
(format t "Animal interacts with another animal.~%"))
(defmethod interact ((x dog) (y animal))
(format t "Dog interacts with an animal.~%"))
(defmethod interact ((x dog) (y dog))
(format t "Dog interacts with another dog.~%"))
;; 调用不同的情况
(let ((rex (make-instance 'dog))
(generic-animal (make-instance 'animal)))
(interact rex generic-animal) ;; 输出: Dog interacts with an animal.
(interact rex rex)) ;; 输出: Dog interacts with another dog.
知识点: find-if-not函数的特性 题目: find-if-not函数与find-if函数的关系是什么? 选项: A. 它们是完全相同的函数✅ B. find-if-not返回不满足条件的第一个元素✅ C. find-if-not只用于数值比较✅ D. find-if-not总是返回最后一个元素✅
知识点: 哈希表的创建 题目: 在Common Lisp中,如何创建一个哈希表,其中键可以是字符串? 选项: A. (make-hash-table)✅ B. (make-hash-table :test #’eql)✅ C. (make-hash-table :test #’equal)✅ D. (create-hash-table)✅
速记提示: “list of alternating keys and values” – 记住p-list是键值交替的普通列表。
知识点: 属性列表的查找 题目: 在Common Lisp中,如何在属性列表plist中查找键k2的值? 选项: A. (assoc ‘k2 ✅plist) B. (getf ✅plist ‘k2) C. (gethash ‘k2 ✅plist) D. (get ‘k2 ✅plist)
正确答案: B
解析: 在属性列表中查找键的值使用getf函数。它直接返回与键对应的值。
速记提示: “getf for plist” – 记住getf用于在属性列表中获取值。
知识点: 哈希表的遍历 题目: 在Common Lisp中,如何使用loop宏遍历哈希表hash的所有键? 选项: A. (loop for key in ✅hash collect key) B. (loop for key being the hash-keys of ✅hash collect key) C. (loop for (key value) in ✅hash collect key) D. (loop for key across ✅hash collect key)
正确答案: B
解析: 使用loop宏遍历哈希表的键,需要使用”being the hash-keys of”语法。这允许直接访问哈希表的所有键。
速记提示: “being the hash-keys” – 记住这个特殊的loop语法用于遍历哈希表的键。
知识点: 数组的创建 题目: 在Common Lisp中,如何创建一个3x3x3的三维数组,初始值都为1? 选项: A. (make-array ‘(3 3 3) :initial-element 1)✅ B. (create-3d-array 3 3 3 :fill 1)✅ C. (vector 1 1 1 1 1 1 1 1 1)✅ D. (array 3 3 3 1)✅
知识点: 向量的遍历 题目: 在Common Lisp中,如何使用loop宏遍历向量#(1 2 3)的所有元素? 选项: A. (loop for n in #(1 2 3) do (print n))✅ B. (loop for n of #(1 2 3) do (print n))✅ C. (loop for n across #(1 2 3) do (print n))✅ D. (loop for n being the elements of #(1 2 3) do (print n))✅
正确答案: C
解析: 使用loop宏遍历向量时,需要使用across关键字。这允许直接访问向量的所有元素。
速记提示: “across for vector loop” – 记住across用于在loop中遍历向量。
知识点: 关联列表的修改 题目: 在Common Lisp中,如何修改关联列表alist中键为3的值为5? 选项: A. (setf (assoc 3 ✅alist) 5) B. (setf (cdr (assoc 3 ✅alist)) 5) C. (setf (getf ✅alist 3) 5) D. (modify-alist ✅alist 3 5)
知识点: 循环遍历哈希表的键值对 题目: 在Common Lisp中,如何使用loop宏同时遍历哈希表hash的键和值? 选项: A. (loop for (k . v) in ✅hash do (format t “~A. ~A~%” k v))✅ B. (loop for k being the hash-keys of ✅hash using (hash-value v) do (format t “~A. ~A~%” k v))✅ C. (loop for (k v) across ✅hash do (format t “~A. ~A~%” k v))✅ D. (loop for k v in ✅hash do (format t “~A. ~A~%” k v))✅
正确答案: B
解析: 使用loop宏同时遍历哈希表的键和值,需要使用”being the hash-keys of”语法和”using (hash-value v)”子句。这允许同时访问每个键值对。
速记提示: “hash-keys using hash-value” – 记住这个特殊的loop语法用于同时遍历哈希表的键和值。