[plt-scheme] The perfect teaching language--Is this too much to ask for?

From: Stephen Bloch (sbloch at adelphi.edu)
Date: Mon Jun 15 10:17:36 EDT 2009

I'm trying out some of the contract features to see what I could  
reasonably use in a first programming course.

(require scheme/contract)

(define/contract (fact n)
   (-> number? number?)
   (cond [(= n 7) true]
         [(<= n 0) 1]
         [else (* n (fact (- n 1)))]))

(check-expect (fact 0) 1)
(check-expect (fact 1) 1)
(check-expect (fact 4) 24)
(check-expect (fact 7) "bad news")
(check-expect (fact 8) "bad news")

It correctly catches the contract violation on (fact 7) when it's  
called from check-expect, but if I comment out that test case and try  
(fact 8), it does NOT catch the contract violation when fact calls  
itself.  I guess that's what "the definition is a contract boundary"  
means, and I see the argument for it on efficiency grounds, but it's  
sort of annoying for beginning-programming use.

BTW, the above definition works in ISL, but doesn't pass a syntax  
check in BSL.  I've bug-reported it.

Stephen Bloch
sbloch at adelphi.edu

Posted on the users mailing list.