FINDN

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

FINDN (искать-эн, найти-эн) — архаичное слово Каллисто.

FINDN          ( a −− a1 c 1 | 0 )                  Поиск слова в активных наборах. При успехе дать NFA и байт счётчика.

Поиск слова в активных наборах слов. Может изменить строку a, переведя всё в заглавные буквы.

a — адрес начала счётной строки, содержащей имя слова, которое нужно найти в словаре. В отличии от Форта a1 это NFA

Ввод слова FINDN

В режиме ЛАТ последовательно нажмите клавиши  П   7   4   K   4 

FIND в стандарте ANS Forth

 6.1.1550   FIND                                                            CORE
            ( c-addr -- c-addr 0  |  xt 1  |  xt -1 )
            Находит определение, по имени строки со счетчиком в c-addr. Если 
            определение не найдено, возвращает c-addr и нуль. Если определение 
            найдено, возвращает его идентификатор исполнения xt. Если 
            определение немедленного исполнения, возвращает также один (1), 
            иначе минус - один (-1). Для данной строки значения возвращенные 
            FIND, во время компиляции могут отличаться от возвращенных при не 
            компиляции.

        См.: 3.4.2 Поиск имен определений, A.6.1.0070 ', A.6.1.2510 ['], 
            A.6.1.2033 POSTPONE, D.6.7 Immediate-ности.

 A.6.1.1550   FIND
 Одна из более трудных проблем, которые Комитет решал, была проблема отделения 
 спецификации механизмов реализации от спецификации Forth языка. Могут быть 
 быстро перечислены три основных подхода реализации:

 1)
 Механизмы шитого кода. Это традиционные подходы к реализации Forth, но могут 
 использоваться другие методы.

 2)
 Подпрограммный шитый с "макрорасширением" (копирование кода). Короткие 
 подпрограммы, подобно коду для DUP, скорее скопированы в определение, чем 
 скомпилирована JSR ссылка.

 3)
 Непосредственное кодирование с оптимизацией. Это может включать оптимизацию 
 стека (заменяющую такие фразы как SWAP ROT + одной или двумя машинными 
 командами, например), распараллеливание (тенденция в более новых чипах RISC - 
 это иметь несколько функциональных подэлементов которые могут выполняться 
 параллельно), и так далее.

 Первоначальное требование (унаследованное от Forth 83) это адреса компиляции 
 откомпилированы в словарь, исключая типы реализации 2 и 3.

 Типа 3 механизмы и оптимизации типа 2 реализаций, были затруднены явной 
 спецификацией непосредственного исполнения или не непосредственного исполнения 
 всех стандартных слов. POSTPONE позволяет де-спецификацию непосредственного 
 исполнения или не непосредственного исполнения для всех кроме нескольких слов 
 Forth, чье поведение должно быть STATE -независимо.

 Один тип 3 реализации, cmForth Чарльза Мура, имеет версии компиляции и 
 интерпретации многих слов Forth. В настоящем, это, кажется общим подходом для 
 типа 3 реализации. Комитет чувствовал, что этот подход реализации должен быть 
 разрешенным. Следовательно, возможно, что слова без семантики интерпретации 
 могут быть найдены только в течение компиляции, и другие слова могут 
 существовать в двух версиях: версия компиляции и версия интерпретации. 
 Следовательно, значения возвращенные FIND, могут зависеть от STATE, и ' и ['] 
 могут быть не способны найти слова без семантики интерпретации.

 16.6.1.1550   FIND                                                       SEARCH
            Расширьте семантику 6.1.1550 FIND, таким образом:
            ( c-addr -- c-addr 0  |  xt 1  |  xt -1 )
            Ищет определение именованное в строке со счетчиком в c-addr. Если 
            определение не найдено после поиска всех списков слов в порядке 
            поиска, возвращает c-addr и нуль. Если определение найдено, 
            возвращяет xt.

            Если определение немедленного исполнения, также возвращает один 
            (1); иначе также возвращает минус-один (-1). Для данной строки, 
            значения возвращенные FIND во время компиляции, могут отличаться от 
            возвращенных при не компиляции.

        См.: 3.4.2 Поиск имен определений, 6.1.0070 ', 6.1.1550 FIND, 6.1.2033 
            POSTPONE, 6.1.2510 ['], D.6.7 Immediate-ности.

История

Первая версия слова FIND появилась на Burroughs 5500 в конце 1960-ых, когда Чак Мур работал на Mohasco Industries. Она была высокого уровня, то есть написана на Форте, и включала хэшированный поиск в восьми ветках словаря.

FIND в предыдущем стандарте Forth-83 (англ.)

     FIND         addr1 -- addr2 n              83
          addr1 is the address of a counted string.  The string
          contains a word name to be located in the currently active
          search order.  If the word is not found, addr2 is the string
          address addr1, and n is zero.  If the word is found, addr2
          is the compilation address and n is set to one of two non-
          zero values.  If the word found has the immediate attribute,
          n is set to one.  If the word is non-immediate, n is set to
          minus one (true).

FIND в стандарте Forth-79 (англ.)

FIND           -- addr                       203
    Leave the compilation address of the next word name,  which is
    accepted from the input stream.   If that word cannot be found
    in  the  dictionary after a search of CONTEXT and FORTH  leave
    zero.

−FIND в fig-FORTH Release 1 glossary, май 1979 (англ.)

-FIND --- pfa b tf (found) --- ff (not found)
       Accepts the next text word (delimited by blanks) in the input stream
       to HERE, and searches the CONTEXT and then CURRENT vocabularies
       for a matching entry. If found, the dictionary entry's parameter
       field address, its length byte, and a boolean true is left.
       Otherwise, only a boolean false is left.

Реализация

−FIND Форта ИТЭФ может быть имитирован BL WORD FINDN NAME>

3195 ;#FINDN
3196 ; FINDN            ( a −− a1 c 1 | 0 )                  Найти слово в активных наборах. При успехе дать NFA и байт счётчика.
3197 ; Найти слово в активных наборах слов
3198 ; a −− адрес начала счётной строки, содержащей имя слова, которое нужно найти в словаре
3199 ; В отличии от Форта ИТЭФ a1 это NFA
3200 ; −FIND Форта ИТЭФ может быть имитирован BL WORD FINDN NAME>
3201 ; Может изменить строчку a, переведя всё в заглавные буквы.
3202 LFIND:          .DB     5
3203                 .TEXT   "FINDN"                         ; ( a −− nfa c 1 | 0 )
3204                 .DW     LPNUMB
3205 FIND:           .DW CALL, DUP,TOR, COUNT, UPPER
3206                 .DW CONT,UAT, CURR,UAT, SUB, ZBRAN,ONCE ; Если словари совпадают, ускоряем поиск вдвое
3207                 .DW I, CONT,UAT,UAT, PFIND, QDUP, ZEQU, ZBRAN,FIN
3208 ONCE:           .DW I, LATES, PFIND
3209 FIN:            .DW LEV, EXIT                           ; R> DROP

Реализация из SP-Forth 4.20:

: SFIND ( addr u -- addr u 0 | xt 1 | xt -1 ) \ 94 SEARCH
\ Расширить семантику CORE FIND следующим:
\ Искать определение с именем, заданным строкой addr u.
\ Если определение не найдено после просмотра всех списков в порядке поиска,
\ возвратить addr u и ноль. Если определение найдено, возвратить xt.
\ Если определение немедленного исполнения, вернуть также единицу (1);
\ иначе также вернуть минус единицу (-1). Для данной строки, значения,
\ возвращаемые FIND во время компиляции, могут отличаться от значений,
\ возвращаемых не в режиме компиляции.
  S-O 1- CONTEXT
  DO
    2DUP I @ SEARCH-WORDLIST
    DUP IF 2SWAP 2DROP UNLOOP EXIT THEN DROP
   I S-O = IF LEAVE THEN
   1 CELLS NEGATE
  +LOOP
  0
;

: FIND1 ( c-addr -- c-addr 0 | xt 1 | xt -1 ) \ 94 SEARCH
\ Расширить семантику CORE FIND следующим:
\ Искать определение с именем, заданным строкой со счетчиком c-addr.
\ Если определение не найдено после просмотра всех списков в порядке поиска,
\ возвратить c-addr и ноль. Если определение найдено, возвратить xt.
\ Если определение немедленного исполнения, вернуть также единицу (1);
\ иначе также вернуть минус единицу (-1). Для данной строки, значения,
\ возвращаемые FIND во время компиляции, могут отличаться от значений,
\ возвращаемых не в режиме компиляции.
  DUP >R COUNT SFIND
  DUP 0= IF NIP NIP R> SWAP ELSE RDROP THEN
;

Советская реализация

Юрий Семёнов приводит следующее определение оператора FINDN через примитив (FIND) (стр. 76):

 : FINDN   BL WORD     ( чтение слова из входного или экранного
                         буфера в зависимости от значения BLK и
                         запись его, начиная с адреса HERE)
           COUNT       ( запись в стек адреса (HERE+1) — начала
                         выделенного слова, и HERE C@, равного
                         числу символов в этом слове)
           HERE CONTEXT @ @ ( подготовка параметров для поиска.
                            Поиск начнётся со слова, на которое
                        указывает системная переменная CONTEXT)
           (FIND)                            ( оператор поиска)
           ?DUP 0=    ( поиск в контекстном словаре неудачен ?)
           IF     ( если да, повторяем поиск в текущем словаре)
             HERE CURRENT @ @ (FIND)
           THEN ;

В ядре ФОРТ-ЕС слова FIND и -FIND определяются через примитив (FIND) — который устроен сложнее, чем в Каллисто.

Вот их описания и определения:

  -FIND     * ->A,N                     ВВЕСТИ СЛОВО И ИСКАТЬ В СЛОВАРЕ;  35
                                        РЕЗУЛЬТАТ ТОТ ЖЕ, ЧТО И У "FIND"

FIND      T->A,N ИСКАТЬ СЛОВО Т В ТЕКУЩЕМ КОНТЕКСТЕ             35
          ЕСЛИ N=0, ТО А=Т И СЛОВО НЕ НАЙДЕНО;
          ИНАЧЕ A=CFA НАЙДЕННОЙ СТАТЬИ, N=1 ДЛЯ
          СЛОВ "IMMEDIATE" И N=-1 ДЛЯ ОСТАЛЬНЫХ

                     Экран номер 35
( 31.03.86   FIND  -FIND )

: FIND  ( T->A,N)
    DUP >R -1 . LIT [  FORTH# ] @
    CURRENT @ @ 2DUP = IF DROP  THEN
    CONTEXT @ @ 2DUP = IF DROP  THEN
    R> (FIND)  DUP IF
      DROP ROT DROP [ &IFLAG ] LITERAL AND IF 1 ELSE -1 THEN
               THEN ;

: -FIND ( ->A,N)   BL WORD FIND ;

Определение слова -FIND в FORTH ИТЭФ:

             HEAD    205Q,'-FIN',304Q,DFIND,$COL          ; -FIND
             DW  BLAN,$WORD,HERE,COUNT,UPPER,HERE,CONT,AT,AT
             DW  PFIND,DDUP,ZEQU,ZBRAN,FIN-$,HERE,LATES,PFIND
   FIN:      DW  SEMI

Ссылки


  У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Это заготовка статьи. Вы можете помочь проекту, дополнив её.