Arsen Gonian – Язык программирования Форт (Forth). Решение задач по программированию. Версия 2. (страница 14)
S" lib\include\float2.f" INCLUDED
VARIABLE A VARIABLE B VARIABLE C \ Часто используемые переменные
FVARIABLE FA FVARIABLE FB FVARIABLE FC
: DEG>RAD ( A{DEG} -> X{RAD} ) \ X=A*Pi/180 – градусы в радианы
314E-2 F* \ A -> 3.14*A
180E F/ \ 3.14*A -> 3.14*A/180
;
: RAD>DEG ( A{RAD} -> X{DEG} ) \ 180*A/Pi – радианы в градусы
180E F* \ A -> 180*A
314E-2 F/ \ 180*A -> 180*A/Pi
;
Назовите файл как вам нравится, но обязательно с расширением «.F», тогда его можно будет запустить и он откроется в SP-Forth, при условии, что он у вас установлен. Тогда вам не придется каждый раз выполнять рутинные задачи, которые вы включите в этот файл.
Чтобы упростить интерфейс взаимодействия с написанными словами, например, вывод результатов расчета для слов со множеством выходных данных, можно применить уже описанную выше методику.
Рассмотрим пример №28.
2E B28 F. F. F. F. F.
Здесь «B28 F. F. F. F. F.» заменяем на слово
: B28. ( A^2 A^3 A^5 A^10 A^15 -> ) B28 F. F. F. F. F. ;
Такой вариант предпочтительный не только из-за упрощения, но и исходя из того, что вы со временем забудете, как работает слово, а разбираться в работе слове каждый раз не разумно, да и зачем перегружать мозг бесполезными мелочами? Оператор «.» – точка в Форте всегда связана с печатью на экран, поэтому «Name.» – логично означает печать результатов слова «Name». Только не забудьте написать соответствующее слово перед ее выполнением, автоматически слова в Форте не пишутся. Так же можно включать словесное описание результатов, например,
: B28. ( A^2 A^3 A^5 A^10 A^15 -> ) B28
.” A^15= “ F. CR \ CR – это оператор перевода на новую строку
.” A^10= “ F. CR
.” A^5= “ F. CR
.” A^3= “ F. CR
.” A^2= “ F. CR
;
Окончательно вызов слова B28 будет выглядеть, с учетом упрощения, так:
2E B28.
Так мы разделяем алгоритм работы слова с его примитивным интерфейсом вывода результатов на экран. В таком случае при необходимости что-то доработать, одно не помешает другому и, разумеется, код становится более лаконичным и понятным. Оригинал «B28» можно использовать в других словах, библиотеках, и это никак не помешает по-прежнему пользоваться примером 28. Так же при решении сложной задачи, можно писать аналогичные промежуточные слова «Name.» для отладки и контроля промежуточного состояния сложной системы слов, когда не понятно на каком этапе возникает ошибка.
BEGIN 31-40
Пример 31. Перевести температуру в Фаренгейтах в градусы Цельсия. Сперва для целых значений температуры.
: B31 ( TF-> TC ) \ TC=(TF-32)*5/9
32 – 5 * 9 /
;
32 B31 \ 32 град Фаренгейта = 0 град Цельсия, 32-32=0, 0*5/9=0
Ok ( 0 )
35 B31 \ 35 град Фаренгейта = 1 град Цельсия (35-32)=3, 3*5=15, 15/9=1 – целая часть
Ok ( 0 1 )
40 B31 \ 40 град Фаренгейта = 4 град Цельсия (40-32)=8, 8*5=40, 40/9=4 – целая часть
Ok ( 0 1 4 )
С незначительными изменениями мы сможем переписать код для вещественных значений температуры.
: B31 ( TF-> TC ) \ TC=(TF-32)*5/9
32E F-
5E F* 9E F/
;
32E B31 F. \ как и в первом варианте, только результат в вещественном формате
0.0000000 Ok
321E-1 B31 F.
0.0555555 Ok
Пример 32. Обратная к предыдущему примеру задача. Перевести температуру из Цельсия в Фаренгейты.
: B32 ( TC -> TF ) \ TF= TC*9/5+32
9 * 5 / 32 + ;
0 B32 \ 0 град Цельсия = 32 град Фаренгейта
Ok ( 32 )
–18 B32
Ok ( 32 0 ) \ -18 град Цельсия = 0 град Фаренгейта
Для вещественного аргумента.
: B32 ( TC -> TF ) \ TF= TC*9/5+32
9E F* 5E F/ 32E F+ ;
0E B32 F. \ 0 град Цельсия = 32 град Фаренгейта
32.000000 Ok
–18E B32 F. \ -18 град Цельсия = -0,4 град Фаренгейта