fork download
  1.  
  2. \ двоеточие создаёт новое слово в словаре и переводит систему в состояние конпеляции
  3.  
  4. HEX \ теперь основание СС - 16
  5.  
  6. : 16x \ слово может состоять из любых непробельных символов
  7. 10 * \ умножит число на вершине стека на 0x10
  8. ; \ завершить конпеляцию
  9.  
  10. DECIMAL \ теперь основание СС - 10
  11.  
  12. : 10x
  13. 10 * \ умножит на 10
  14. ;
  15.  
  16. \ BASE - возвращает адрес ячейки, в которой зранится основание СС
  17. \ x y ! - запишет значение x в ячейку y
  18. 8 BASE ! \ теперь основание СС - 8
  19.  
  20. : 8x
  21. 10 * \ умножит на восьмеричное 10
  22. ;
  23.  
  24. ( то есть, исходный текст у всех определений одинаковый,
  25. но конпелировались они в разном контексте,
  26. поэтому их поведение различно, и не зависит от текущей СС,
  27. ведь форт исполняет уже сконпелированые определения )
  28.  
  29. : BINARY 2 BASE ! ; \ текущая СС не поменяется, но будет менятся при исполнении слова BINARY
  30. BINARY
  31. 10 16x . \ точка печатает число с вершины стека в текущей СС
  32. 11 10x .
  33. 100 8x .
  34.  
  35. CR \ перевод строки
  36.  
  37. DECIMAL
  38.  
  39. \ про ветвления и цЫклы:
  40.  
  41. \ управляющие конструкции доступны только в режиме конпеляции
  42.  
  43. : null?
  44. 0= \ сравниваем с 0, можно и двумя словами: 0 =
  45. \ 0 0= -> -1
  46. \ 1 0= -> 0
  47. IF
  48. \ сюда попадём если на вершине стека не ноль
  49. \ ." - вырибает из исходного ьекста подстроку до ", и конпелирует код, который будет её печатать
  50. ." null"
  51. ELSE \ ветвь может быть опущена
  52. ." not null"
  53. THEN \ конец ветвления
  54. CR
  55. ;
  56.  
  57. \ тест
  58. 0 null?
  59. 42 null?
  60.  
  61. \ цЫклы:
  62.  
  63. : cycles
  64. ." с постусловием "
  65. 3
  66. BEGIN
  67. DUP . \ DUP - дублировать вершину стека
  68. 1- DUP 0=
  69. UNTIL \ если на вершине стека не 0 - закончит цикл
  70. CR
  71. DROP \ выбросить число с вершины стека
  72. ." с предусловием "
  73. 1
  74. BEGIN
  75. DUP 3 <=
  76. WHILE \ если на вершине стека 0 - завершить цикл
  77. DUP .
  78. 1+
  79. REPEAT \ повторить цикл
  80. CR DROP
  81.  
  82. ." со счётчиком "
  83. 43 40 \ конечноезначение начальноезначение
  84. DO
  85. I . \ I - счетчик цикла
  86. LOOP \ увеличить счётчик на 1 и повторить
  87. CR
  88. ;
  89.  
  90. cycles
  91.  
  92. .( Спасибо, я кончел)
  93.  
  94. BYE
Success #stdin #stdout 0.01s 4472KB
stdin
Standard input is empty
stdout
100000 11110 100000 
null
not null
с постусловием 3 2 1 
с предусловием 1 2 3 
со счётчиком 40 41 42 
Спасибо, я кончел