#lang plai/gc2/mutator (allocator-setup "generational.rkt" 240) (define not (lambda (x) (if x #f #t))) (define (append x y) (if (empty? x) y (cons (first x) (append (rest x) y)))) (define (reverse l) (reverse1 empty l)) (define (reverse1 a l) (if (empty? l) a (reverse1 (cons (first l) a) (rest l)))) (define (filter f l) (filter1 f l empty)) (define (filter1 f l result) (if (empty? l) (reverse result) (filter1 f (rest l) (if (f (first l)) (cons (first l) result) result)))) (define (sort l less?) (if (empty? l) l (let* ([pivot (first l)] [left? (lambda (x) (less? x pivot))] [left (filter left? (rest l))] [right? (lambda (x) (not (less? x pivot)))] [right (filter right? (rest l))]) (append (append (sort left less?) (cons pivot empty)) (sort right less?))))) (sort '(3 1 4 2) (lambda (a b) (< a b)))