Ex2.1 Condを使い、かつ、Rewritesを2度呼ばない方法

未定義の関数は、本家サイトのソース公開ページから探せるはず。

章の中でcondを使って定義したgenerateがある。

(defun generate (phrase)
  "Generate a random sentence or phrase"
  (cond ((listp phrase)
	 (mappend #'generate phrase))
	((rewrites phrase)
	 (generate (random-elt (rewrites phrase))))
	(t (list phrase))))

このgenerateではrewritesを2回呼び出しているのでこれを直そうという問題。
gaucheにはcondに=>構文があるので簡単に書けそうだが、Common Lispではどうしたものでしょうか。
今回は&auxでズルしてみた。

;;; Exercise 2.1 [m] Write a version of generate that uses cond but avoids calling
;;; rewrites twice.
(defun generate (phrase &aux next-phrase)
  "Generate a random sentence or phrase"
  (cond ((listp phrase)
	 (mappend #'generate phrase))
	((setf next-phrase (rewrites phrase))
	 (generate (random-elt next-phrase)))
	(t (list phrase))))

(generate 'sentence)
;; => (A TABLE SOW THE WOMAN)