B – это сокращение от BEGIN, что обозначает первую группу заданий (мы и далее будем использовать такой вид названий в последующих группах заданий), затем слитно пишется номер примера. Сразу после имени в скобках пишется комментарий стековой нотации. Так принято в Форте. В данном случае Слово-функция B1 берет один параметр A (четырехбайтовое целое число и оставляет другое того же типа). A – сторона квадрата – вход функции, P – его периметр – возвращаемое функцией значение. Тело – очень короткое, просто умножает число на вершине стека на 4 (не забываем, что в Форте обратная польская нотация, сначала идут операнды, затем операция).
Теперь чтобы воспользоваться нашим словом, например, чтобы посчитать периметр квадрата со стороной 3, используем следующий код:
3 B1 .
12 Ok
Точка «.» – это стандартное форт слово, которое печатает число на вершине стека на экран.
Напомним, общий вид определения нового слова в Форте:
: Название-Слова ( стек до выполнение –> после ) Код-Тела-Функции ; \ комментарий
Пример 2. Нам нужно посчитать площадь квадрата:
: B2 ( A -> S ) DUP * ; \ S=A^2
Мы просто дублируем содержимое на вершине стека число (для чего используем оператор языка Форт – DUP) и умножаем его на себя. Данный пример можно оформить более красиво для использования в ваших будущих программах:
: SQR ( A -> A^2 ) DUP * ; \ A^2 – вычисление квадрата числа, или
: ^2 ( A -> A^2 ) DUP * ; \ или
: **2 ( A -> A^2 ) DUP * ; \ отличие только в названии
Какой нравится, тот и можете использовать. Или все сразу, так тоже можно.
Пример 3. По сторонам прямоугольника нужно вычислить его Площадь и Периметр:
: B3 ( A B -> S P ) \ ( S=A*B P=2*(A+B) )
2DUP ( A B -> A B A B ) \ Слово 2DUP, дублирует сразу два числа
* ( A B A B -> A B A*B=S ) \ Площадь вычислен – это просто произведение сторон
ROT ROT ( A*B=S A B ) \ оператор ROT вытаскивает 3-ий от вершины параметр на вершину
\ применив его два раза на вершине мы получаем A B и вычисленный под ним Площадь
+ 2* ; \ складываем A и B, и умножив на 2, оператором 2*, получаем периметр
Слово «2*» делает тоже самое что и два слова «2 *», только короче и проще.
В итоге на стеке мы получаем Площадь и Периметр. Чтобы напечатать результаты на экран из примеров нужно просто ввести точку с клавиатуры «.» и затем нажать «Enter». Сначала напечатается вершина, т. е. периметр, в данном примере, затем повторив действия площадь. Чтобы изменить порядок печати, можно набрать слово SWAP, который меняет местами 2 числа на вершине стека ( A B -> B A), т.е., например чтобы вычислить площадь и периметр прямоугольника со сторонами 1 и 2 введём следующее:
1 2 B3 SWAP . .
2 6 Ok
Площадь равна 1*2=2, а периметр равен 2*(1+2)=6. Слово работает корректно и вычисляются площадь и периметр соответственно стековой нотации, а выводятся по условию задачи.
Пример 4. Нужно вычислить длину круга зная его диаметр:
: B4 ( D -> L ) 314 * ; \ L=Pi*D*100
Ответ буде в 100 раз больше для целочисленных данных, таким образом избавимся от дробной части. Перепишем код, чтобы можно было работать с вещественными числами. Для этого в SP-Forth нужно подключить соответствующие библиотеки. Скопируйте и вставьте следующие две строчки:
S" lib\include\float.f" INCLUDED
S" lib\include\float2.f" INCLUDED
Но можно только вторую строчку.
Теперь чтобы ввести вещественное число, скажем 0,5, нужно набрать на клавиатуре следующее:
5E-1
До E – это мантисса (число), после экспонента (степень). Мантисса и экспонента могут быть как положительными (знак не требуется), так и отрицательными (в данном случае степень -1, что значит 10 в минус первой степени).
После ввода, вещественное число размещается на соответствующем ей стеке, поэтому мы не видим его после вывода слова Ok в скобках, так как это другой стек для целых чисел. Чтобы его увидеть нужно ввести «F.». Итак, чтобы проверить, что всё работает как надо, введём код:
5E-1 F.
В ответ увидим:
0.5000000 Ok
Слово «F.», аналогично, как и «.» выводит число на экран, только не с целочисленного стека, а с вещественного.
Теперь мы можем переписать пример 4 для вещественных аргументов:
: B4 ( D -> L ) \ L=Pi*D
314E-2 F* ;
Посчитаем длину окружности диаметром 0,5, набрав следующее:
5E-1 B4 F. \ вызываем слово, которое считает длину и «F.» печатает ответ
1.5700000 Ok
Переделаем таким же образом первые 3 примера для случая с вещественными аргументами, сделав их более универсальными.
Пример 1:
: B1 ( A -> P ) 4E F* ; \ P=4*A
Знак «*» заменяется на «F*», четверка вводится как вещественное число (операция «F*», в отличие от «*» производит операцию над вещественными числами на вещественном стеке). Теперь проверим, посчитаем периметр квадрата со стороной 0,5:
5E-1 B1 F.
2.0000000 Ok
Ответ 2 (0,5*4=2) что является правдой.
Данный пример, так же можно преобразовать, написав в стиле:
: B1 ( A -> P ) \ P=4*A
4E F*
;