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
Ссылки
- Исходный текст слова FINDN в Каллисто Классик 1.0
- Слово FIND и комментарий к нему в стандарте ANS Forth (англ.)
- Слово FIND в стандарте ANS Forth, расширение SEARCH (англ.)
- Слово FIND и комментарий к нему в черновике Forth 200x (англ.)
- Слово FIND в черновике Forth 200x, расширение SEARCH (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |