Scheme crooks & nannies: the case form
You know R5RS's case construct? It works much like case/switch statements in other languages, except it has more parentheses: ;-)
#;6> (define language 'chicken) #;7> (case language ---> ((c c++ java) "bleh") ---> ((python perl ruby) "better") ---> ((chicken scheme) "cool") ---> (else "never heard of it")) "cool"
Now, yesterday there was an interesting question in chicken-users. The following code works:
#;8> (define foo 'a)
#;9> (case foo
---> ('a 3)
---> (else 4))
3
Does that mean that Chicken's case accepts qualifiers other than lists? Actually, no. Here's a hint:
#;10> (define bar 'quote)
#;11> (case bar
----> ('a 3)
----> (else 4))
3
As it turns out, 'a expands to (quote a), so it *is* a list, and therefore "correct", in the sense that case treats it like a list containing the symbols quote and a. (Which is not what was intended, but it *is* valid.)
Too bad, the following does not work:
#;13> (define cool-names '(guido larry matz felix)) #;14> (case 'bill ----> (cool-names "cool!") ----> (else "uncool")) Error: (map) during expansion of (case ...) - argument is not a proper list: cool-names
Inspecting a case construct with macroexpand-1 may give more insight in how case works exactly. I was going to leave this as an exercise to the reader, but thought better of it. :-) Here's an example (formatting added by me):
#;1> (macroexpand-1 '(case a ((x y z) 5) (else 4)))
(let ((g2 a))
(if (or (eqv? g2 (quote x))
(eqv? g2 (quote y))
(eqv? g2 (quote z)))
(begin 5)
(begin 4)))