#lang racket (define add-generator (lambda (n) (lambda (m) (+ n m)))) (define add42 (add-generator 42)) (define add7 (add-generator 7)) (define make-list-cleaner (lambda (item) (lambda (ls) (filter (lambda (x) (not (eq? item x))) ls)))) (define remove-zeros (make-list-cleaner 0)) ; (remove-zeros '(1 2 0 0 3 0 5)) => '(1 2 3 5) (define remove-qs (make-list-cleaner 'q)) ; (remove-qs '(1 2 q a d f)) => '(1 2 a d f) (define make-limited (lambda (proc) (lambda ls (if (> (length ls) 3) 'unreasonable (apply proc ls))))) (define limited+ (make-limited +)) ; (limited+ 1 2) => 3 ; (limited+ 10 20 30) => 60 ; (limited+ 3 4 5 6) => 'unreasonable ; up to three arguments is fine