ну вот и я решил побаловаться.
Правда, в первую очередь код иллюстрирует идею (использовать стандартный словарь для подсчета слов)
source file: lx.fts
\ 16.07.2010 ~mOleg
\ Сopyright [C] 2009 mOleg mOlegg@ya.ru
\ решение задачки viewtopic.php?f=19&t=2602 для конкурса
vocs/ vocab.fts
\ Дано имя файла.
\ Необходимо посчитать количество уникальных лексем в файле,
\ затем вывести собранную информацию в удобном виде.
VOCABULARY STAT
\ создать в текущем словаре лексему, которая при каждом вызове
\ будет себя увеличивать на 1
: lex ( asc # --> )
CREATED 1 ,
DOES> 1 SWAP +! ;
\ если имя уже есть в текущем словаре, выполнить его, иначе создать новое имя
: ?lex ( asc # --> )
DDUP WHO STAT SEARCH-NAME
*IF LINK>C EXECUTE DDROP ;THEN
DROP lex ;CREATE ;
\ выполнить действие ?lex над каждым словом во входном потоке
: (stat) ( --> )
ALSO STAT DEFINITIONS
BEGIN NextWord *WHILE ?lex REPEAT DDROP
RECENT ;
\ посчитать количество уникальных лексем в заданном файле
: lexfreq ( / filename --> )
ParseFileName FileSource ['] (stat) EvalSrcWith ;
\ отобразить статистику по словам
: ~~ ( --> )
WHO STAT <: CR DUP LINK>C CFL + @ . ." \t" ID. ;> WITH-VOC ;
использовать вместе с
форком так
lexfreq "file.name"
потом
~~
можно и из командной строки:
fork lx.fts lexfreq "file.name" ~~ BYE >out.log