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-09-04

KMRCLを眺める(199) GENERALIZED-EQUAL-ARRAY

| 22:47 | KMRCLを眺める(199) GENERALIZED-EQUAL-ARRAY - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(199) GENERALIZED-EQUAL-ARRAY - わだばLisperになる

今回は、KMRCLのequal.lispからGENERALIZED-EQUAL-ARRAYです。

名前からしてArrayの同値性を判定するものと思われます。

定義は、

(defun generalized-equal-array (obj1 obj2)
  (block test
    (when (not (= (array-total-size obj1) (array-total-size obj2)))
      (return-from test nil))
    (dotimes (i (array-total-size obj1))
      (unless (generalized-equal (aref obj1 i) (aref obj2 i))
        (return-from test nil)))
    (return-from test t)))

というところ。

まず、ARRAY-TOTAL-SIZE を知らべて大きさが違うならば脱出(ちなみに、(NOT (= ...))は(/= ...)と書けますよね)。

次にArrayの要素一つ一つに対してGENERALIZED-EQUALで判定(つまり再帰的に)という風になっています。

その、GENERALIZED-EQUALは、equal.lispで定義されている親玉というか、GENERALIZED-EQUAL-ARRAYのような物を合体したもっとも汎用的なものです。

動作的には、EQUALPとどういう風に違うのか、equal.lispを眺め終える時に確認したいと思います。

動作は、

(KL::GENERALIZED-EQUAL-ARRAY `#(() ,#'CAR ,(LAMBDA (X) 8)) 
                             `#(() ,#'CAR ,(LAMBDA (X) 8)))
;⇒ T ;Allegro CL/CLISP
;⇒ NIL ;SBCL/Clozure CL

;; 比較 EQUALP
(EQUALP `#(() ,#'CAR ,(LAMBDA (X) 8)) 
        `#(() ,#'CAR ,(LAMBDA (X) 8)))
;⇒ NIL