Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-12-19

C.I.CLを眺める(2) PROPER-LIST-P

| 20:02 | C.I.CLを眺める(2) PROPER-LIST-P - わだばLisperになる を含むブックマーク はてなブックマーク - C.I.CLを眺める(2) PROPER-LIST-P - わだばLisperになる

今回は、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

というところ。