Chapter 4 习题 (Exercises)

  1. 定义一个函数,接受一个平方数组(square array,一个相同维度的数组 (n n) ),并将它顺时针转 90 度。
  1. > (quarter-turn #2A((a b) (c d)))
  2. #2A((C A) (D B))

你会需要用到 361 页的 array-dimensions

  1. 阅读 368 页的 reduce 说明,然后用它来定义:
  1. (a) copy-list
  2. (b) reverse(针对列表)
  1. 定义一个结构来表示一棵树,其中每个节点包含某些数据及三个小孩。定义:
  1. (a) 一个函数来复制这样的树(复制完的节点与本来的节点是不相等( `eql` )的)
  2. (b) 一个函数,接受一个对象与这样的树,如果对象与树中各节点的其中一个字段相等时,返回真。
  1. 定义一个函数,接受一棵二叉搜索树,并返回由此树元素所组成的,一个由大至小排序的列表。
  2. 定义 bst-adjoin 。这个函数应与 bst-insert 接受相同的参数,但应该只在对象不等于任何树中对象时将其插入。

勘误: bst-adjoin 的功能与 bst-insert 一模一样。

  1. 任何哈希表的内容可以由关联列表(assoc-list)来描述,其中列表的元素是 (k . v) 的形式,对应到哈希表中的每一个键值对。定义一个函数:
  1. (a) 接受一个关联列表,并返回一个对应的哈希表。
  2. (b) 接受一个哈希表,并返回一个对应的关联列表。

脚注

[1]一个简单数组大小是不可调整、元素也不可替换的,并不含有填充指针(fill-pointer)。数组缺省是简单的。简单向量是个一维的简单数组,可以含有任何类型的元素。
[2]在 ANSI Common Lisp 里,你可以给一个 :print-object 的关键字参数来取代,它只需要两个实参。也有一個宏叫做 print-unreadable-object ,能用则用,可以用 #<…> 的语法来显示对象。