Arsen Gonian – Язык программирования Форт (Forth). Решение задач по программированию. Версия 2. (страница 11)
A isn't unique ()
B isn't unique ()
Это не критично, SP-Forth будет работать дальше, но, во-первых, будут созданы новые переменные с такими же именами, что просто будет бесполезно увеличивать расходы памяти, во-вторых, если вам нужно было предыдущее значение, то они уже не будут доступны по имени.
: B23 ( -> ) \ стековая нотация по прежнему пуста
A @ B @ C @ \ -> A B C
A ! C ! B ! \ A=C C=B B=A
;
1 A ! 2 B ! 3 C ! B23 A @ . B @ . C @ .
3 1 2 Ok
A=3, B=1, C=2.
Для вещественного аргумента нужны соответствующие переменные.
FVARIABLE FA FVARIABLE FB FVARIABLE FC
: B23 ( -> ) \ стековая нотация по прежнему пуста
FA F@ FB F@ FC F@ \ -> A B C
FA F! FC F! FB F! \ C=A B=C A=B
;
1E FA F! 2E FB F! 3E FC F! B23 FA F@ F. FB F@ F. FC F@ F.
3.0000000 1.0000000 2.0000000 Ok \ FA=3 FB=1 FC=2
Инициализация и вывод слова «1E FA F! 2E FB F! 3E FC F! B23 FA F@ F. FB F@ F. FC F@ F.» получились не короче самого слова. Оформите в отдельное слово для обоих вариантов самостоятельно.
Пример 24. Аналогичен предыдущему с перемещением содержимого по схеме: A -> C-> B -> A.
Переменные используем с предыдущего примера.
: B24 ( -> ) \ стековая нотация пуста
A @ B @ C @ \ -> A B C
B ! A ! C ! \ B=C A=B C=A
;
1 A ! 2 B ! 3 C ! \ инициализация A=1 B=2 C=3
Ok
B24 \ вызов нашей функции
Ok
A @ . B @ . C @ . \ A=2 B=3 C=1
2 3 1 Ok
Для вещественного аргумента.
: B24 ( -> ) \ стековая нотация пуста
FA F@ FB F@ FC F@ \ -> A B C
FB F! FA F! FC F! \ B=C A=B C=A
;
Проверим на аналогичных данных.
1E-1 FA F! 2E-1 FB F! 3E-1 FC F! B24 \ FA=0.1 FB=0.2 FC=0.3
FA F@ F. FB F@ F. FC F@ F. \ FA=0.2 FB=0.3 FC=0.1
0.2000000 0.3000000 0.1000000 Ok
Пример 25. Вычислить значение функции, если дан аргумент. Опустим целочисленный вариант, его можете написать самостоятельно.
: B25 ( X -> F[X] ) \ F(X)=3*X^6-6*x^2-7
F**2 \ X -> X^2
FDUP -6E F* \ X^2 -> X^2 -6*X^2
–7E F+ \ X^2 {-6*X^2} -> X^2 {-6*X^2-7}
FSWAP \ X^2 {-6*X^2-7} -> {-6*X^2-7} X^2
3E F** \ {-6*X^2-7} X^2 -> {-6*X^2-7} {X^2}^3=X^6
3E F* F+ \ {-6*X^2-7}+{3*X^6}
;
1E B25 F.
–10.000000 Ok \ F(1)=-10
1E-3 B25 F.
–7.0000060 Ok \ F(0.001)=– 7.0000060
А вот при аргументе равным нулю выдает ошибку (возведение нуля в степень):
0E B25 F.
EXCEPTION! CODE:C0000090 ADDRESS:0055384E WORD:F**
USER DATA: 007005BC THREAD ID: 00002120 HANDLER: 0019EF98
STACK: (0) 5BF752DB 00328000 76F066DD 0019FFDC 74C30400 00328000 [74C30419]
RETURN STACK:
0019EF84 : 0056DC53 B25