Chapter 2 习题 (Exercises)

  1. 描述下列表达式求值之后的结果:
  1. (a) (+ (- 5 1) (+ 3 7))
  2. (b) (list 1 (+ 2 3))
  3. (c) (if (listp 1) (+ 1 2) (+ 3 4))
  4. (d) (list (and (listp 3) t) (+ 1 2))
  1. 给出 3 种不同表示 (a b c)cons 表达式
  2. 使用 carcdr 来定义一个函数,返回一个列表的第四个元素。
  3. 定义一个函数,接受两个实参,返回两者当中较大的那个。
  4. 这些函数做了什么?
  1. (a) (defun enigma (x)
  2. (and (not (null x))
  3. (or (null (car x))
  4. (enigma (cdr x)))))
  5. (b) (defun mystery (x y)
  6. (if (null y)
  7. nil
  8. (if (eql (car y) x)
  9. 0
  10. (let ((z (mystery x (cdr y))))
  11. (and z (+ z 1))))))
  1. 下列表达式, x 该是什么,才会得到相同的结果?
  1. (a) > (car (x (cdr '(a (b c) d))))
  2. B
  3. (b) > (x 13 (/ 1 0))
  4. 13
  5. (c) > (x #'list 1 nil)
  6. (1)
  1. 只使用本章所介绍的操作符,定义一个函数,它接受一个列表作为实参,如果有一个元素是列表时,就返回真。
  2. 给出函数的迭代与递归版本:

  3. 接受一个正整数,并打印出数字数量的点。

  4. 接受一个列表,并返回 a 在列表里所出现的次数。

  5. 一位朋友想写一个函数,返回列表里所有非 nil 元素的和。他写了此函数的两个版本,但两个都不能工作。请解释每一个的错误在哪里,并给出正确的版本。

  1. (a) (defun summit (lst)
  2. (remove nil lst)
  3. (apply #'+ lst))
  4. (b) (defun summit (lst)
  5. (let ((x (car lst)))
  6. (if (null x)
  7. (summit (cdr lst))
  8. (+ x (summit (cdr lst))))))

脚注

[1]在 vi,你可以用 :set sm 来启用括号匹配。在 Emacs,M-x lisp-mode 是一个启用的好方法。
[2]真正的区别是词法变量(lexical)与特殊变量(special variable),但到第六章才会讨论这个主题。