ООП языки используют наследование для имитации полиморфизма, то есть для создания класса объектов, которые могут отвечать на опубликованный список сообщений. Вы можете иметь полиморфизм в Scheme без явного наследования, потому что это язык с динамической типизацией. Сравните реализацию класса «Animal» в Java и соответствующую реализацию в Scheme:
// Animal interface and implementations in Java
interface Animal {
void cry (); // The only message to which an Animal object will respond.
}
class Cat implements Animal {
void cry () {
System.out.println ("meow!");
}
}
class Cow implements Animal {
void cry () {
System.out.println ("baee!");
}
}
// Usage
Animal a = new Cat ();
Animal b = new Cow ();
a.cry (); => "meow!"
b.cry (); => "baee!"
Теперь соответствующая реализация в Scheme использует замыкания:
;; A factory of Animals.
(define (animal type)
(case type
((cat) (cat))
((cow) (cow))))
;; Corresponds to class Cat in Java.
(define (cat)
(lambda (msg)
(case msg
((cry) "meow!"))))
;; Corresponds to class Cow in Java.
(define (cow)
(lambda (msg)
(case msg
((cry) "baee!"))))
;; Sample usage
(define a (animal 'cat))
(define b (animal 'cow))
(a 'cry) => "meow!"
(b 'cry) => "baee!"
На самом деле нам нужны закрытия, только если нам приходится иметь дело со слишком большим количеством частного государства. Схема предоставляет множество способов симулировать простые «иерархии классов», как указано выше. Вот один метод, с помощью которого мы развиваем крошечное средство «отправки сообщений», которое мы можем использовать в списке объектов:
;; Generic message dispatch.
(define (send type message objects)
((cdr (assq message (cdr (assq type objects))))))
;; A list of animals.
(define animals (list (cons 'cat (list (cons 'cry (lambda () "meow!"))))
(cons 'cow (list (cons 'cry (lambda () "blaee!"))))))
;; Send a specific message to a specific animal:
(send 'cat 'cry animals) => "meow!"
(send 'cow 'cry animals) => "blaee!"
Механизмы функциональной абстракции, предоставляемые Scheme, достаточно мощны, чтобы мы не беспокоились о полной объектной системе. Тем не менее, существуют некоторые объектные системы для Схемы. Взгляните на Tiny-CLOS (на основе CLOS ). В книге Лисп в маленьких кусочках обсуждается реализация системы объектов для схемы (на основе Meroon ).