[racket] Problem with case
On Tue, Sep 18, 2012 at 5:29 PM, Danny Yoo <dyoo at 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.