[racket] world/universe update model (functional update redux), using the I/O monad for state

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Tue Dec 13 22:33:35 EST 2011

On Dec 13, 2011, at 5:10 PM, John Clements wrote:

> 
> On Dec 12, 2011, at 7:55 PM, Matthias Felleisen wrote:
> 
>> 
>> Is the below really much less natural to write? I really enjoyed playing the qwerty row from left to right, or perhaps I was pressing the number keys at the same time :-)
> 
> You're cheating! Unless quasiquote is a new part of htdp/2e....

It is. 


> And actually: yes, I think that the below still is less natural to write. Student says: why do we have to write down the parts that don't change? Doesn't the redundancy introduce extra opportunities for error?

That's easy too: 

(define (set-world-volume w voloume) ...)

and the code looks hyperclean. Until you get into deep 'store trees', this game is easily won by plain FP programming. And as Shriram said, before you give up, use zippers. 

-- Matthias




> 
> John
> 
> 
> 
>> 
>> #lang racket
>> 
>> (require (except-in (planet clements/rsound)
>>                   overlay
>>                   scale)
>>        2htdp/universe
>>        2htdp/image)
>> 
>> (define octave 48)
>> (define volume .4)
>> (define duration 22050)
>> 
>> (define (main)
>> (big-bang `(,octave ,volume ,duration)
>>           (to-draw my-draw)
>>           (on-key  my-key)))
>> 
>> (define (my-draw num)
>> (place-image/align (text (format "~s" num) 11 'red) 10 50 'left 'top (empty-scene 100 100)))
>> 
>> (define (my-key w key)
>> (match (cons key w)
>>   [`("0" ,oct ,vol ,dur) `( 0 ,vol ,dur)]
>>   [`("1" ,oct ,vol ,dur) `(12 ,vol ,dur)]
>>   [`("2" ,oct ,vol ,dur) `(24 ,vol ,dur)]
>>   [`("3" ,oct ,vol ,dur) `(36 ,vol ,dur)]
>>   [`("4" ,oct ,vol ,dur) `(48 ,vol ,dur)]
>>   [`("5" ,oct ,vol ,dur) `(60 ,vol ,dur)]
>>   [`("6" ,oct ,vol ,dur) `(72 ,vol ,dur)]
>>   [`("7" ,oct ,vol ,dur) `(84 ,vol ,dur)]
>>   [`("8" ,oct ,vol ,dur) `(96 ,vol ,dur)]
>>   [`((or "=" "+") ,oct ,vol ,dur) `(,oct ,(if (< vol 1) (+ vol .1) vol) ,dur)]
>>   [`((or "-" "_") ,oct ,vol ,dur) `(,oct ,(if (> vol 0) (- vol .1) vol) ,dur)]
>>   [`("z" ,oct ,vol ,dur) `(,oct ,vol ,(if (> dur 11025) (- dur 11025) dur))]
>>   [`("x" ,oct ,vol ,dur) `(,oct ,vol ,(if (< dur 88200) (+ dur 11025) dur))]
>>   [`("q" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 12 oct)) vol dur)) w]
>>   [`("w" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 13 oct)) vol dur)) w]
>>   [`("e" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 14 oct)) vol dur)) w]
>>   [`("r" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 15 oct)) vol dur)) w]
>>   [`("t" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 16 oct)) vol dur)) w]
>>   [`("y" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 17 oct)) vol dur)) w]
>>   [`("u" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 18 oct)) vol dur)) w]
>>   [`("i" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 19 oct)) vol dur)) w]
>>   [`("o" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 20 oct)) vol dur)) w]
>>   [`("p" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 21 oct)) vol dur)) w]
>>   [`("[" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 22 oct)) vol dur)) w]
>>   [`("]" ,oct ,vol ,dur) (play (make-tone (midi-note-num->pitch (+ 23 oct)) vol dur)) w]
>>   [`("a" ,oct ,vol ,dur) (play c-hi-hat-1) w]
>>   [`("s" ,oct ,vol ,dur) (play c-hi-hat-2) w]
>>   [`("d" ,oct ,vol ,dur) (play o-hi-hat) w]
>>   [`("f" ,oct ,vol ,dur) (play snare) w]
>>   [`("g" ,oct ,vol ,dur) (play bassdrum) w]
>>   [`("h" ,oct ,vol ,dur) (play bassdrum) w]
>>   [`("j" ,oct ,vol ,dur) (play bassdrum-synth) w]         
>>   [`("k" ,oct ,vol ,dur) (play clap-1) w]
>>   [`("l" ,oct ,vol ,dur) (play clap-2) w]
>>   [`(";" ,oct ,vol ,dur) (play crash-cymbal) w]
>>   [else w]
>>   [else (displayln `(no match ,w))]))
>> 
>> (main)
> 




Posted on the users mailing list.