I have barely any Racket experience, but this sounds really good to me:
"My favorite part of Racket is how it supports a certain development style of evolving scripts into programs […] I transition from "no code" to "working code" to "robust code" to "re-usable code", the program is almost always runnable."
This is also true of most lisps, and, IME, any language with a good REPL. You can start with snippets which become the bodies of loops and functions, which grow into the full program with (as he points out) various tests and examples constructed along the way.
It's a useful way for approaching a sort of (in my use) hybrid of top-down/bottom-up programming. The things you see on the REPL growing into functions or structs or classes is the bottom-up part, but still with some specification (in this case KWIC indexing) guiding the ultimate interface.
2) This isn't, strictly, about processing text data but about an approach to development that Racket makes easy.
Specifically:
Prototype in a REPL or similar
Easily integrate unit tests alongside the relevant
units.
Convert it to a statically typed implementation:
Remove some need for run-time checks
Depending on programming ethos has significant value
3) If you really want to do text processing, let's go with perl:
Usage notes
Command line flags/options
Tests
Static typing (maybe of value for small programs like
this, but useful in larger programs [EDIT:0])
The first three are trivially added to the other two programs (though the perl one will need some reformatting). But the fourth is impossible. Again, for this scope of project (a demonstration, mind you) the tests and static typing aren't as essential. But if you want this code to live on, and potentially become part of a library of more utilities, they're very helpful.
[0] and projects that depend on this is a library call so they know the types of the arguments and returns.
Prefix your code with two spaces on each line and HN will include it verbatim. Otherwise it thinks you have paragraphs with line breaks that it ignores.
"My favorite part of Racket is how it supports a certain development style of evolving scripts into programs […] I transition from "no code" to "working code" to "robust code" to "re-usable code", the program is almost always runnable."