[racket] world/universe update model (functional update redux), using the I/O monad for state
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)
>