diff --git a/collects/lang/private/intermediate-funs.ss b/collects/lang/private/intermediate-funs.ss index 8d917e4d70..d6c4aac2b4 100644 --- a/collects/lang/private/intermediate-funs.ss +++ b/collects/lang/private/intermediate-funs.ss @@ -26,7 +26,7 @@ "(build-string n f) = (string (f 0) ... (f (- n 1)))") ((intermediate-quicksort quicksort) ((listof X) (X X -> boolean) -> (listof X)) "to construct a list from all items on a list in an order according to a predicate") - ((intermediate-quicksort sort) ((listof X) (X X -> boolean) -> (listof X)) + ((intermediate-sort sort) ((listof X) (X X -> boolean) -> (listof X)) "to construct a list from all items on a list in an order according to a predicate") (andmap ((X -> boolean) (listof X) -> boolean) "(andmap p (list x-1 ... x-n)) = (and (p x-1) (and ... (p x-n)))") diff --git a/collects/lang/private/teachprims.ss b/collects/lang/private/teachprims.ss index 9ab9f095af..83f7d48c25 100644 --- a/collects/lang/private/teachprims.ss +++ b/collects/lang/private/teachprims.ss @@ -280,18 +280,25 @@ namespace. (make-exn:fail:contract (string-append (format "~a : " quicksort) (apply format fmt-str x)) (current-continuation-marks)))) + + (define (do-sort l cmp? name) + (unless (beginner-list? l) + (qcheck name "first argument must be of type , given ~e" l)) + (unless (and (procedure? cmp?) (procedure-arity-includes? cmp? 2)) + (qcheck name "second argument must be a that accepts two arguments, given ~e" cmp?)) + (sort l (lambda (x y) + (define r (cmp? x y)) + (unless (boolean? r) + (qcheck name "the results of the procedure argument must be of type , produced ~e" r)) + r))) (define-teach intermediate quicksort (lambda (l cmp?) - (unless (beginner-list? l) - (qcheck 'quicksort "first argument must be of type , given ~e" l)) - (unless (and (procedure? cmp?) (procedure-arity-includes? cmp? 2)) - (qcheck 'quicksort "second argument must be a that accepts two arguments, given ~e" cmp?)) - (quicksort l (lambda (x y) - (define r (cmp? x y)) - (unless (boolean? r) - (qcheck 'quicksort "the results of the procedure argument must be of type , produced ~e" r)) - r)))) + (do-sort l cmp? 'quicksort))) + (define-teach intermediate sort + (lambda (l cmp?) + (do-sort l cmp? 'sort))) + (define-teach intermediate foldr (lambda (f e l) (unless (and (procedure? f) (procedure-arity-includes? f 2)) @@ -356,6 +363,7 @@ namespace. beginner-equal~? beginner-=~ intermediate-quicksort + intermediate-sort intermediate-foldr intermediate-foldl intermediate-build-string