Редактирование: (FIND)

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 16: Строка 16:


== Реализация ==
== Реализация ==
В [[Каллисто|Каллисто 1.0]] примитив (FIND) сперва ищет слово в [[Память двоичных данных|памяти данных]], а затем в [[Память программ|памяти программ]]:
<pre>
739 ;#xFIND
740 ; (FIND)          ( a1 a2 −− a3 c 1 | 0 )              Поиск слова a1 в словаре a2. Если найдено, вернуть nfa и байт счётчика.
741 ; Адрес_строки NFA => NFA длина TRUE/FALSE
742 ; В отличии от Форта ИТЭФ мы возвращаем NFA
743 ; a1 адрес строки со счётчиком −− слово, которое мы ищем (пока только в байтовой области)
744 ; a2 NFA первого слова в начале списка слов, где мы ищем
745 ; a3 NFA найденного слова в списке
746 ; c байт длины и флагов найденого в списке слова
747 ; Сделать поиск и сравнение по словам
748 ;
749 ; Здесь в качестве истины возвращается 1, хотя Каллисто перешло на стандарт −1/0
750 LPFIND:        .DB    6
751                .TEXT  "(FIND)"                ; ( a1 a2 −− a3 c 1 | 0 )
752                .DW    LBRAN
753 PFIND:          .DW    JPFIND
754 JPFIND:
755 ; Сперва поиск в памяти данных
756                RM3 MA 1 + M3
757                PKRM03 1 EE 4 − MB              ; RB адрес слова, которое мы ищем (строка со счётчиком)
758                KRMB M0                        ; R0 Длина слова, которое мы ищем
759                RMB 1 + MB                      ; RB адрес первой литеры слова, который мы ищем
760                KRMA
761 DFAST:          M5 1 EE 4 − FX>=0 PFIND2
762                MA M5                          ; RA=M5 адрес NFA слова в списке слов, с которым сравниваем
763                KRMA PKM03 63 KAND              ; TOS байт длины и флагов очередного слова из списка
764                RM0 − FX=0 DSKIP                ; Если длины и флаг SMUDGE различны, пропустить слово
765                KRM5 KRMB − FX!=0 SLO          ; Если ещё и первые литеры равны, сравнить слова подробней
766 DSKIP:          PKRM03 31 KAND RMA + M5
767                KRM5 RME ∗ KRM5 + FX=0 DFAST    ; LFA, Смотреть след. слово
768                PKM03  KGOTO9                  ; Не нашли, в RX уже 0
769 SLO:            RM0 M1  RMB M5  RMA 1 + M4  GOTO SLOIN
770 SLOL:          KRM4 KRM5 − FX=0 DSKIP
771 SLOIN:          FL1 SLOL
772                PKRM03 RMA 1 EE 4 +
773                PGOTO PFTAIL                    ; NFA, нашли!
774
775 ; Если слово не найдено, поиск в памяти программ
776 PFIND2:        RM5
777 FAST:          MA                              ; RA адрес NFA слова в списке слов, с которым сравниваем
778                KPRGM PKM03 63 KAND            ; TOS байт длины и флагов очередного слова из списка
779                RM0 −  FX=0 SKIP                ; Если длины и флаг SMUDGE различны, пропустить слово
780                RMA 1 + KPRGM KRMB − PX!=0 SLOW ; Если ещё и первые литеры равны, сравнить слова подробней
781 SKIP:          PKRM03 31 KAND 1 + RMA +
782                KPRGM FANS 1 + KPRGM
783                <−> RME ∗ +  PX=0 FAST          ; LFA, Смотреть след. слово
784                PKM03  KGOTO9                  ; Не нашли, в RX уже 0
785 SLOW:          RM0 M1  RMB M5  RMA 1 +  GOTO SLOWIN
786 SLOWL:          1 + M8                          ; R8 следующая литера
787                KPRGM KRM5 −  PX=0 SKIP
788                RM8
789 SLOWIN:        FL1 SLOWL
790                PKRM03 RMA
791 PFTAIL:        PKM03                          ; NFA, нашли!
792                <−> KM3                        ; c
793                1 KM3 KGOTO9                    ; 1
</pre>
=== Советская реализация ===
Слово (FIND) в ФОРТ-ЕС было [[примитив]]ом и устроено сложнее, чем в [[Каллисто]] и fig-Форте. Вот его описание и определение:
Слово (FIND) в ФОРТ-ЕС было [[примитив]]ом и устроено сложнее, чем в [[Каллисто]] и fig-Форте. Вот его описание и определение:
<PRE>
<PRE>
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)