Yet Another Common Lisp Problems #2 doublep

●問題2

リストの要素が二つあるか調べる述語 doublep を定義してください。

> (doublep '(a b))
t
> (doublep '(a b c))
nil
> (doublep '(a))
nil

解答

ホームページ移転のお知らせ - Yahoo!ジオシティーズ

doublep って double-float-p と間違えそうだ。

とりあえずなにも考えずに書いたら

(defun doublep (list)
  (and (consp list) (cdr list) (null (cddr list))))
(doublep '(1 . 2))
; Evaluation aborted on `type-error'
;   不正なデータ型です: 2: cons

例によって dotted-list に対応してなかったので修正。

(defun doublep (list)
  (and (consp list) (consp (cdr list)) (null (cddr list))))

実際必要になったら (= (length list) 2) って書く予感。というか list の長さによって分岐するなら

(case (length list)
  (1 ...)
  (2 ...)
  (t ...))

と書くし、長さ以外にも何か調べるならまとめて別関数にしておいて

(cond ((hoge-fuga-list-p list) ...)
      ((foo-bar-baz-list-p list) ...)
      (t ...))

とかしそう。

解答見て「リサイクル!ECO!」と思ったり。