3.14 关联列表 (Assoc-lists)

Cons 对象来表示映射 (mapping)也是很自然的。一个由 Cons 对象组成的列表称之为关联列表(assoc-listor alist)。这样的列表可以表示一个翻译的集合,举例来说:

  1. > (setf trans '((+ . "add") (- . "subtract")))
  2. ((+ . "add") (- . "subtract"))

关联列表很慢,但是在初期的程序中很方便。 Common Lisp 有一个内置的函数 assoc ,用来取出在关联列表中,与给定的键值有关联的 Cons 对:

  1. > (assoc '+ trans)
  2. (+ . "add")
  3. > (assoc '* trans)
  4. NIL

如果 assoc 没有找到要找的东西时,返回 nil

我们可以定义一个受限版本的 assoc

  1. (defun our-assoc (key alist)
  2. (and (consp alist)
  3. (let ((pair (car alist)))
  4. (if (eql key (car pair))
  5. pair
  6. (our-assoc key (cdr alist))))))

member 一样,实际上的 assoc 接受关键字参数,包括 :test:key 。 Common Lisp 也定义了一个 assoc-if 之于 assoc ,如同 member-if 之于 member 一样。