Редактирование:
IF
(раздел)
Перейти к навигации
Перейти к поиску
Внимание:
Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте
или
создадите учётную запись
, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Анти-спам проверка.
Не
заполняйте это!
== Реализация == В [[Каллисто]], как и в Форте, реализован «разрушающий IF»: слово IF всегда ''снимает'' со стека значение, в зависимости от которого выполняется одна или другая последовательность слов. Если вам важно ещё раз проверить это значение, необходимость его сохранения возложена на разработчика — обычно для этого используются слова [[Слово ↑|↑]] или [[?DUP]]. IF можно использовать только внутри [[Слово :|определений через двоеточие]]. Слово IF [[?COMP|проверяет состояние компиляции]], и если обнаруживает [[Слово [|состояние исполнения]], вызывает [[Авост приложения|авост]] с сообщением об ошибке № 17. Слово IF компилирует в [[шитый код]] [[?BRANCH|оператор условного перехода]], который будет прилежно выполняться вне зависимости от [[STATE]]. <pre> 3699 ;#IF 3700 ; IF I ( ф −− ) Если ф ложен (ф=0), перейти к парному THEN (или ELSE). 3701 LIF: .DB 82H 3702 .TEXT "IF" ; ( флаг −− ) 3703 .DW LELSE 3704 SIF: .DW CALL ; Начало ветвления "IF". 3705 RIF: .DW QCOMP, COMP,ZBRAND, GMARK, TWO, EXIT </pre> Пример реализации IF из предыдущего стандарта Forth-83: : IF COMPILE ?BRANCH >MARK ; IMMEDIATE Реализация IF в СП-Форте 3.07: <PRE> : IF ?COMP HERE ?BRANCH, >MARK 1 ; IMMEDIATE </PRE> Реализации из SP-Forth 4.20: <pre> : IF \ 94 \ Интерпретация: семантика неопределена. \ Компиляция: ( C: -- orig ) \ Положить на управляющий стек позицию новой неразрешенной ссылки вперед orig. \ Добавить семантику времени выполнения, данную ниже, к текущему определению. \ Семантика незавершена, пока orig не разрешится, например, по THEN или ELSE. \ Время выполнения: ( x -- ) \ Если все биты x нулевые, продолжать выполнение с позиции, заданной \ разрешением orig. ?COMP 0 ?BRANCH, >MARK 1 ; IMMEDIATE </pre> <pre> : IF \ 94 ?COMP 0 TC-?BRANCH, >MARK 1 ; IMMEDIATE </pre> === Советская реализация === Юрий Семёнов приводит следующее описание слова IF (стр. 59): : IF COMPILE ?BRANCH HERE 0 , 2 ; IMMEDIATE У Баранова-Ноздрунова определение слова IF выглядит так (стр. 58): : IF ( ---> A,1 ) COMPILE ?BRANCH >MARK 1 ; IMMEDIATE Описание слова IF и определение IF…ELSE…THEN в ядре ФОРТ-ЕС: <pre> IF HК->А,2 /КОМПИЛЯЦИЯ/ НАЧАЛО ВЕТВЛЕНИЯ "IF" 47 F-> /ИСПОЛНЕНИЕ/ Экран номер 47 ( 31.03.86 СТАНДАРТНЫЕ СТРУКТУРЫ УПРАВЛЕНИЯ ) : IF ?COMP COMPILE ?BRANCH >MARK 2 ; IMMEDIATE : THEN 2 ?PAIRS >RESOLVE ; IMMEDIATE : ELSE 2 ?PAIRS COMPILE BRANCH >MARK SWAP >RESOLVE 2 ; IMMEDIATE </pre> Определение слова IF в FORTH ИТЭФ: <PRE> HEAD 302Q,'I',306Q,$IF,$COL ; IF DW COMP,ZBRAN,HERE,ZERO,COMMA,TWO,SEMI </PRE>
Описание изменений:
Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см.
Pmkwiki:Авторские права
).
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!
В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:
Отменить
Справка по редактированию
(в новом окне)
Навигация
Персональные инструменты
Вы не представились системе
Обсуждение
Вклад
Создать учётную запись
Войти
Пространства имён
Статья
Обсуждение
русский
Просмотры
Читать
Править
История
Ещё
Поиск
Навигация
Заглавная страница
Свежие правки
Случайная страница
Справка по MediaWiki
Инструменты
Ссылки сюда
Связанные правки
Служебные страницы
Сведения о странице