Forth http://fforum.winglion.ru/ |
|
Forth + Lazarus IDE http://fforum.winglion.ru/viewtopic.php?f=2&t=3102 |
Страница 4 из 6 |
Автор: | mgw [ Вс авг 21, 2016 22:37 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
Hishnik писал(а): Механизм взаимодействия следующий. Программа на Lazarus читает переменные форт-машины и на основании прочитанного выполняет тот или иной метод для заранее подготовленных компонентов. Получается, что форт выполняется в отдельном потоке или как то по другому? Как Lazarus узнает, какие переменные форта надо сканировать? Я интерактивно определяю в форте буфер, например для строки и хочу, что бы на форме динамически отразился QLineEdit и его данные были связаны с только что созданным буфером. Не понимаю, как это синхронизируется, если у форта нет возможности самому создавать графические объекты, типа QLineEdit |
Автор: | Hishnik [ Вт авг 23, 2016 00:45 ] | ||
Заголовок сообщения: | Re: Forth + Lazarus IDE | ||
mgw писал(а): Получается, что форт выполняется в отдельном потоке или как то по другому? Сейчас для исполнения Форта подключен quark.dll в режиме виртуальной машины со скрытым экраном. Стек, память и образ экрана доступны вызывающей программе. Второй вариант - виртуальна машина с шитым кодом, реализованная прямо в Lazarus. В этом случае снижается производительность (что естественно), однако появляется возможность более тесного взаимодействия двух подсистем. Главное неудобство - необходимость дожидаться завершения интерпретации переданной строки в quark.dll. Если там много команд, то они встают в очередь, и начать действия по модификации интерфейса можно только после завершения работы по интерпретации ВСЕЙ строки. С шитым кодом можно автоматически перемежать слова, управляющие интерфейсом, вызовами соответствующих обработчиков (и заодно прокачкой сообщений Windows). mgw писал(а): Как Lazarus узнает, какие переменные форта надо сканировать? Сам и определяет их И заодно слова, создающие компоненты. После выполнения строк вида VARIABLE ACTION_TYPE работает цикл вида (фрагмент): Код: action_type := Forth('ACTION_TYPE @'); id := Forth('COMPONENT_TYPE @'); index := Forth('COMPONENT_INDEX @'); case action_type of 1 : CreateComponent(id); Функция Forth выполняет строку и возвращает число с вершины стека после ее выполнения (и далее сама делает DROP). То есть можно средствами Форта узнать, что он там себе насоздавал. Соответственно, слово BUTTON записывает 1 в action_type, код "кнопка" в COMPONENT_TYPE и т.д. Другие действия (например, смена координат или размеров) - другие коды action_type. Это не универсально, однако именно тот вариант, который я планирую проработать для определенного круга задач. Форт очень удобен в плане быстрой смены алгоритмов, последовательностей команд и т.п., однако визуальные компоненты тоже нужны. Заодно и картинка - набрали текст, нажали F9, текст выполнился на Форте. В левой части экрана изначально ничего не было.
|
Автор: | mgw [ Вт авг 23, 2016 12:24 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
Теперь понятно. Фактически нужен высокоуровневый язык описания форм и действий с ними. Я предпринимал подобную попытку, по изготовлению такой задачи. Тонкий момент: пришлось ввести специальное хард-слово форта, которое насильно останавливает интерпретацию и возвращает управление основной среде (в моём случае С++). Это было своеобразной синхронизацией, гарантирующей что форт закончил вычисления. Еще необходимо хард-слово, DoEvents ( так в VBA оно называется ), что бы иногда передавать управление ОС, для отрисовки своего интерфейса |
Автор: | Hishnik [ Ср авг 24, 2016 00:24 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
mgw писал(а): Фактически нужен высокоуровневый язык описания форм и действий с ними. В целом да. В идеале это описание вида Код: 100 200 SET-XY 70 20 SET-SIZE BUTTON ' MYWORD ASSIGN-ACTION Этот код должен связать кнопку со словом MYWORD. Такой подход может не ограничиваться только визуальными компонентами. Например, влезать внутрь TCP/UDP обмена в целом не надо, а вот описать на Форте последовательность обработки пакетов вполне можно. mgw писал(а): Тонкий момент: пришлось ввести специальное хард-слово форта, которое насильно останавливает интерпретацию и возвращает управление основной среде (в моём случае С++). Это было своеобразной синхронизацией, гарантирующей что форт закончил вычисления. Еще необходимо хард-слово, DoEvents ( так в VBA оно называется ), что бы иногда передавать управление ОС, для отрисовки своего интерфейса Я описал этот механизм в предыдущем сообщении. Идеальный вариант - когда слово органично встроено в код и не требуется его принудительная компиляция. |
Автор: | in4 [ Ср авг 24, 2016 17:18 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
mgw писал(а): Фактически нужен высокоуровневый язык описания форм и действий с ними. Тоже задумывался над этим. Есть желание пообсуждать?
|
Автор: | gudleifr [ Ср авг 24, 2016 17:21 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
in4 писал(а): Есть желание пообсуждать? См. FOBOS.Например, там: http://www.gudleifr.h1.ru/g90.html Из последнего - http://fforum.winglion.ru/viewtopic.php?p=42297#p42297 |
Автор: | Hishnik [ Пт авг 26, 2016 01:23 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
Код: LABEL : R0 0 " 123" SET-LABEL-CAPTION ; : R1 0 " 456" SET-LABEL-CAPTION ; 100 200 SET-XY BUTTON 300 300 SET-XY BUTTON 0 " R0" SET-BUTTON-ACTION 1 " R1" SET-BUTTON-ACTION Итого на форме метка (label) и две кнопки. Нажатие каждой из кнопок устанавливает на метке свою надпись. Это еще один принципиальный момент, который удалось прояснить (спасибо true-grue за идею), с взаимным увязыванием сообщений от компонентов и слов Форта. Если продолжить эту линию, то каждому компоненту можно назначить строку Форта на каждое событие. Как можно видеть, никакого специального слова-синхронизатора не используется. |
Автор: | gudleifr [ Пт авг 26, 2016 11:35 ] | ||
Заголовок сообщения: | Re: Forth + Lazarus IDE | ||
Hishnik писал(а): Код: 100 200 SET-XY BUTTON 300 300 SET-XY BUTTON WIN-API уже имеет "скриптовый язык" для описания подобной фигни - описатель ресурсов/диалогов. Проще написать для него FORTH-оболочку, чем изобретать свой. Код: RESOURSE-RESET 85 229 0 0 HEX 80C800C0 DECIMAL >DIALOG EMPTY! EMPTY! S" Mouse Hook Demo" UNISTR! 8 RESOURSE! S" MS Sans Serif" UNISTR! >CONTROL -1 67 214 7 7 HEX 50000007 DECIMAL S" Window Information" BUTTON-IS -1 8 39 22 21 HEX 50020000 DECIMAL S" Class name:" STATIC-IS 1000 12 139 20 69 HEX 50810880 DECIMAL EDIT-IS -1 8 26 37 33 HEX 50020000 DECIMAL S" Handle:" STATIC-IS 1001 12 77 36 69 HEX 50810880 DECIMAL EDIT-IS -1 8 46 52 13 HEX 50020000 DECIMAL S" Window Proc:" STATIC-IS 1002 12 77 51 69 HEX 50810880 DECIMAL edit-is 1004 14 50 35 159 HEX 50010001 DECIMAL S" &Hook" BUTTON-IS 1005 14 50 50 159 HEX 50010000 DECIMAL S" E&xit" BUTTON-IS DROP Конечно, шестнадцатеричные можно заменить на что-то осмысленное, но мне было лень разбираться. Hishnik писал(а): Это еще один принципиальный момент, который удалось прояснить (спасибо true-grue за идею), с взаимным увязыванием сообщений от компонентов и слов Форта. Если продолжить эту линию, то каждому компоненту можно назначить строку Форта на каждое событие. Как можно видеть, никакого специального слова-синхронизатора не используется. Требуется, только ее скрыли от программиста. Повторю, гораздо проще поместить "акции" в словарь FORTH-машины, ПОТОК которой завязан на обработку событий.Вот пример аналога WORDS для такой машины (звездочками, я, по лени, заменил табуляцию). Мы с коллегой Ethereal как-то подробно обсуждали этот вопрос, но, к сожалению, его "смодерировали" во флуд.
|
Автор: | mgw [ Вс сен 25, 2016 14:31 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
может и не в тему .... Тут провел натурное испытание forth (написан на D asm и может быть подключен в виде DLL) и QtE5 (моя адаптация Qt-5 к языку D). https://vk.com/vk_dlang?z=photo-471951_431046872%2Fwall-471951_1861 https://github.com/MGWL/QtE5 |
Автор: | KPG [ Чт окт 29, 2020 13:54 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
Lazarus ещё используется автором топика? а, то зашёл на форум сайта freepascal.ru и не увидел какого то "применения" Форта + Паскаль в связке с Lazarus. Ну, не обидно ли? P.S. Хотя, какие то Форт на Паскаль, находятся и в проектах на Github. А, то тут уже и из давно открытых и забытых исходников DN (Dos Navigator - оболочка типа Far) почти перенесли под Linux DN2L Ради интереса собрал версию исходников DN 6.40 OSP для Windows (что интересно, собрались без ошибок с помощью Virtual Pascal 2004г. и заработали в Win10) На github опубликован Linux порт Dos Navigator с открытым кодом (обсуждение новости на площадке ЛОР) Топик на форуме NDN - закрытых последних "актуальных" версий DN |
Автор: | Hishnik [ Чт окт 29, 2020 15:00 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
Qt помощнее и лучше поддерживается. |
Автор: | Hishnik [ Пт окт 30, 2020 16:32 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
В целом Lazarus 2.0 поинтереснее. OpenGL улучшили (не падает при попытке изменить размер окна в процессе отрисовки сцены), доступна многопоточная работа. Как и в случае Qt, основной вопрос лежит в плоскости "полезны ли компоненты Lazarus", а Форт выступает инструментом обеспечения интерактивности. |
Автор: | Hishnik [ Сб ноя 07, 2020 04:47 ] | ||
Заголовок сообщения: | Re: Forth + Lazarus IDE | ||
Да, OpenGL + потоки. Код: unit uni_cat_main;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, AsyncProcess, ExtCtrls, OpenGLContext, gl; type { TForm1 } TForm1 = class(TForm) AsyncProcess1: TAsyncProcess; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure GLboxPaint(Sender: TObject); procedure Timer1Timer(Sender: TObject); private GLBox: TOpenGLControl; public end; TForthThread = class(TThread) private fStatusText : string; protected procedure Execute; override; public Constructor Create(CreateSuspended : boolean); end; var Form1: TForm1; ForthThread : TForthThread; red : real; implementation {$R *.lfm} constructor TForthThread.Create(CreateSuspended : boolean); begin inherited Create(CreateSuspended); FreeOnTerminate := True; end; procedure TForthThread.Execute; var newStatus : string; begin while (not Terminated) do begin red := red + 0.01; if (red > 0.99) then red := -1.0; end; end; procedure TForm1.GLboxPaint(Sender: TObject); begin glClearColor(0.27, 0.53, 0.71, 1.0); // Задаем синий фон glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity; glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex3f(red, 1.0, 0.0); glColor3f(0, 1, 0); glVertex3f(-1.0,-1.0, 0.0); glColor3f(0, 0, 1); glVertex3f( 1.0,-1.0, 0.0); glEnd; GLbox.SwapBuffers; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Form1.GLboxPaint(Sender); end; procedure TForm1.FormCreate(Sender: TObject); begin GLbox := TOpenGLControl.Create(Self); GLbox.AutoResizeViewport := true; GLBox.Parent := Self; GLBox.MultiSampling := 4; GLBox.Align := alClient; GLBox.OnPaint := @GLboxPaint; GLBox.invalidate; end; begin ForthThread := TForthThread.Create(True); // This way it doesn't start automatically ForthThread.Start; end.
|
Автор: | Hishnik [ Вс ноя 08, 2020 02:24 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
Ну так что, есть желание восстановить/создать Форт для управления виджетами Lazarus? |
Автор: | Victor__v [ Пн ноя 09, 2020 09:01 ] |
Заголовок сообщения: | Re: Forth + Lazarus IDE |
Эх, а я как дурак через шейдеры треугольник рисую |
Страница 4 из 6 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |