Мы могли бы использовать равно?
(equal? '(a (b (c))) '(a (b (c))))
Но, для некоторого веселья, после упоминания Вассерманом о "перерыве", это может быть хорошим шансом воспользоваться преимуществами продолжения Схем, управляющими силой!
Мы можем использовать call / cc , чтобы выдать досрочное возвращение, если мы заметим какие-либо различия в деревьях. Таким образом, мы можем просто вернуться к продолжению вызывающего абонента, не раскручивая стек.
Вот действительно простой пример. Предполагается, что деревья хорошо сформированы и содержат только символы в виде листьев, но, как мы надеемся, должны продемонстрировать концепцию. Вы увидите, что процедура явно принимает продолжение в качестве параметра.
(define (same? a b return)
(cond
((and (symbol? a) (symbol? b)) ; Both Symbols. Make sure they are the same.
(if (not (eq? a b))
(return #f)))
((and (empty? a) (empty? b))) ; Both are empty, so far so good.
((not (eq? (empty? a) (empty? b))) ; One tree is empty, must be different!
(return #f))
(else
(begin
(same? (car a) (car b) return) ; Lets keep on looking.
(same? (cdr a) (cdr b) return)))))
call / cc позволяет нам захватить текущее продолжение. Вот как я назвал эту процедуру:
(call/cc (lambda (k) (same? '(a (b)) '(a (b)) k))) ; --> #t
(call/cc (lambda (k) (same? '(a (b (c) (d e))) '(a (b (c) (d e))) k))) ; --> #t
(call/cc (lambda (k) (same? '(a (b (F) (d e))) '(a (b (c) (d e))) k))) ; --> #f
(call/cc (lambda (k) (same? '(a (b)) '(a (b (c) (d))) k))) ; --> #f