mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2024-11-22 21:52:31 +03:00
Compare commits
3 Commits
c3ca6d7769
...
6828962fd8
Author | SHA1 | Date | |
---|---|---|---|
|
6828962fd8 | ||
|
77e2233bf3 | ||
|
ccdb3504c9 |
@ -461,10 +461,10 @@ end module fruity
|
||||
! to express loop-level parallelism
|
||||
|
||||
integer :: i
|
||||
real :: array(100)
|
||||
real :: array(10)
|
||||
|
||||
DO CONCURRENT (i = 1:size(array))
|
||||
array(i) = sqrt(i**i)
|
||||
array(i) = sqrt(real(i)**i)
|
||||
END DO
|
||||
|
||||
|
||||
|
@ -8,18 +8,21 @@ filename: learnforth-ru.fs
|
||||
lang: ru-ru
|
||||
---
|
||||
|
||||
Форт создан Чарлзом Муром в 70-е годы. Это императивный, стековый язык программирования и среда исполнения программ. Использовался в таких проектах как Open Firmware. Продолжает применятся в проектах. Применяется в НАСА.
|
||||
Форт создан Чарлзом Муром в 70-е годы. Это императивный, стековый язык
|
||||
программирования и среда исполнения программ. Использовался в таких проектах
|
||||
как Open Firmware. Продолжает применяться в проектах. Применяется в НАСА.
|
||||
|
||||
Внимание: этот материал использует реализацию Форта - Gforth, но большая часть написанного будет работать в других средах.
|
||||
Внимание: этот материал использует реализацию Форта - Gforth, но большая часть
|
||||
написанного будет работать в других средах.
|
||||
|
||||
|
||||
```forth
|
||||
\ Это комментарий
|
||||
( Это тоже комментарий, но используется для предоределённых слов )
|
||||
( Это тоже комментарий, но используется для предопределённых слов )
|
||||
|
||||
\ --------------------------------- Прекурсор --------------------------------
|
||||
|
||||
\ Всё программирование на Форте заключается в манипулировании
|
||||
\ Всё программирование на Форте заключается в манипулировании
|
||||
\ параметрами на стеке.
|
||||
5 2 3 56 76 23 65 \ ok
|
||||
|
||||
@ -31,7 +34,7 @@ lang: ru-ru
|
||||
|
||||
\ ---------------------------- Базовая арифметика ----------------------------
|
||||
|
||||
\ Арифметика (фактически все ключевые слова требуют данных) - это манипуляция
|
||||
\ Арифметика (фактически все ключевые слова требуют данных) - это манипуляция
|
||||
\ данными на стеке.
|
||||
5 4 + \ ok
|
||||
|
||||
@ -51,10 +54,10 @@ lang: ru-ru
|
||||
|
||||
\ --------------------------- Манипуляции со стеком ---------------------------
|
||||
|
||||
\ Естественно, когда мы работаем со стеком, то используем
|
||||
\ Естественно, когда мы работаем со стеком, то используем
|
||||
\ больше полезных методов:
|
||||
|
||||
3 dup - \ дублировать верхний элемент в стеке
|
||||
3 dup - \ дублировать верхний элемент в стеке
|
||||
\ (1-й становится эквивалентным 2-му): 3 - 3
|
||||
2 5 swap / \ поменять местами верхний элемент со 2-м элементом: 5 / 2
|
||||
6 4 5 rot .s \ сменять по очереди 3-и верхних элемента: 4 5 6
|
||||
@ -63,20 +66,20 @@ lang: ru-ru
|
||||
|
||||
\ ------------------ Более продвинутые манипуляции со стеком ------------------
|
||||
|
||||
1 2 3 4 tuck \ дублировать верхний елемент стека во вторую позицию:
|
||||
1 2 3 4 tuck \ дублировать верхний элемент стека во вторую позицию:
|
||||
\ 1 2 4 3 4 ok
|
||||
1 2 3 4 over \ диблировать второй елемент наверх стека:
|
||||
1 2 3 4 over \ дублировать второй элемент наверх стека:
|
||||
\ 1 2 3 4 3 ok
|
||||
1 2 3 4 2 roll \ *переместить* элемент в заданной позиции наверх стека:
|
||||
\ 1 3 4 2 ok
|
||||
1 2 3 4 2 pick \ *дублировать* элемент в заданной позиции наверх:
|
||||
1 2 3 4 2 pick \ *дублировать* элемент в заданной позиции наверх:
|
||||
\ 1 2 3 4 2 ok
|
||||
|
||||
\ Внимание! Обращения к стеку индексируются с нуля.
|
||||
|
||||
\ --------------------------- Создание новых слов -----------------------------
|
||||
|
||||
\ Определение новых слов через уже известные. Двоеточие `:` переводит Форт
|
||||
\ Определение новых слов через уже известные. Двоеточие `:` переводит Форт
|
||||
\ в режим компиляции выражения, которое заканчивается точкой с запятой `;`.
|
||||
: square ( n -- n ) dup * ; \ ok
|
||||
5 square . \ 25 ok
|
||||
@ -86,15 +89,15 @@ see square \ : square dup * ; ok
|
||||
|
||||
\ -------------------------------- Зависимости --------------------------------
|
||||
|
||||
\ -1 == true, 0 == false. Однако, некоторые ненулевые значения
|
||||
\ -1 == true, 0 == false. Однако, некоторые ненулевые значения
|
||||
\ обрабатываются как true:
|
||||
42 42 = \ -1 ok
|
||||
12 53 = \ 0 ok
|
||||
|
||||
\ `if` это компилируемое слово. `if` <stuff to do> `then` <rest of program>.
|
||||
: ?>64 ( n -- n ) dup 64 > if ." Больше чем 64!" then ;
|
||||
: ?>64 ( n -- n ) dup 64 > if ." Больше чем 64!" then ;
|
||||
\ ok
|
||||
100 ?>64
|
||||
100 ?>64
|
||||
\ Больше чем 64! ok
|
||||
|
||||
\ Else:
|
||||
@ -119,7 +122,7 @@ myloop
|
||||
: one-to-12 ( -- ) 12 0 do i . loop ; \ ok
|
||||
one-to-12 \ 0 1 2 3 4 5 6 7 8 9 10 11 12 ok
|
||||
|
||||
\ `?do` работает подобным образом, за исключением пропуска начального
|
||||
\ `?do` работает подобным образом, за исключением пропуска начального
|
||||
\ и конечного значения индекса цикла.
|
||||
: squares ( n -- ) 0 ?do i square . loop ; \ ok
|
||||
10 squares \ 0 1 4 9 16 25 36 49 64 81 ok
|
||||
@ -139,13 +142,13 @@ variable age \ ok
|
||||
\ Затем мы запишем число 21 в переменную 'age' (возраст) словом `!`.
|
||||
21 age ! \ ok
|
||||
|
||||
\ В заключении мы можем напечатать значение переменной прочитав его словом `@`,
|
||||
\ которое добавит значение на стек или использовать слово `?`,
|
||||
\ В заключении мы можем напечатать значение переменной прочитав его словом `@`,
|
||||
\ которое добавит значение на стек или использовать слово `?`,
|
||||
\ что бы прочитать и распечатать в одно действие.
|
||||
age @ . \ 21 ok
|
||||
age ? \ 21 ok
|
||||
|
||||
\ Константы объявляются аналогично, за исключем того, что мы не должны
|
||||
\ Константы объявляются аналогично, за исключем того, что мы не должны
|
||||
\ беспокоиться о выделении адреса в памяти:
|
||||
100 constant WATER-BOILING-POINT \ ok
|
||||
WATER-BOILING-POINT . \ 100 ok
|
||||
@ -155,7 +158,7 @@ WATER-BOILING-POINT . \ 100 ok
|
||||
\ Создание массива похоже на объявление переменной, но нам нужно выделить
|
||||
\ больше памяти.
|
||||
|
||||
\ Вы можете использовать слова `2 cells allot` для создания массива
|
||||
\ Вы можете использовать слова `2 cells allot` для создания массива
|
||||
\ размером 3 элемента:
|
||||
variable mynumbers 2 cells allot \ ok
|
||||
|
||||
@ -165,7 +168,7 @@ mynumbers 3 cells erase \ ok
|
||||
\ В качестве альтернативы мы можем использовать `fill`:
|
||||
mynumbers 3 cells 0 fill
|
||||
|
||||
\ или мы можем пропустить все слова выше и инициализировать массив
|
||||
\ или мы можем пропустить все слова выше и инициализировать массив
|
||||
\ нужными значениями:
|
||||
create mynumbers 64 , 9001 , 1337 , \ ok (the last `,` is important!)
|
||||
|
||||
@ -205,7 +208,7 @@ mynumbers 1 of-arr ? \ 20 ok
|
||||
|
||||
\ ---------------- Операции над числами с плавающей точкой --------------------
|
||||
|
||||
\ Многие фортовцы стараются избегать использование слов с вещественными числами.
|
||||
\ Многие фортовцы стараются избегать использования слов с вещественными числами.
|
||||
8.3e 0.8e f+ f. \ 9.1 ok
|
||||
|
||||
\ Обычно мы просто используем слово 'f', когда обращаемся к вещественным числам:
|
||||
@ -215,7 +218,7 @@ myfloatingvar f@ f. \ 4.4 ok
|
||||
|
||||
\ ---------- В завершение несколько полезных замечаний и слов -----------------
|
||||
|
||||
\ Указание несуществующего слова очистит стек. Тем не менее, есть специальное
|
||||
\ Указание несуществующего слова очистит стек. Тем не менее, есть специальное
|
||||
\ слово для этого:
|
||||
clearstack
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user