Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Изучите Форт за пять минут. |
|
|
Тоже интересная идея Forth In 100 Steps (доступен ознакомительный фрагмент данной книги) P.S. Создал топик на форуме radiokot Форт и Ардуино (и не только)В топике был задан вопрос "ЗАЧЕМ учить Форт?" Подумал и правда ЗАЧЕМ? одно из мнений из i-net безотносительно Форта Зачем изучать несколько языков программирования(c++, java)?
Тоже интересная идея :D [url=https://leanpub.com/forthin100steps]Forth In 100 Steps[/url] (доступен ознакомительный фрагмент данной книги)
P.S. Создал топик на форуме radiokot [url=https://radiokot.ru/forum/viewtopic.php?f=62&t=159529]Форт и Ардуино (и не только)[/url] В топике был задан вопрос "ЗАЧЕМ учить Форт?" Подумал и правда ЗАЧЕМ? :D одно из мнений из i-net безотносительно Форта [url=https://toster.ru/q/556753]Зачем изучать несколько языков программирования(c++, java)?[/url]
|
|
|
|
Добавлено: Чт дек 20, 2018 01:37 |
|
|
|
|
|
Заголовок сообщения: |
Re: Изучите Форт за пять минут. |
|
|
|
|
|
Добавлено: Сб ноя 03, 2018 14:02 |
|
|
|
|
|
Заголовок сообщения: |
Re: Изучите Форт за пять минут. |
|
|
diver писал(а): мануал по qforth для MARC4 - вот то точно было "форт за 5 минут" ))) MARC4 4-Bit Microcontroller Programmer's Guide.pdf или Programming easy qForth, что был описан в журнальной статье Atmel?
[quote="diver"]мануал по qforth для MARC4 - вот то точно было "форт за 5 минут" )))[/quote] [url=https://en.wikichip.org/w/images/4/44/MARC4_4-bit_Microcontrollers_Programmer%27s_Guide.pdf]MARC4 4-Bit Microcontroller Programmer's Guide.pdf[/url] :) или [url=https://web.archive.org/web/20061027060234/http://www.atmel.com/journal/documents/issue5/pg46_48_Atmel_5_CodePatch_A.pdf]Programming easy qForth[/url], что был описан в журнальной статье Atmel?
|
|
|
|
Добавлено: Сб ноя 03, 2018 12:58 |
|
|
|
|
|
Заголовок сообщения: |
Re: Изучите Форт за пять минут. |
|
|
мануал по qforth для MARC4 - вот то точно было "форт за 5 минут" )))
мануал по qforth для MARC4 - вот то точно было "форт за 5 минут" )))
|
|
|
|
Добавлено: Сб ноя 03, 2018 11:19 |
|
|
|
|
|
Заголовок сообщения: |
Re: Изучите Форт за пять минут. |
|
|
[url=https://coredump.su/questions/tagged/forth]Вопросы по Форт на coredump.su[/url]
|
|
|
|
Добавлено: Чт ноя 01, 2018 17:28 |
|
|
|
|
|
Заголовок сообщения: |
Re: Изучите Форт за пять минут. |
|
|
Не весть что, при беглом поиске на Github по запросу forth-like printf-like string formatter for ForthКод: printf ( n*x c-addr u -- )
Prints n*x using the format string at c-addr u.
sprintf ( n*x c-addr1 u1 c-addr2 -- c-addr2 u3 )
Prints n*x into buffer c-addr2 using the format string at c-addr1 u. caddr-2 u3 is the resulting string.
The format string contains ordinary characters (except %), which are copied unchanged to the destination buffer, and conversion specifications. Conversion specifications have the following format:
Introductory % character An optional - that specifies left justify An optional 0 that left-pads using 0 instead of space An optional decimal integer value that specifies minimum field width A conversion format specifier
The following format specifiers are available:
% - % c - character n - signed number u - unsigned number dn - double-cell signed number du - double-cell unsigned number s - string (c-addr u)
Examples:
10 s" Joe" s" %s has a %n%% discount!" printf Joe has a 10% discount! ok 10 s" %05n" printf 00010 ok s" spaced" s" %-10s out" printf spaced out ok
P.S. В плане увеличения лаконичности Форт программ, например, в Reda4 IF ... ELSE ... THEN преобразованы в Код: ?? ( ) | IF ?? ( )( ) | IF-ELSE ( ?? )( ) | WHILE ( ?? ) | Un
helpr4.txtГде то видел сокращение SWAP до SWP и OVER до OVR
Не весть что, при беглом поиске на Github [url=https://github.com/search?p=1&q=forth-like+&type=Repositories]по запросу forth-like[/url] :) [url=https://github.com/jkotlinski/forth-strfmt]printf-like string formatter for Forth[/url] [code] printf ( n*x c-addr u -- )
Prints n*x using the format string at c-addr u.
sprintf ( n*x c-addr1 u1 c-addr2 -- c-addr2 u3 )
Prints n*x into buffer c-addr2 using the format string at c-addr1 u. caddr-2 u3 is the resulting string.
The format string contains ordinary characters (except %), which are copied unchanged to the destination buffer, and conversion specifications. Conversion specifications have the following format:
Introductory % character An optional - that specifies left justify An optional 0 that left-pads using 0 instead of space An optional decimal integer value that specifies minimum field width A conversion format specifier
The following format specifiers are available:
% - % c - character n - signed number u - unsigned number dn - double-cell signed number du - double-cell unsigned number s - string (c-addr u)
Examples:
10 s" Joe" s" %s has a %n%% discount!" printf Joe has a 10% discount! ok 10 s" %05n" printf 00010 ok s" spaced" s" %-10s out" printf spaced out ok
[/code]
P.S. В плане увеличения лаконичности Форт программ, например, в Reda4 IF ... ELSE ... THEN преобразованы в [code] ?? ( ) | IF ?? ( )( ) | IF-ELSE ( ?? )( ) | WHILE ( ?? ) | Un [/code] [url=https://github.com/phreda4/reda4/blob/master/doc/helpr4.txt]helpr4.txt[/url] Где то видел сокращение SWAP до SWP и OVER до OVR :)
|
|
|
|
Добавлено: Пт ноя 24, 2017 13:26 |
|
|
|
|
|
Заголовок сообщения: |
Re: Изучите Форт за пять минут. |
|
|
diver писал(а): можно добавить для антуража, что gforth имеет порт даже на Android, с поддержкой 3D графики и прочими няшками В консоли gforth для Андроид исполнил Код: s" minos2/gl-example.fs" included и повращал забавный треугольник на дисплее. GForth Android startP.S. C таким проектом Internet 2.0 кто нибудь "экспериметировал"?
[quote="diver"]можно добавить для антуража, что gforth имеет порт даже на Android, с поддержкой 3D графики и прочими няшками[/quote] В консоли [url=https://net2o.de/Gforth.apk]gforth для Андроид[/url] исполнил [code] s" minos2/gl-example.fs" included[/code] и повращал забавный треугольник на дисплее. :)
[url=https://wiki.forth-ev.de/doku.php/en:projects:gforth-android:start]GForth Android start[/url]
P.S. C таким проектом [url=https://net2o.de/internet-2.0.html]Internet 2.0[/url] кто нибудь "экспериметировал"?
|
|
|
|
Добавлено: Пн окт 23, 2017 17:46 |
|
|
|
|
|
Заголовок сообщения: |
Re: Изучите Форт за пять минут. |
|
|
можно добавить для антуража, что gforth имеет порт даже на Android, с поддержкой 3D графики и прочими няшками
можно добавить для антуража, что gforth имеет порт даже на Android, с поддержкой 3D графики и прочими няшками
|
|
|
|
Добавлено: Ср окт 11, 2017 06:32 |
|
|
|
|
|
Заголовок сообщения: |
Изучите Форт за пять минут. |
|
|
Такая вот пятиминутная "шпаргалка" по Форт языку и другим языкам на основе этой идеи на данном сайте. Код: \ Это комментарий ( Это тоже комментарий, но используется для определяемых слов )
\ --------------------------------- Прекурсор --------------------------------
\ Всё программирование на Форте заключается в манипулировании \ параметрами на стеке. 5 2 3 56 76 23 65 \ ok
\ Эти числа добавляются в стек слева направо .s \ <7> 5 2 3 56 76 23 65 ok
\ В Форте всё - это слова-команды или числа. Слова разделяются любым числом \ пробелов и переходов на новую строку. Длина слова не больше 31 литеры.
\ ---------------------------- Базовая арифметика ----------------------------
\ Арифметика (фактически все ключевые слова требуют данных) - это манипуляция \ данными на стеке. 5 4 + \ ok
\ `.` показывает верхнее значение в стеке: . \ 9 ok
\ Ещё примеры арифметических выражений: 6 7 * . \ 42 ok 1360 23 - . \ 1337 ok 12 12 / . \ 1 ok 13 2 mod . \ 1 ok
99 negate . \ -99 ok -99 abs . \ 99 ok 52 23 max . \ 52 ok 52 23 min . \ 23 ok
\ --------------------------- Манипуляции со стеком ---------------------------
\ Естественно, когда мы работаем со стеком, то используем \ больше полезных методов:
3 dup - \ дублировать верхний элемент в стеке \ (1-й становится эквивалентным 2-му): 3 - 3 2 5 swap / \ поменять местами верхний элемент со 2-м элементом: 5 / 2 6 4 5 rot .s \ сменять по очереди 3-и верхних элемента: 4 5 6 4 0 drop 2 / \ снять верхний элемент (не печатается на экране): 4 / 2 1 2 3 nip .s \ снять второй элемент (подобно исключению элемента): 1 3
\ ------------------ Более продвинутые манипуляции со стеком ------------------
1 2 3 4 tuck \ дублировать верхний елемент стека во вторую позицию: \ 1 2 4 3 4 ok 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 ok
\ Внимание! Обращения к стеку индексируются с нуля.
\ --------------------------- Создание новых слов -----------------------------
\ Определение новых слов через уже известные. Двоеточие `:` переводит Форт \ в режим компиляции выражения, которое заканчивается точкой с запятой `;`. : square ( n -- n ) dup * ; \ ok 5 square . \ 25 ok
\ Мы всегда можем посмотреть, что содержится в слове: see square \ : square dup * ; ok
\ -------------------------------- Зависимости --------------------------------
\ -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 ; \ ok 100 ?>64 \ Больше чем 64! ok
\ Else: : ?>64 ( n -- n ) dup 64 > if ." Больше чем 64!" else ." меньше чем 64!" then ; 100 ?>64 \ Больше чем 64! ok 20 ?>64 \ меньше чем 64! ok
\ ------------------------------------ Циклы -----------------------------------
\ `do` это тоже компилируемое слово. : myloop ( -- ) 5 0 do cr ." Hello!" loop ; \ ok myloop \ Hello! \ Hello! \ Hello! \ Hello! \ Hello! ok
\ `do` предполагает наличие двух чисел на стеке: конечное и начальное число.
\ Мы можем назначить в цикле переменную `i` для значения индекса: : 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` работает подобным образом, за исключением пропуска начального \ и конечного значения индекса цикла. : squares ( n -- ) 0 ?do i square . loop ; \ ok 10 squares \ 0 1 4 9 16 25 36 49 64 81 ok
\ Изменение "шага" цикла проиводится командой `+loop`: : threes ( n n -- ) ?do i . 3 +loop ; \ ok 15 0 threes \ 0 3 6 9 12 ok
\ Запуск бесконечного цикла - `begin` <stuff to do> <flag> `until`: : death ( -- ) begin ." Вы всё ещё здесь?" 0 until ; \ ok
\ ---------------------------- Переменные и память ----------------------------
\ Используйте `variable`, что бы объявить `age` в качестве переменной. 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
\ ---------------------------------- Массивы ----------------------------------
\ Создание массива похоже на объявление переменной, но нам нужно выделить \ больше памяти.
\ Вы можете использовать слова `2 cells allot` для создания массива \ размером 3 элемента: variable mynumbers 2 cells allot \ ok
\ Инициализировать все значения в 0 mynumbers 3 cells erase \ ok
\ В качестве альтернативы мы можем использовать `fill`: mynumbers 3 cells 0 fill
\ или мы можем пропустить все слова выше и инициализировать массив \ нужными значениями: create mynumbers 64 , 9001 , 1337 , \ ok (the last `,` is important!)
\ ... что эквивалентно:
\ Ручная запись значений по индексам ячеек: 64 mynumbers 0 cells + ! \ ok 9001 mynumbers 1 cells + ! \ ok 1337 mynumbers 2 cells + ! \ ok
\ Чтение значений по индексу: 0 cells mynumbers + ? \ 64 ok 1 cells mynumbers + ? \ 9001 ok
\ Мы можем просто сделать собственное слово для манипуляции массивом: : of-arr ( n n -- n ) cells + ; \ ok mynumbers 2 of-arr ? \ 1337 ok
\ Которую тоже можно использовать для записи значений: 20 mynumbers 1 of-arr ! \ ok mynumbers 1 of-arr ? \ 20 ok
\ ------------------------------ Стек возвратов ------------------------------
\ Стек возвратов используется для удержания ссылки, \ когда одно слово запускает другое, например, в цикле.
\ Мы всегда видим это, когда используем `i`, которая возвращает дубль верхнего \ значения стека. `i` это эквивалент `r@`. : myloop ( -- ) 5 0 do r@ . loop ; \ ok
\ Так же как при чтении мы можем добавить ссылку в стек возвратов и удалить её: 5 6 4 >r swap r> .s \ 6 5 4 ok
\ Внимание: так как Форт использует стек возвратов для указателей на слово `>r` \ следует всегда пользоваться `r>`.
\ ---------------- Операции над числами с плавающей точкой --------------------
\ Многие фортовцы стараются избегать использование слов с вещественными числами. 8.3e 0.8e f+ f. \ 9.1 ok
\ Обычно мы просто используем слово 'f', когда обращаемся к вещественным числам: variable myfloatingvar \ ok 4.4e myfloatingvar f! \ ok myfloatingvar f@ f. \ 4.4 ok
\ ---------- В завершение несколько полезных замечаний и слов -----------------
\ Указание несуществующего слова очистит стек. Тем не менее, есть специальное \ слово для этого: clearstack
\ Очистка экрана: page
\ Загрузка форт-файла: s" forthfile.fs" included
\ Вы можете вывести список всех слов словаря Форта (это большой список!): words
\ Выход из Gforth: bye
P.S. Можно идею дополнить и расширить. Наверное, присутствующие несуразности в данном тексте имеет смысл подправить (и в проекте на Github сделать лучший вариант данного текста)
[url=https://learnxinyminutes.com/docs/ru-ru/forth-ru/]Такая вот пятиминутная "шпаргалка" по Форт языку[/url] :) и другим языкам на основе этой идеи на данном сайте. [code] \ Это комментарий ( Это тоже комментарий, но используется для определяемых слов )
\ --------------------------------- Прекурсор --------------------------------
\ Всё программирование на Форте заключается в манипулировании \ параметрами на стеке. 5 2 3 56 76 23 65 \ ok
\ Эти числа добавляются в стек слева направо .s \ <7> 5 2 3 56 76 23 65 ok
\ В Форте всё - это слова-команды или числа. Слова разделяются любым числом \ пробелов и переходов на новую строку. Длина слова не больше 31 литеры.
\ ---------------------------- Базовая арифметика ----------------------------
\ Арифметика (фактически все ключевые слова требуют данных) - это манипуляция \ данными на стеке. 5 4 + \ ok
\ `.` показывает верхнее значение в стеке: . \ 9 ok
\ Ещё примеры арифметических выражений: 6 7 * . \ 42 ok 1360 23 - . \ 1337 ok 12 12 / . \ 1 ok 13 2 mod . \ 1 ok
99 negate . \ -99 ok -99 abs . \ 99 ok 52 23 max . \ 52 ok 52 23 min . \ 23 ok
\ --------------------------- Манипуляции со стеком ---------------------------
\ Естественно, когда мы работаем со стеком, то используем \ больше полезных методов:
3 dup - \ дублировать верхний элемент в стеке \ (1-й становится эквивалентным 2-му): 3 - 3 2 5 swap / \ поменять местами верхний элемент со 2-м элементом: 5 / 2 6 4 5 rot .s \ сменять по очереди 3-и верхних элемента: 4 5 6 4 0 drop 2 / \ снять верхний элемент (не печатается на экране): 4 / 2 1 2 3 nip .s \ снять второй элемент (подобно исключению элемента): 1 3
\ ------------------ Более продвинутые манипуляции со стеком ------------------
1 2 3 4 tuck \ дублировать верхний елемент стека во вторую позицию: \ 1 2 4 3 4 ok 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 ok
\ Внимание! Обращения к стеку индексируются с нуля.
\ --------------------------- Создание новых слов -----------------------------
\ Определение новых слов через уже известные. Двоеточие `:` переводит Форт \ в режим компиляции выражения, которое заканчивается точкой с запятой `;`. : square ( n -- n ) dup * ; \ ok 5 square . \ 25 ok
\ Мы всегда можем посмотреть, что содержится в слове: see square \ : square dup * ; ok
\ -------------------------------- Зависимости --------------------------------
\ -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 ; \ ok 100 ?>64 \ Больше чем 64! ok
\ Else: : ?>64 ( n -- n ) dup 64 > if ." Больше чем 64!" else ." меньше чем 64!" then ; 100 ?>64 \ Больше чем 64! ok 20 ?>64 \ меньше чем 64! ok
\ ------------------------------------ Циклы -----------------------------------
\ `do` это тоже компилируемое слово. : myloop ( -- ) 5 0 do cr ." Hello!" loop ; \ ok myloop \ Hello! \ Hello! \ Hello! \ Hello! \ Hello! ok
\ `do` предполагает наличие двух чисел на стеке: конечное и начальное число.
\ Мы можем назначить в цикле переменную `i` для значения индекса: : 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` работает подобным образом, за исключением пропуска начального \ и конечного значения индекса цикла. : squares ( n -- ) 0 ?do i square . loop ; \ ok 10 squares \ 0 1 4 9 16 25 36 49 64 81 ok
\ Изменение "шага" цикла проиводится командой `+loop`: : threes ( n n -- ) ?do i . 3 +loop ; \ ok 15 0 threes \ 0 3 6 9 12 ok
\ Запуск бесконечного цикла - `begin` <stuff to do> <flag> `until`: : death ( -- ) begin ." Вы всё ещё здесь?" 0 until ; \ ok
\ ---------------------------- Переменные и память ----------------------------
\ Используйте `variable`, что бы объявить `age` в качестве переменной. 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
\ ---------------------------------- Массивы ----------------------------------
\ Создание массива похоже на объявление переменной, но нам нужно выделить \ больше памяти.
\ Вы можете использовать слова `2 cells allot` для создания массива \ размером 3 элемента: variable mynumbers 2 cells allot \ ok
\ Инициализировать все значения в 0 mynumbers 3 cells erase \ ok
\ В качестве альтернативы мы можем использовать `fill`: mynumbers 3 cells 0 fill
\ или мы можем пропустить все слова выше и инициализировать массив \ нужными значениями: create mynumbers 64 , 9001 , 1337 , \ ok (the last `,` is important!)
\ ... что эквивалентно:
\ Ручная запись значений по индексам ячеек: 64 mynumbers 0 cells + ! \ ok 9001 mynumbers 1 cells + ! \ ok 1337 mynumbers 2 cells + ! \ ok
\ Чтение значений по индексу: 0 cells mynumbers + ? \ 64 ok 1 cells mynumbers + ? \ 9001 ok
\ Мы можем просто сделать собственное слово для манипуляции массивом: : of-arr ( n n -- n ) cells + ; \ ok mynumbers 2 of-arr ? \ 1337 ok
\ Которую тоже можно использовать для записи значений: 20 mynumbers 1 of-arr ! \ ok mynumbers 1 of-arr ? \ 20 ok
\ ------------------------------ Стек возвратов ------------------------------
\ Стек возвратов используется для удержания ссылки, \ когда одно слово запускает другое, например, в цикле.
\ Мы всегда видим это, когда используем `i`, которая возвращает дубль верхнего \ значения стека. `i` это эквивалент `r@`. : myloop ( -- ) 5 0 do r@ . loop ; \ ok
\ Так же как при чтении мы можем добавить ссылку в стек возвратов и удалить её: 5 6 4 >r swap r> .s \ 6 5 4 ok
\ Внимание: так как Форт использует стек возвратов для указателей на слово `>r` \ следует всегда пользоваться `r>`.
\ ---------------- Операции над числами с плавающей точкой --------------------
\ Многие фортовцы стараются избегать использование слов с вещественными числами. 8.3e 0.8e f+ f. \ 9.1 ok
\ Обычно мы просто используем слово 'f', когда обращаемся к вещественным числам: variable myfloatingvar \ ok 4.4e myfloatingvar f! \ ok myfloatingvar f@ f. \ 4.4 ok
\ ---------- В завершение несколько полезных замечаний и слов -----------------
\ Указание несуществующего слова очистит стек. Тем не менее, есть специальное \ слово для этого: clearstack
\ Очистка экрана: page
\ Загрузка форт-файла: s" forthfile.fs" included
\ Вы можете вывести список всех слов словаря Форта (это большой список!): words
\ Выход из Gforth: bye [/code]
P.S. Можно идею дополнить и расширить. Наверное, присутствующие несуразности в данном тексте имеет смысл подправить (и в проекте на Github сделать лучший вариант данного текста)
|
|
|
|
Добавлено: Вс окт 08, 2017 02:13 |
|
|
|
|