选项: 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 是一种变量类型,用于声明一个变量是特殊变量。特殊变量与普通的局部变量不同,主要体现在以下几个方面:
面向记忆的学习材料
快速学习并记住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是一种强大而灵活的编程语言,具有以下特点:
掌握这些基础知识点将帮助你开始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
提供了更丰富的功能,允许更灵活地定义和操作结构体。 理解这些可选参数对于编写高效和可维护的 Common Lisp 代码至关重要。在 Common Lisp 中,
special
是一种变量类型,用于声明一个变量是特殊变量。特殊变量与普通的局部变量不同,主要体现在以下几个方面:特殊变量的特点
declare
声明:(declare (special x))
可以将变量x
声明为特殊变量。这样,Lisp 会知道x
是一个特殊变量,而不是局部变量。示例
以下是使用特殊变量的示例:
总结