On Apr 28, 2013, at 2:46 AM, Jordan Johnson <[email protected]> wrote:
> 1) Write a couple of test cases for insert-everywhere/in-one-word. Specific
> data is almost always easier to think about than abstract names. At very
> least, make a test case for a 1-letter word w1 and another for a 2-letter
> word w2, such that w1 is (rest w2).
>
> 2) In those test cases, identify what (first a-word) and
> (insert-everywhere/in-one-word a-1str (rest a-word)) are. Compare those data
> to your test cases' desired results, since those results are what
> create-combinations must produce from those two pieces of data. Use these
> data to make a test case for create combinations.
This is what I call an "inventory with values". Before you get to this stage,
you've learned to write down (in comments) an "inventory" of expressions you're
likely to need inside the function. Start with the parameters, and any global
variables that are obviously related. If any of those are of struct types, you
might want to add expressions getting at their fields. If any of those are of
variant types (like "list", which is "either an empty list or a non-empty
list"), write a conditional that distinguishes the cases, and then within each
case, you can list the likely expressions. So for a typical function-on-lists,
you get
(define (my-function numbers)
; numbers a list of
numbers
(cond [(empty? numbers)
…
]
[(cons? numbers)
; (first numbers) a number
; (rest numbers) a list of
numbers
; (my-function (rest numbers)) whatever type this returns
…
]))
Then comes the "inventory with values" part: pick a not-too-simple example
(say, a list of three or four elements) from the test cases that you've already
written (if you haven't already written several test cases, with right answers,
stop and do that!), and next to each of the comment expressions, write down its
value for that example. Also add another commented line saying "right answer",
and write down ITS value for that example. If there's another conditional,
other than the "is it empty or not?" question above, choose at least two
not-too-simple examples, one for each case. The result might look like
(define (my-function numbers)
; numbers a list of
numbers '(3 8 7 2)
(cond [(empty? numbers)
…
]
[(cons? numbers)
; (first numbers) a number
3
; (rest numbers) a list of
numbers '(8 7 2)
; (my-function (rest numbers)) whatever type this returns
278
; right answer number
2783
…
]))
Stephen Bloch
[email protected]
____________________
Racket Users list:
http://lists.racket-lang.org/users