(define (atom? x) (not (pair? x))) (define (foo? s1 s2) (cond ((and (atom? s1) (atom? s2)) (eq? s1 s2)) ((and (atom? s1) (pair? s2)) #f) ((and (atom? s2) (pair? s1)) #f) (else (and (foo? (car s1) (car s2)) (foo? (cdr s1) (cdr s2)))))) (define (bar? s1 s2) (call/cc (lambda (esc) (define (loop s1 s2) (lambda (s1 s2) (cond ((and (atom? s1) (atom? s2)) (esc (eq? s1 s2))) ((and (atom? s1) (pair? s2)) (esc #f)) ((and (atom? s2) (pair? s1)) (esc #f)) (else (and (loop (car s1) (car s2)) (loop (cdr s1) (cdr s2)))))))) (loop s1 s2))) (define *-counter-maker (lambda () (let ((c 0)) (lambda (msg . args) (case msg ((type) '*-counter) ((show) c) (else (set! c (+ c 1)) (* msg (car args)))))))) (define (product ls *-counter) (define (loop ls) (cond ((null? ls) 1) ((zero? (car ls)) 0) (else (*-counter (car ls) (loop (cdr ls)))))) (loop ls)) (define (product-call/cc ls *-counter) (call/cc (lambda (esc) (define (loop ls) (cond ((null? ls) 1) ((zero? (car ls)) (esc 0)) (else (*-counter (car ls) (loop (cdr ls)))))) (loop ls))))