# [plt-scheme] Re: polymorphism of primitive types

On Oct 19, 2005, at 3:04 PM, David Van Horn wrote:
>* Matthias Felleisen wrote:
*>>* Now you can use it as advertised and it is contracted.
*>*
*>* I don't believe so.
*>*
*>>* But it would blow up on this:
*>>*
*>>* (let/ec jump
*>>* (mymap (lambda (x y) (if (= x y) (jump #f) (+ x y))) '(1
*>>* 2 .
*>>* 3) '(1 . 2)))
*>>*
*>>* Should it? -- Matthias
*>*
*>* The jump is a red herring here. The function breaks even without
*>* escaping continuations:
*>*
*>* (mymap (lambda (x y) (+ x y)) '(1 2 . 3) '(1 . 2)))
*
There is no proper list so it should throw up.
>* I believe the problem is in has-at-least-as-many-cons-as. In
*>* particular, you don't use the min argument except to decrement it at
*>* each recursion, so the function returns true just when list? would.
*>*
*>* Since there is rarely a chance to get so say this sort of thing, I'll
*>* take my opportunity now: Matthias, use the recipe.
*
Still this is particularly embarrassing because I taught a class on
exactly this design recipe with David in it:
;; (Listof X) Nat -> Boolean
(define (has-at-least-as-many-cons-as l min)
(let loop ([l l][min min])
(cond [(= min 0) #t]
[(null? l) #f]
[else (and (pair? l) (loop (cdr l) (- min 1)))])))
Test suite suitably adjusted :-)
-- Matthias
>*
*>* David
*>*
*>* _________________________________________________
*>* For list-related administrative tasks:
*>* http://list.cs.brown.edu/mailman/listinfo/plt-scheme
*