KMRCLを眺める(199) GENERALIZED-EQUAL-ARRAY — #:g1

Posted 2010-09-04 13:47:00 GMT

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


comments powered by Disqus