БОЛЕЕ ПОДРОБНО ОБ ОПЕРАТОРЕ IF
В результате выполнения операции сравнения флаг1 на самом деле вверх не выбрасывается, как это показано на рисунках, а его значение заносится в стек, подобно любому другому аргументу. Истина представляется -1 (отрицательной единицей), а ложь - 0 (нулем)2. Слово IF берет флаг из стека и использует его.
Попытайтесь ввести следующую фазу с терминала и пусть слово . выведет значение; представляющее флаг: 12 12 = . -1 ok Да, 12 равно 12 11 12 = . 0 ok Нет, 11 не равно 12
Можно вводить знаки операций сравнения непосредственно с вашего терминала, как в приведенном выше примере, но помните, что оператор IF ... THEN должен целиком находиться в пределах одного определения, поскольку его выполнение сопряжено с ветвлением программы. Слово IF будет воспринимать -1 как значение флага «истина», а 0 — как «ложь». Перед IF может стоять еще одно слово NOT3, которое меняет значение флага в стеке на противоположное: О NOT .-1 ok -1 NOT . 0 ok
Слово NOT позволяет изменить условие IF на обратное. Таким образом, мы можем записать : ?ДВЕНАДЦАТЬ ( n -- ) 12 = NOT IF . " Не двенадцать. " THEN ;
1 Для начинающих. На компьютерном жаргоне значение, которое один фрагмент программы оставляет другому в качестве сигнала, называется флагом.
2 Для пользователей систем, созданных до введения Стандарта-83. В более ранних системах истина представлялась как 1.
3
Для систем фаг-Форт. Используйте в этих целях 0 = .
и если параметр n не будет равен 12, на печать будет выводиться фраза «Не двенадцать».
Использование стека в Форт-системе для передачи значений флага — одно из наиболее удачных решений, привлекательных прежде всего своей простотой. Вы можете, например, передать флаг в качестве аргумента другому слову (если нужно, то за пределы определения):: .ДА? ( ? — ) IF ." Да " THEN ; 12 12 = .ДА? Да ok
(Знак вопроса в стековом комментарии означает флаг.) Можете ли вы назвать еще такой язык, который дает возможность записывать условие в одной процедуре, а оператор IF — в другой?