Chapter 2 习题 (Exercises)
- 描述下列表达式求值之后的结果:
(a) (+ (- 5 1) (+ 3 7))
(b) (list 1 (+ 2 3))
(c) (if (listp 1) (+ 1 2) (+ 3 4))
(d) (list (and (listp 3) t) (+ 1 2))
- 给出 3 种不同表示
(a b c)
的cons 表达式
。 - 使用
car
与cdr
来定义一个函数,返回一个列表的第四个元素。 - 定义一个函数,接受两个实参,返回两者当中较大的那个。
- 这些函数做了什么?
(a) (defun enigma (x)
(and (not (null x))
(or (null (car x))
(enigma (cdr x)))))
(b) (defun mystery (x y)
(if (null y)
nil
(if (eql (car y) x)
0
(let ((z (mystery x (cdr y))))
(and z (+ z 1))))))
- 下列表达式,
x
该是什么,才会得到相同的结果?
(a) > (car (x (cdr '(a (b c) d))))
B
(b) > (x 13 (/ 1 0))
13
(c) > (x #'list 1 nil)
(1)
- 只使用本章所介绍的操作符,定义一个函数,它接受一个列表作为实参,如果有一个元素是列表时,就返回真。
给出函数的迭代与递归版本:
接受一个正整数,并打印出数字数量的点。
接受一个列表,并返回
a
在列表里所出现的次数。一位朋友想写一个函数,返回列表里所有非
nil
元素的和。他写了此函数的两个版本,但两个都不能工作。请解释每一个的错误在哪里,并给出正确的版本。
(a) (defun summit (lst)
(remove nil lst)
(apply #'+ lst))
(b) (defun summit (lst)
(let ((x (car lst)))
(if (null x)
(summit (cdr lst))
(+ x (summit (cdr lst))))))
脚注
[1] | 在 vi,你可以用 :set sm 来启用括号匹配。在 Emacs,M-x lisp-mode 是一个启用的好方法。 |
[2] | 真正的区别是词法变量(lexical)与特殊变量(special variable),但到第六章才会讨论这个主题。 |
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .