C.I.CLを眺める(2) PROPER-LIST-P — #:g1

Posted 2010-12-19 11:02:00 GMT

今回は、C.I.CLのlist.lispからPROPER-LIST-Pです。
名前からして真正リストかどうかを判定するもののようですが、定義は、

(defun proper-list-p (object)
  "
RETURN: whether object is a proper list
NOTE:   terminates with any kind of list, dotted, circular, etc.
"
  (labels ((proper (current slow)
             (cond ((null current)       t)
                   ((atom current)       nil)
                   ((null (cdr current)) t)
                   ((atom (cdr current)) nil)
                   ((eq current slow)    nil)
                   (t                    (proper (cddr current) (cdr slow))))))
    (and (listp object) (proper object (cons nil object)))))
となっています。
SRFI-1で言えば、proper-list?ですが、循環リストを検出するために、properというローカル関数を定義して使っているようです。
動作は、
(import 'com.informatimago.common-lisp.list:proper-list-p)

(proper-list-p ()) ;=> T

(proper-list-p 'a) ;=> NIL

(proper-list-p '(a)) ;=> T

(proper-list-p '(a . b)) ;=> NIL

(proper-list-p '#0=(even odd . #0#)) ;=> NIL

というところ。

comments powered by Disqus