В СМАЛ32 было очень удобно наводить порядок в словарях после сборки текста библиотеки.
то есть, определялись все нужные слова в текущем словаре, а потом все не нужные для работы слова прятались, к примеру в HIDDEN.
Данная либа предназначена для того же, к примеру:
>VOCAB HIDDEN WithVoc unlink-hash unlink-last
переместит слова: WithVoc unlink-hash unlink-last
из текущего словаря в HIDDEN
Соответственно, переносить слова можно только между статическими словарями.
[pre]\ 09.08.2009 ~mOleg
\ Сopyright [C] 2009 mOleg
mininoleg@yahoo.com\ перемещение слов в другой словарь
vocs/ vocadd.fts
\ найти vid словаря по его имени
: FINDVOC ( asc # --> vid | 0 )
D>L VOC-LIST
BEGIN A@ *WHILE
DUP voc-name> DL@ COMPARE WHILE
off_vlink
REPEAT
THEN LDROP LDROP ;
\ можно ли переносить слово между словарями
: ?STATIC ( vid --> flag )
off_vtable A@ [ ALSO FORTH CONTEXT @ PREVIOUS off_vtable A@ LIT, ] = ;
\ удалить слово из цепочки LAST указанного словаря
: unlink-last ( lfa vid --> )
DDUP off_last A@ = IF SWAP LINK> SWAP off_last A! ;THEN
SWAP >L off_last A@ DUP
BEGIN LINK> *WHILE
DUP L@ <> WHILE
NIP DUP
REPEAT LINK> SWAP to_link off_link A! LDROP
;THEN ERROR" Данное слово в указанном словаре не обнаружено!" ;
\ удалить слово из треды указанного словаря
: unlink-hash ( lfa vid --> )
OVER ID>ASC ROT FindThread \ --> lfa thread
DDUP A@ = IF SWAP LINK> SWAP A! ;THEN
SWAP >L A@ DUP
BEGIN to_link off_thread A@ *WHILE
DUP L@ <> WHILE
NIP DUP
REPEAT to_link off_thread A@ SWAP to_link off_thread A! LDROP
;THEN ERROR" Данное слово в указанном словаре не обнаружено!" ;
\ извлечь слово Word из текущего словаря
\ все связи слова обрываются
: EXTRACT ( asc # vid --> lfa )
DUP >L (voc-search) *IF DUP L@ unlink-last DUP L> unlink-hash ;THEN
ERROR" Слово не найдено в текущем словаре!" ;
\ переместить слово word из текущего словаря в указанный Vocab
: W>VOC ( vid Word --> )
*IF DUP ?STATIC GET-CURRENT ?STATIC AND
IF NEXT-WORD GET-CURRENT EXTRACT linkto ;THEN
ERROR" Слова можно перемещать только между статическими словарями!"
;THEN ERROR" Не верно задано имя целевого словаря!" ;
\ переместить в указанный словарь с именем voc слово word
\ имя словаря должно быть уникальным, либо, слово будет перенесено в последний
\ созданный словарь с данным именем
: >VOC ( / voc word --> ) NEXT-WORD FINDVOC W>VOC ;
\ перемещать в указанный vid словарь слова до исчерпания входного потока
:> WithVoc ( l: vid / word1 .. wordn --> l: vid )
BEGIN SeeForw NIP WHILE L@ W>VOC REPEAT ;
\ переместить список слов в указанный словарь
: >VOCAB ( / Vocab Name1 Name2 .. NameN --> )
NEXT-WORD FINDVOC
*IF >L WithVoc Cr_ PARSE ROT >L StrSource L> EvalSrcWith LDROP ;THEN
ERROR" Ожидается имя словаря" ;
\ пример использования:
\ >VOCAB HIDDEN WithVoc unlink-hash unlink-last
\ ALSO HIDDEN WORDS[/pre]
В СМАЛ32 было очень удобно наводить порядок в словарях после сборки текста библиотеки.
то есть, определялись все нужные слова в текущем словаре, а потом все не нужные для работы слова прятались, к примеру в HIDDEN.
Данная либа предназначена для того же, к примеру:
>VOCAB HIDDEN WithVoc unlink-hash unlink-last
переместит слова: WithVoc unlink-hash unlink-last
из текущего словаря в HIDDEN
Соответственно, переносить слова можно только между статическими словарями.
[pre]\ 09.08.2009 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ перемещение слов в другой словарь
vocs/ vocadd.fts
\ найти vid словаря по его имени
: FINDVOC ( asc # --> vid | 0 )
D>L VOC-LIST
BEGIN A@ *WHILE
DUP voc-name> DL@ COMPARE WHILE
off_vlink
REPEAT
THEN LDROP LDROP ;
\ можно ли переносить слово между словарями
: ?STATIC ( vid --> flag )
off_vtable A@ [ ALSO FORTH CONTEXT @ PREVIOUS off_vtable A@ LIT, ] = ;
\ удалить слово из цепочки LAST указанного словаря
: unlink-last ( lfa vid --> )
DDUP off_last A@ = IF SWAP LINK> SWAP off_last A! ;THEN
SWAP >L off_last A@ DUP
BEGIN LINK> *WHILE
DUP L@ <> WHILE
NIP DUP
REPEAT LINK> SWAP to_link off_link A! LDROP
;THEN ERROR" Данное слово в указанном словаре не обнаружено!" ;
\ удалить слово из треды указанного словаря
: unlink-hash ( lfa vid --> )
OVER ID>ASC ROT FindThread \ --> lfa thread
DDUP A@ = IF SWAP LINK> SWAP A! ;THEN
SWAP >L A@ DUP
BEGIN to_link off_thread A@ *WHILE
DUP L@ <> WHILE
NIP DUP
REPEAT to_link off_thread A@ SWAP to_link off_thread A! LDROP
;THEN ERROR" Данное слово в указанном словаре не обнаружено!" ;
\ извлечь слово Word из текущего словаря
\ все связи слова обрываются
: EXTRACT ( asc # vid --> lfa )
DUP >L (voc-search) *IF DUP L@ unlink-last DUP L> unlink-hash ;THEN
ERROR" Слово не найдено в текущем словаре!" ;
\ переместить слово word из текущего словаря в указанный Vocab
: W>VOC ( vid Word --> )
*IF DUP ?STATIC GET-CURRENT ?STATIC AND
IF NEXT-WORD GET-CURRENT EXTRACT linkto ;THEN
ERROR" Слова можно перемещать только между статическими словарями!"
;THEN ERROR" Не верно задано имя целевого словаря!" ;
\ переместить в указанный словарь с именем voc слово word
\ имя словаря должно быть уникальным, либо, слово будет перенесено в последний
\ созданный словарь с данным именем
: >VOC ( / voc word --> ) NEXT-WORD FINDVOC W>VOC ;
\ перемещать в указанный vid словарь слова до исчерпания входного потока
:> WithVoc ( l: vid / word1 .. wordn --> l: vid )
BEGIN SeeForw NIP WHILE L@ W>VOC REPEAT ;
\ переместить список слов в указанный словарь
: >VOCAB ( / Vocab Name1 Name2 .. NameN --> )
NEXT-WORD FINDVOC
*IF >L WithVoc Cr_ PARSE ROT >L StrSource L> EvalSrcWith LDROP ;THEN
ERROR" Ожидается имя словаря" ;
\ пример использования:
\ >VOCAB HIDDEN WithVoc unlink-hash unlink-last
\ ALSO HIDDEN WORDS[/pre]