On Tue, Sep 18, 2012 at 5:29 PM, Danny Yoo <d...@hashcollision.org> wrote: > > > > > I'd like to see a discussion of the tradeoffs between cond & case & match > > and how each is best used.
1. Use 'cond' where you would use 'if...else if...else' in a C-like language. It's just a multi-way if: (cond [(string? value) (write-string value out)] [(bytes? value) (write-bytes value out)] [(input-port? value) (copy-port value out)] [else (error "bad value")]) 2. Use 'case' (roughly) where you would use 'switch' in C, namely, when you're comparing the value of an expression against a set of constants: (case escape-char [(#\n) #\newline] [(#\r) #\return] [(#\t) #\tab] [(#\a) #\u0007] [(#\v) #\u000b] [(#\f) #\u000c] [(#\e) #\u001b] [else escape-char]) 3. Use 'match' (roughly) where you would use 'case' in ML. I agree with Danny: it's particularly nice for struct matching: (: add (All (A) ((Braun A) A -> (Braun A)))) (define (add t a) (match t [(Braun-Empty) (Braun-Tree a t t)] [(Braun-Tree x l r) (Braun-Tree a (add r x) l)])) > > > I think 'case' is supposed to have good performance compared to the > other two, due to work by Jon Zeppieri > (http://lists.racket-lang.org/dev/archive//2012-July/010036.html). > The new case implementation isn't in 5.3 or the stable branch on github. (I assume the nightly builds on racket-lang.org are from the stable branch?) It's in the master branch. ____________________ Racket Users list: http://lists.racket-lang.org/users