Hi, David,
You posed a great question to start us off.
Maybe I got carried away. As for "strange," billions of
people around the world write in different, strange ways:
bottom to top, right to left, in circles, or in spirals.
Some of them even use computers:-).
Bernd Paysan sent me an improved version of 'nwords'
(aka. 'ktop'). I'm not sure it reached the Digest, so here it is:
: nwords ( n --- )
cr 0 [: .word >r 1- r> over 0> ;] context @ traverse-wordlist 2drop ;
.
I would also like to suggest a different algorithm for
reversing the links on the stack or in an array, IF space is at a
premium, as this keeps fewer pointers ( about, 2*square-root of N )
and works nearly as fast:
61 value rootof#
\ The square-root of the number of words gives minimum space.
: rlist ( [nt-start] col n -- col' )
?dup-if 2>r r@ 1 ?do dup >link @ loop
2r> 0 do swap .word loop then ;
: rmwords ( -- )
0 [: over rootof# mod 0= if tuck then 1 under+ ;]
context @ traverse-wordlist
rootof# /mod
>r 0 swap cr rlist r> 0 ?do rootof# rlist loop drop ;
. Also, you get two reversers in this deal.
IF space is at a higher premium yet, you can continue the idea for
the cost of a traversal and some overhead per root, using,
rootof# + rootofrootof# + ... pointers.
So, 65536 words would use, 256 + 16 + 4 + 2 +1 = 279 pointers
and require the first traversal ( gather rootof# & count ) and 3 similar
traversals, plus the write-out and loop overheads, but the saving of
1 pointer in the last three terms isn't worth another 2 traversals,
so 16 looks the place to stop, giving 256 + 16 +16 = 288 pointers and
4 total traversals ( bundling the write ).
I use the big-"IF" here, but I'm always a little skeptical of claims
there is always enough space and speed with modern computers.
If that were so, we would bubble-sort everything, defrag our sd-cards,
and never have to worry about how many apps and media files we
have nor whether to upgrade our phone's os, and we wouldn't fall asleep
during installs and virus scans, and we'd multitask everything at once,
and be done before we began:-).
Keep asking good questions, and feel free to explore and experiment.
James