[racket-dev] Simple loop checking in beginner?

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Wed Nov 10 10:44:36 EST 2010

On Nov 10, 2010, at 10:40 AM, namekuseijin wrote:

> On Wed, Nov 10, 2010 at 12:13 AM, John Clements
> <clements at brinckerhoff.org> wrote:
>> ;; only-long-strings : (listof string) -> (listof string)
>> ;; return a list containing the strings longer than 2 chars
>> (define/noloop (only-long-strings l)
>>  (cond [(empty? l) empty]
>>        [else (cond [(< 2 (string-length (first l)))
>>                     (cons (first l)
>>                           (only-long-strings (rest l)))]
>>                    [else (only-long-strings l)])]))
> gosh, students do suck.  I guess you teach them to use cond because
> it's a generalized if.  But then they proceed to use it just like if:
> always two conditions per (verbose) cond! :p
> then again, may be someone who had previous exposure to lesser languages...

Perhaps you should ask before you critique. 
We insist on this style: 

  -- the outer cond corresponds to the structure of the data definition of the input 
  -- the inner one signals decision relevant for the output 
	(I would use an 'if' for the inner one, but over N years of programming
	as if a student might see my code one day, I have come to really, truly 
	like the unconditional use of cond for the layout purpose) 

Posted on the dev mailing list.