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)