is-a?

Die Funktion is-a? überprüft, ob eine Instanz eine direkte oder indirekte Instanz einer Klasse ist. Die Funktion wertet ihre beiden Argumente aus.

Das Resultat ist genau dann ungleich nil, wenn es sich beim ersten Argument um eine Instanz handelt, die eine direkte Instanz der angegebenen Klasse ist (siehe instance-of?) oder wenn die Klasse der Instanz (siehe class-of) eine Subklasse der angegebenen Klasse ist.

Die Funktion ist wie folgt definiert:

(setq is-a?
  (letrec
    ((is-subclass?
      (lambda (sub super)
        (let
          ((classes (direct-superclasses sub)))
          (or
            (member? super classes)
            (some?
              (lambda (class) (is-subclass? class super))
              classes))))))
    (lambda (instance class)
      (and
        (equal? (type-of instance) (quote instance))
        (let
          ((instance-class (class-of instance)))
          (or
            (equal? instance-class class)
            (is-subclass? instance-class class)))))))