Редактирование:
FINDN
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == −FIND Форта ИТЭФ может быть имитирован BL WORD FINDN NAME> <pre> 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 </pre> Реализация из SP-Forth 4.20: <pre> : 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 ; </pre> === Советская реализация === Юрий Семёнов приводит следующее определение оператора 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)]] — который устроен сложнее, чем в [[Каллисто]]. Вот их описания и определения: <PRE> -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 ; </PRE> Определение слова -FIND в FORTH ИТЭФ: <PRE> 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 </PRE>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице