\ двоеточие создаёт новое слово в словаре и переводит систему в состояние конпеляции
HEX \ теперь основание СС - 16
: 16x \ слово может состоять из любых непробельных символов
10 * \ умножит число на вершине стека на 0x10
; \ завершить конпеляцию
DECIMAL \ теперь основание СС - 10
: 10x
10 * \ умножит на 10
;
\ BASE - возвращает адрес ячейки, в которой зранится основание СС
\ x y ! - запишет значение x в ячейку y
8 BASE ! \ теперь основание СС - 8
: 8x
10 * \ умножит на восьмеричное 10
;
( то есть, исходный текст у всех определений одинаковый,
но конпелировались они в разном контексте,
поэтому их поведение различно, и не зависит от текущей СС,
ведь форт исполняет уже сконпелированые определения )
: BINARY 2 BASE ! ; \ текущая СС не поменяется, но будет менятся при исполнении слова BINARY
BINARY
10 16x . \ точка печатает число с вершины стека в текущей СС
11 10x .
100 8x .
CR \ перевод строки
DECIMAL
\ про ветвления и цЫклы:
\ управляющие конструкции доступны только в режиме конпеляции
: null?
0= \ сравниваем с 0, можно и двумя словами: 0 =
\ 0 0= -> -1
\ 1 0= -> 0
IF
\ сюда попадём если на вершине стека не ноль
\ ." - вырибает из исходного ьекста подстроку до ", и конпелирует код, который будет её печатать
." null"
ELSE \ ветвь может быть опущена
." not null"
THEN \ конец ветвления
CR
;
\ тест
0 null?
42 null?
\ цЫклы:
: cycles
." с постусловием "
3
BEGIN
DUP . \ DUP - дублировать вершину стека
1- DUP 0=
UNTIL \ если на вершине стека не 0 - закончит цикл
CR
DROP \ выбросить число с вершины стека
." с предусловием "
1
BEGIN
DUP 3 <=
WHILE \ если на вершине стека 0 - завершить цикл
DUP .
1+
REPEAT \ повторить цикл
CR DROP
." со счётчиком "
43 40 \ конечноезначение начальноезначение
DO
I . \ I - счетчик цикла
LOOP \ увеличить счётчик на 1 и повторить
CR
;
cycles
.( Спасибо, я кончел)
BYE