Начальный курс программирования на языке Форт

         

СРАВНЕНИЕ СТРОК


Для сравнения строк предусмотрены следующие два слова Форта:

-TEXT

( al # a2 -- ?)

Сравнение двух строк длиной # , начинающийся с al и а2. Если сравнение успешное, на стек заносится ложь. Если нет, на стек заносится истина (положительное число, если двоичное представление строки1 > двоичного представления строки2, и отрицательное, если стр.1 < стр.2 ).

-MATCH



( d # s # -- а ?)

Поиск фрагмента длиной #, начинающегося с адреса s (источник) в области памяти длиной # , начинающейся с адреса d (получатель). Если поиск завершился успешно, на стек помещается начало искомого фрагмента a заданной области памяти и ложь. В противном случае неправильный адрес и истина.

С помощью слова -TEXT вы можете либо сравнить две строки, либо проверить порядок их расположения (по алфавиту)1. В гл. 12 приводится пример использования слова

-TEXT для выявления полного совпадения строк.

Так как для быстроты слово -TEXT осуществляет сравнение поячеечно, необходимо следить за тем, чтобы при наличии машин с ячеечной адресацией слову

-TEXT выдавались адреса, выравненные по границе ячейки. Например, если вы хотите сравнить вводимую строку со строкой, находящейся в каком-то массиве, перенесите вводимую строку в рабочую область (посредством -TEXT, а не WORD), поскольку адрес PAD лежит на границе ячейки. Аналогичным образом, когда вам нужно проверить некую строку, находящуюся в блочном буфере, убедитесь в том, что ее адрес выравнен по границе ячейки, или, если вы не можете этого сделать, перед выполнением проверки перешлите строку по выравненному адресу (используя CMOVE).

Отметим, что дефис в слове -TEXT, как и символ «~» кода ASCII, означает логическое «нет». По этой причине указанный префикс удобно применять в именах слов, помещающих в стек флаги с противоположным логическим значением (т.е. нуль представляет истину, а ненулевое значение - ложь).

Если в вашей системе нет слова -TEXT, вы можете загрузить приведенное ниже определение.
Конечно, для быстроты определение слова

-TEXT
обычно пишется в машинных кодах.: -TEXT ( a1 # а2 -- f=сравнение | полож=1>2 | отр=1<2 ) 2DUP + SWAP DО DROP 2+ DUP 2- @ I @ - DUP IF DUP ABS / LEAVE THEN 2 +LOOP SWAP DROP ;

1 Для пользующихся процессорами INTEL, DEC и Zilog. Для того чтобы выполнить такую проверку, вы должны расположить байты в обратном порядке

Слово -MATCH применяется в командах редактирования, таких, как F и S, по которым должен осуществляться поиск некоторого фрагмента в памяти, содержащей данный фрагмент. Как и в случае с

-ТEХТ
, желательно, чтобы слово -MATCH было написано в машинных, кодах. Если этого сделать не удается, можете воспользоваться следующим определением высокого уровня, которое вам подойдет (для .надежности и переносимости описанные далее слова не используют такие приемы, как принудительный выход из циклов посредством EXIT, что ускорило бы их выполнение):VARIABLE 'ИСТОЧНИК ( адрес исходного фрагмента) VARIABLE ИСТОЧНИК# ( длина исходного фрагмента) VARIABLE ФЛАГ ( t=сравнвмия-не-прмоошло) : -MATCH ( d # s # -- a t=cpавнение-не-произошло) SWAP 'ИСТОЧНИК ! DUP ИСТОЧНИК# ! - DUP 0< NOT IF 1+ 0 DO 0 ФЛАГ ! 'ИСТОЧНИК @ ИСТОЧНИК# @ 0 DO OVER I + С@ OVER I С@ - IF -1 ФЛАГ ! LEAVE THEN LOOP DROP ФЛАГ @ 0= IF LEAVE THEN 1+ LOOP ФЛАГ @ THEN ;


Содержание раздела