(define find-path (lambda (target s) (cond ((equal? target s) '()) ((not (pair? s)) #f) ((find-path target (car s)) => (lambda (a) (cons 'car a))) ((find-path target (cdr s)) => (lambda (a) (cons 'cdr a))) (else #f)))) (define sexpr-terminal-adder (lambda (terminal-to-number) (define aux (lambda (sexpr) (if (pair? sexpr) (+ (aux (car sexpr)) (aux (cdr sexpr))) (terminal-to-number sexpr)))) aux)) (define count-non-neg-nums (sexpr-terminal-adder (lambda (terminal) (if (and (number? terminal) (>= terminal 0)) 1 0)))) (define sum-even-nums (sexpr-terminal-adder (lambda (terminal) (if (and (number? terminal) (even? terminal)) terminal 0)))) (define count-foos-minus-bars (sexpr-terminal-adder (lambda (terminal) (cond ((equal? terminal 'foo) 1) ((equal? terminal 'bar) -1) (else 0))))) (define generalized-noah (lambda (lis n) (if (null? lis) () (cons (take n lis) (generalized-noah ((rep maybe-cdr n) lis) n))))) (define take (lambda (n lis) (if (or (zero? n) (null? lis)) () (cons (car lis) (take (- n 1) (cdr lis)))))) (define maybe-cdr (lambda (lis) (if (null? lis) () (cdr lis)))) (define rep (lambda (f n) (lambda (x) (if (zero? n) x ((rep f (- n 1)) (f x))))))