Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 14:52

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Сниппеты для Форт.
СообщениеДобавлено: Пн апр 10, 2023 01:51 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Предлагаю в этом топике постить какие то небольшие примеры Форт кода.

Пример варианта кода для динамических массивов.
Код:
: allocate-array ( n -- addr ) cells allocate throw ;
: free-array ( addr -- ) free throw ;
: copy-array ( src dst n -- )
  0 ?do
    over i cells + @ over i cells + !
    1 cells +loop
  2drop ;

\ : bounds over + swap ;
: fill-array ( addr n value -- )
  rot rot cells bounds do
     dup i !
  1 cells +loop drop ;

: resize-array ( addr n1 n2 -- addr' )
  2dup umin >r allocate-array swap drop 2dup r>
  copy-array
  swap free-array ;

\ Allocate an array with 5 elements
5 allocate-array value my-array

\ Fill the array with some values
1 my-array 0 cells + !
2 my-array 1 cells + !
3 my-array 2 cells + !
4 my-array 3 cells + !
5 my-array 4 cells + !

\ Resize the array to 10 elements
my-array 5 10 resize-array to my-array

\ Fill the new elements with values
6 my-array 5 cells + !
7 my-array 6 cells + !
8 my-array 7 cells + !
9 my-array 8 cells + !
10 my-array 9 cells + !

\ Fill the array with the value 7
my-array 5 7 fill-array
\ my-array 100 dump

\ Free the memory when you're done with the array
my-array free-array


P.S. А вот пример, как представлен лексикон слов для динамических массивов в FFL Car - Cell array (Source)
Описание лексикона слов Car

Общий список модулей библиотеки FFL
Оформлен в виде таблицы

Интересно, что сам проект FFL библиотеки похоже перестал обновляться c 2011г.
(вероятно автор потерял к нему интерес)

Есть, конечно, и такая Wiki для публикации кода Форт-модулей
И ещё одна тоже Wiki площадка https://forth-standard.org/systems
ИзображениеИзображение

FSL на taygeta.com

...
Код:
: sum-array ( addr len -- n )
  0 rot rot 0 do
    dup i cells + @ rot + swap
  loop drop ;

разделив сумму на число отсчётов можно получить среднее арифметическое усреднение,
для мединного усреднения немного больше кода


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Пн апр 10, 2023 16:35 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
В RosettaCode задачи слишком различаются по уровню. Примеры хорошо бы делать по какому-то упорядоченному списку, в котором не будет задач на решение алгоритмических головоломок, а просто "как на Форте можно сделать то-то".


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Пн апр 10, 2023 22:29 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik писал(а):
В RosettaCode задачи слишком различаются по уровню. Примеры хорошо бы делать по какому-то упорядоченному списку, в котором не будет задач на решение алгоритмических головоломок, а просто "как на Форте можно сделать то-то".

Их там, ещё и просто много и если задача вне текущего её понимания для возможного применения в коде,
то и решение представленное на ресурсе может быть не понято и как то условно улучшено/адаптировано как сниппет.

P.S. Может по местному форуму, топики близко подходящие под тему сабжа собирать вместе и/или сделать навигацию по ним.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Пн апр 24, 2023 12:58 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Придумался такой демонстрационный мета-код (проверен в gForth Online)
Код:
: DEF ( c-addr <name> -- )
  find  IF ELSE drop ['] noop  THEN
  CREATE  , 
  DOES> ( -- )
  @  EXECUTE
  ;

: C"" C" 1." ;

: 1. cr 123  .  ;   

C"" DEF AAA
AAA \ отобразит  123


т.е. находимое слово для исполнения находится в окружении контекста его использования
и "место' его рабочего кода при этом может быть раcположено почти "произвольно" (вроде так)

P.S. Список слов gForth

Ещё экспериметальный мета-код для Форт (проверялся в gForth Online 0.7.3)
Код:
: SAY ." HELLO" ;
: END ." BYE" ;

\ : sss [ postpone , ] ; see sss cr

: MY-WORD  create  postpone ,  \ postpone execute
;  immediate

MY-WORD AAA  \ see MY-WORD cr

see AAA \ опознаёт как переменную
' SAY AAA !
AAA @ execute cr \ здесь работает
' END AAA !
AAA @ execute cr \ здесь работает

\ здесь не работает и непонятно почему
: TEST ( -- ) AAA @ execute  ;

TEST


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вт апр 25, 2023 00:10 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
KPG писал(а):
\ здесь не работает и непонятно почему
: TEST ( -- ) AAA @ execute  ;

Оно же при работе запускает обработку TIB, который имеется в этот момент?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вт май 02, 2023 19:49 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Код:
: my-div   ( n1 n2 -- n3 )
  DUP 0= IF  \ проверяем, не является ли делитель 0
    ." Error: division by zero." CR
    0   \  флаг ошибки
  THEN
  /  \ выполняем деление
;
10 2 ' my-div catch throw .
10 0 ' my-div catch throw .


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вт май 02, 2023 19:58 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Не лучше ли это прямо в деление и встроить?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вт май 02, 2023 20:04 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik писал(а):
Не лучше ли это прямо в деление и встроить?

Оно, вроде, в основном и встроено, а данный снипет иллюстрирует использование и catch throw механизма обработки ошибок.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вт май 02, 2023 20:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Catch throw хорош для серверных систем, которые должны быть устойчивы к таким ошибкам. Для десктопного ПО нет большой разницы, кто именно сгенерирует сообщение об ошибке, поскольку пользователю все равно что-то нужно будет сделать. А объем кода растет.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Пн май 22, 2023 17:46 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Код:
create counter 0 ,
  does> ( -- n )
     dup @ dup 1+ rot !
  ;
  counter .
  counter .
  counter .

Код:
create counter 0 ,
  does> ( u -- n )
     dup @  rot rot +!
  ;
  1 counter .
  -1 counter .
  2 counter .


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вс май 28, 2023 14:22 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Код:
: new-word CREATE , DOES> @ EXECUTE  ;
:NONAME DUP + ;  new-word  DOUBLE 
2 DOUBLE .


Код:
: compile-word ( xt -- )
  ['] execute compile,
  DOES> @ execute ;
 
   CREATE my-var compile-word
   ' variable my-var ASD
  see ASD
  123 ASD ! ASD @ .


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вс июл 02, 2023 10:41 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Код:
: sum ( n -- n' )  \ сумма чисел от 1 до N
  DUP IF
  0
  BEGIN
    OVER +
    SWAP 1 -
    ?DUP
  WHILE 
    SWAP
  REPEAT
  THEN ;
 
1000 sum .

: 1000sum [ 1000 sum ] LITERAL ;
1000sum .


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вс июл 02, 2023 12:09 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Код:
: sum
dup if
    0 swap 0 do
      i +
    loop
  then
;

1000 sum .   


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вс июл 02, 2023 12:26 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Hishnik
Последнее число не добавляется в приведённом тобой примере.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Сниппеты для Форт.
СообщениеДобавлено: Вс июл 02, 2023 12:33 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Код:
: sum
  dup if
    0 swap[b] 1 + 1 [/b]do
      i +
    loop
  then
;

1000 sum .   


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB