(require-library "trace.ss") (define (make-coffee name price caffeine) (cons name (cons price caffeine))) (define todays-menu (list (make-coffee "AARDVARK: Alyssa's Really Dark Very Aromatic Roasty Kup" 3.82 85) (make-coffee "BEN'S Expresso Noir Supreme" 17.23 92) (make-coffee "CyDFect Yusually Doesn't Find Expresso Consumption Tohisliking" 0.85 12) (make-coffee "EvaLuAtor's Venti American Light Ubiquitous Always Tasty Oven Roasted Supremo" 2.73 15) (make-coffee "Gerry's Not The Java Guy, Guy Is Scheming Mocha Boca Grande" 2.00 57))) (define coffee-name car) (define coffee-price cadr) (define coffee-caffeine-rating cddr) (define (insertlg f lst start) (if (null? lst) start (f (car lst) (insertlg f (cdr lst) start)))) (define (find-most-caffeinated menu) (insertlg (lambda (c1 c2) (if (> (coffee-caffeine-rating c1) (coffee-caffeine-rating c2)) c1 c2)) menu (make-coffee "null-coffee" 0.00 -1))) ;; we should only get the null-coffee if there are no coffees on the menu (define (find-most-caff menu) (if (null? menu) (make-coffee "null-coffee" 0.00 -1) (let ((rest-most-caff (find-most-caff (cdr menu)))) (if (> (coffee-caffeine-rating (car menu)) (coffee-caffeine-rating rest-most-caff)) (car menu) rest-most-caff)))) ;;; Evaluates to the list parameter with exactly one instance of el removed. (define (delete lst el) (if (null? lst) (error "Element not found!") (if (eq? (car lst) el) (cdr lst) (cons (car lst) (delete (cdr lst) el))))) (define (sort-menu menu) (if (null? menu) menu (let ((most-caff (find-most-caffeinated menu))) (cons most-caff (sort-menu (delete menu most-caff)))))) (define (find-most cf lst) (insertlg (lambda (c1 c2) (if (cf c1 c2) c1 c2)) lst (car lst))) (define (sort cf lst) (if (null? lst) lst (let ((most (find-most cf lst))) (cons most (sort cf (delete lst most)))))) (define (sort-menu-by-caffeine menu) (sort (lambda (c1 c2) (> (coffee-caffeine-rating c1) (coffee-caffeine-rating c2))) menu)) (define (sort-menu-by-price menu) (sort (lambda (c1 c2) (> (coffee-price c1) (coffee-price c2))) menu)) (define counter 0) (define (counter-lt v1 v2) (set! counter (+ counter 1)) (< v1 v2)) (define (revintsto n) (if (= n 0) null (cons n (revintsto (- n 1))))) (define (filter f lst) (insertlg (lambda (el rest) (if (f el) (cons el rest) rest)) lst null)) (define (quicksort cf lst) (if (null? lst) lst (append (quicksort cf (filter (lambda (el) (cf el (car lst))) (cdr lst))) (list (car lst)) (quicksort cf (filter (lambda (el) (not (cf el (car lst)))) (cdr lst)))))) (define (rand-int-list n) (if (= n 0) null (cons (random 100) (rand-int-list (- n 1)))))