Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
harmless писал(а): Тут простой вывод из стека заменен на некий параметризованный на подобие printf() в Си и два слова "gtk{" и "}gtk" заменены одним делающим все за один "присест"?
да.
[quote="harmless"]Тут простой вывод из стека заменен на некий параметризованный на подобие printf() в Си и два слова "gtk{" и "}gtk" заменены одним делающим все за один "присест"?[/quote]
да.
|
|
|
|
Добавлено: Пт май 29, 2009 15:28 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
harmless писал(а): 2. Форт может работать без операционной системы, так? Его зашивают в ПЗУ устройства и он загружается при запуске? Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал. В обычном случае: windows/linux, драйвер для устройства, софт для работы с устройством. Но дело в том, что использоваться он (компьютер) будет по сути только для вывода информации и настройке приемника. И желательно даже, чтобы операционная система была при этом недоступна. А реально ли сделать так: драйвера для устройства на форте, софт на форте? Или для этого получается нужна некоторая форт-ос?
посмотрите в сторону OPENBOOT однако сразу скажу, что на форуме особых знатоков его не имеется.
С другой стороны, если у вас нет необходимости иметь кучу драйверов, лучше взять какую-нибудь маленькую форт-систему, переписать FVM под нужную платформу (это около 30-60 ассемблерных кусочков длиной от нескольких ассемблерных инструкций до 2-3 десятков) и "раскручивать" уже ее.
[quote="harmless"]2. Форт может работать без операционной системы, так? Его зашивают в ПЗУ устройства и он загружается при запуске? Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал. В обычном случае: windows/linux, драйвер для устройства, софт для работы с устройством. Но дело в том, что использоваться он (компьютер) будет по сути только для вывода информации и настройке приемника. И желательно даже, чтобы операционная система была при этом недоступна. А реально ли сделать так: драйвера для устройства на форте, софт на форте? Или для этого получается нужна некоторая форт-ос?[/quote]
посмотрите в сторону [url=http://en.wikipedia.org/wiki/Open_Firmware]OPENBOOT[/url] однако сразу скажу, что на форуме особых знатоков его не имеется.
С другой стороны, если у вас нет необходимости иметь кучу драйверов, лучше взять какую-нибудь маленькую форт-систему, переписать FVM под нужную платформу (это около 30-60 ассемблерных кусочков длиной от нескольких ассемблерных инструкций до 2-3 десятков) и "раскручивать" уже ее.
|
|
|
|
Добавлено: Пт май 29, 2009 15:00 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Цитата: Если я не ошибаюсь "настоящих" коллбэков нет, поэтому для сложной gui это может быть не очень хороший выбор, хотя подход забавный. Насчет callback'ов надо будет почитать, ну а сложность gui не слишком лично для меня принципиальна, по работе чаще всего приходится делать довольно простые приложения. Главное чтоб переносились из одной операционной системы в другую с минимальными модификациями. Начальство наконец осознало проблемы рождаемые привязанностью к определенной платформе, когда весь рабочий софт под win, заказчик требует чтобы все работало под linux, а помимо прочего есть программы ни под чем кроме dos'а не работающие. К примеру сейчас из анналов истории у нас пытаются извлечь проблемно-ориентированный язык, написанный черт его знает когда и черт знает на чем, в связи с чем кстати и возник интерес к форту. Цитата: Родные биндинги к gtk делать -- не сложно, а если взять тот же cfg файл от gtk-server, то можно сразу сгенерить слова-врапперы к gtk api, и тем самым избежать лишних прослоек.
Родные биндинги - это как раз идеальный вариант, если со временем к этому придет - будет просто прекрасно. Вообще GTK+ вещь очень интересная.
И на последок один вопрос: правильно ли я понял в чем различия следующих двух участков кода?
Код: : attach ( bot top right left widget table -- ) gtk{ ." gtk_table_attach_defaults " . . . . . . }gtk ; и Код: : attach ( bot top right left widget table -- ) " gtk_table_attach_defaults {n} {n} {n} {n} {n} {n}" gtk ;
Тут простой вывод из стека заменен на некий параметризованный на подобие printf() в Си и два слова "gtk{" и "}gtk" заменены одним делающим все за один "присест"?
[quote]Если я не ошибаюсь "настоящих" коллбэков нет, поэтому для сложной gui это может быть не очень хороший выбор, хотя подход забавный. [/quote] Насчет callback'ов надо будет почитать, ну а сложность gui не слишком лично для меня принципиальна, по работе чаще всего приходится делать довольно простые приложения. Главное чтоб переносились из одной операционной системы в другую с минимальными модификациями. Начальство наконец осознало проблемы рождаемые привязанностью к определенной платформе, когда весь рабочий софт под win, заказчик требует чтобы все работало под linux, а помимо прочего есть программы ни под чем кроме dos'а не работающие. К примеру сейчас из анналов истории у нас пытаются извлечь проблемно-ориентированный язык, написанный черт его знает когда и черт знает на чем, в связи с чем кстати и возник интерес к форту.
[quote]Родные биндинги к gtk делать -- не сложно, а если взять тот же cfg файл от gtk-server, то можно сразу сгенерить слова-врапперы к gtk api, и тем самым избежать лишних прослоек. [/quote]
Родные биндинги - это как раз идеальный вариант, если со временем к этому придет - будет просто прекрасно. Вообще GTK+ вещь очень интересная.
И на последок один вопрос: правильно ли я понял в чем различия следующих двух участков кода?
[code]: attach ( bot top right left widget table -- ) gtk{ ." gtk_table_attach_defaults " . . . . . . }gtk ; [/code] и [code]: attach ( bot top right left widget table -- ) " gtk_table_attach_defaults {n} {n} {n} {n} {n} {n}" gtk ;[/code]
Тут простой вывод из стека заменен на некий параметризованный на подобие printf() в Си и два слова "gtk{" и "}gtk" заменены одним делающим все за один "присест"?
|
|
|
|
Добавлено: Пт май 29, 2009 14:57 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
harmless писал(а): 1. У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру?
обычно делают сравнительно стандартный. по крайней мере пока кроссплатформенного не существует.
Впрочем, ассемблер не очень хорошая в Форте штука (точнее очень ограниченно нужная) - гораздо лучше создать нужные примитивы на внешнем ассемблере и дальше все уже разрешать только на высоком уровне.
[quote="harmless"]1. У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру? [/quote]
обычно делают сравнительно стандартный. по крайней мере пока кроссплатформенного не существует.
Впрочем, ассемблер не очень хорошая в Форте штука (точнее очень ограниченно нужная) - гораздо лучше создать нужные примитивы на внешнем ассемблере и дальше все уже разрешать только на высоком уровне.
|
|
|
|
Добавлено: Пт май 29, 2009 14:42 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
quick and dirty перевод на spf/linux
Для windows надо ввод/вывод заменить на ReadSocketLine/WriteSocketLine
Если я не ошибаюсь "настоящих" коллбэков нет, поэтому для сложной gui это может быть не очень хороший выбор, хотя подход забавный.
Родные биндинги к gtk делать -- не сложно, а если взять тот же cfg файл от gtk-server, то можно сразу сгенерить слова-врапперы к gtk api, и тем самым избежать лишних прослоек.
<pre>
\ Sample gtk application using gtk-server
REQUIRE ConnectHost ~ygrek/lib/linux/sockets.f
REQUIRE STYPE ~ac/lib/str5.f
REQUIRE CASE-INS lib/ext/caseins.f
\ sh gtk-server -tcp=localhost:5000 -detach
0 value handle
create buf 256 allot
: read
buf 1+ 255 handle read-line abort" GTK read error" drop
buf c! ;
: gtk ( s -- ) H-STDOUT >R handle TO H-STDOUT STYPE R> TO H-STDOUT read ;
: result ( -- x, evaluate gtk-server response )
buf count evaluate ;
: init ( -- , init connection with gtk-server)
s" localhost" 5000 ConnectHost THROW to handle
" gtk_init NULL NULL" gtk ;
: show ( widget -- ) " gtk_widget_show {n}" gtk ;
: window" ( "title" -- win )
" gtk_window_new 0" gtk result DUP
[char] " parse ROT
" gtk_window_set_title {n} {s}" gtk ;
: table ( homogeneous colums rows -- widget )
" gtk_table_new {n} {n} {n}" gtk result ;
: add ( widget container -- )
" gtk_container_add {n} {n}" gtk result ;
: label" ( "label" -- widget )
[char] " parse " gtk_label_new {''}{s}{''}" gtk result ;
: attach ( bot top right left widget table -- )
" gtk_table_attach_defaults {n} {n} {n} {n} {n} {n}" gtk ;
: button" ( "name" -- widget )
[char] " parse " gtk_button_new_with_label {''}{s}{''}" gtk result ;
: iteration ( -- , perform mainloop iteration )
" gtk_main_iteration" gtk ;
: check ( -- widget , check for activity )
" gtk_server_callback 0" gtk result ;
: done ( -- , disconnect from gtk-server )
" gtk_server_exit" gtk ;
init
window" title" constant win
1 30 30 table constant tab
tab win add
label" Hello world" constant lab
7 3 29 1 lab tab attach
button" exit" constant but
button" nothing" constant but0
27 23 28 20 but tab attach
lab show but show tab show win show
: loop begin iteration check but = until done bye ;
loop
</pre>
quick and dirty перевод на spf/linux
Для windows надо ввод/вывод заменить на ReadSocketLine/WriteSocketLine
Если я не ошибаюсь "настоящих" коллбэков нет, поэтому для сложной gui это может быть не очень хороший выбор, хотя подход забавный.
Родные биндинги к gtk делать -- не сложно, а если взять тот же cfg файл от gtk-server, то можно сразу сгенерить слова-врапперы к gtk api, и тем самым избежать лишних прослоек.
<pre>
[color=chocolate]\ Sample gtk application using gtk-server [/color]
[color=darkblue]REQUIRE[/color] [color=darkblue]ConnectHost[/color] [color=limegreen]~ygrek/lib/linux/sockets.f[/color]
[color=darkblue]REQUIRE[/color] [color=darkblue]STYPE[/color] [color=limegreen]~ac/lib/str5.f[/color]
[color=darkblue]REQUIRE[/color] [color=darkblue]CASE-INS[/color] [color=limegreen]lib/ext/caseins.f[/color]
[color=chocolate]\ sh gtk-server -tcp=localhost:5000 -detach [/color]
[color=limegreen]0[/color] [color=darkblue]value[/color] [color=darkblue]handle[/color]
[color=darkblue]create[/color] [color=darkblue]buf[/color] [color=limegreen]256[/color] [color=darkblue]allot[/color]
[color=darkblue]:[/color] [color=darkblue]read[/color]
buf [color=darkblue]1+[/color] [color=limegreen]255[/color] handle [color=darkblue]read-line[/color] [color=darkblue]abort" [/color][color=blue]GTK read error[/color][color=darkblue]"[/color] [color=darkblue]drop[/color]
buf [color=darkblue]c![/color][color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]gtk[/color][color=chocolate] ( s -- )[/color] H-STDOUT [color=darkblue]>R[/color] handle [color=darkblue]TO[/color] H-STDOUT STYPE [color=darkblue]R>[/color] [color=darkblue]TO[/color] H-STDOUT read[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]result[/color][color=chocolate] ( -- x, evaluate gtk-server response )[/color]
buf [color=darkblue]count[/color] [color=darkblue]evaluate[/color][color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]init[/color][color=chocolate] ( -- , init connection with gtk-server)[/color]
[color=darkblue]s" [/color][color=blue]localhost[/color][color=darkblue]"[/color] [color=limegreen]5000[/color] ConnectHost [color=darkblue]THROW[/color] [color=darkblue]to[/color] handle
[color=darkblue] " [/color][color=blue]gtk_init NULL NULL[/color][color=darkblue]"[/color] gtk[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]show[/color][color=chocolate] ( widget -- )[/color][color=darkblue] " [/color][color=blue]gtk_widget_show {n}[/color][color=darkblue]"[/color] gtk[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]window"[/color][color=chocolate] ( "title" -- win )[/color]
[color=darkblue] " [/color][color=blue]gtk_window_new 0[/color][color=darkblue]"[/color] gtk result [color=darkblue]DUP[/color]
[color=deeppink][char][/color] [color=blue]"[/color] [color=darkblue]parse[/color] [color=darkblue]ROT[/color]
[color=darkblue] " [/color][color=blue]gtk_window_set_title {n} {s}[/color][color=darkblue]"[/color] gtk[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]table[/color][color=chocolate] ( homogeneous colums rows -- widget )[/color]
[color=darkblue] " [/color][color=blue]gtk_table_new {n} {n} {n}[/color][color=darkblue]"[/color] gtk result[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]add[/color][color=chocolate] ( widget container -- )[/color]
[color=darkblue] " [/color][color=blue]gtk_container_add {n} {n}[/color][color=darkblue]"[/color] gtk result[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]label"[/color][color=chocolate] ( "label" -- widget )[/color]
[color=deeppink][char][/color] [color=blue]"[/color] [color=darkblue]parse[/color][color=darkblue] " [/color][color=blue]gtk_label_new {''}{s}{''}[/color][color=darkblue]"[/color] gtk result[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]attach[/color][color=chocolate] ( bot top right left widget table -- )[/color]
[color=darkblue] " [/color][color=blue]gtk_table_attach_defaults {n} {n} {n} {n} {n} {n}[/color][color=darkblue]"[/color] gtk[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]button"[/color][color=chocolate] ( "name" -- widget )[/color]
[color=deeppink][char][/color] [color=blue]"[/color] [color=darkblue]parse[/color][color=darkblue] " [/color][color=blue]gtk_button_new_with_label {''}{s}{''}[/color][color=darkblue]"[/color] gtk result[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]iteration[/color][color=chocolate] ( -- , perform mainloop iteration )[/color]
[color=darkblue] " [/color][color=blue]gtk_main_iteration[/color][color=darkblue]"[/color] gtk[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]check[/color][color=chocolate] ( -- widget , check for activity )[/color]
[color=darkblue] " [/color][color=blue]gtk_server_callback 0[/color][color=darkblue]"[/color] gtk result[color=darkblue] ;[/color]
[color=darkblue]:[/color] [color=darkblue]done[/color][color=chocolate] ( -- , disconnect from gtk-server )[/color]
[color=darkblue] " [/color][color=blue]gtk_server_exit[/color][color=darkblue]"[/color] gtk[color=darkblue] ;[/color]
init
[color=darkblue]window" [/color][color=blue]title[/color][color=darkblue]"[/color] [color=darkblue]constant[/color] [color=darkblue]win[/color]
[color=limegreen]1[/color] [color=limegreen]30[/color] [color=limegreen]30[/color] table [color=darkblue]constant[/color] [color=darkblue]tab[/color]
tab win add
[color=darkblue]label" [/color][color=blue]Hello world[/color][color=darkblue]"[/color] [color=darkblue]constant[/color] [color=darkblue]lab[/color]
[color=limegreen]7[/color] [color=limegreen]3[/color] [color=limegreen]29[/color] [color=limegreen]1[/color] lab tab attach
[color=darkblue]button" [/color][color=blue]exit[/color][color=darkblue]"[/color] [color=darkblue]constant[/color] [color=darkblue]but[/color]
[color=darkblue]button" [/color][color=blue]nothing[/color][color=darkblue]"[/color] [color=darkblue]constant[/color] [color=darkblue]but0[/color]
[color=limegreen]27[/color] [color=limegreen]23[/color] [color=limegreen]28[/color] [color=limegreen]20[/color] but tab attach
lab show but show tab show win show
[color=darkblue]:[/color] [color=darkblue]loop[/color] [color=deeppink]begin[/color] iteration check but [color=darkblue]=[/color] [color=deeppink]until[/color] done [color=darkblue]bye[/color][color=darkblue] ;[/color]
loop
</pre>
|
|
|
|
Добавлено: Пт май 29, 2009 12:33 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Михаил, спасибо большое за ответы.
Цитата: Под виндой не удалось загрузить.
Это к сожалению единственный пример который удалось найти, он исключительно для unix/linux. Хотя адаптация под windows на первый взгляд кажется не сложной, но это на первый взгляд конечно же.
Код: sh gtk-server -tcp=localhost:5000 -detach Выглядит просто как вызов внешней программы, видимо необходимо заменить на аналогичный в sp или gforth под win. А можно думаю и просто bat файлом организовать. Код: gtk-server -tcp=localhost:5000 -detach programm.exe Запустит в фоне сервер с которым программа будет общаться через 5000 порт по tcp, а в конце вызовет done и сервер благополучно выгрузится из памяти. Код: : done ( -- , disconnect from gtk-server ) gtk{ ." gtk_server_exit" }gtk ;
Помимо tcp, поддерживаются еще STDIN, FIFO и UDP.
Как только будет достаточно опыта попробую разобраться. Ну и может кто-нибудь еще заинтересуется. Вещь весьма интересная, и переносимость хорошая получается, на любой win/linux/mac платформе будет один и тот же gtk-api использоваться. После того, как на работе переносили здоровый аппаратно-программный комплекс под linux, причем весьма специфический, появилось стойкое желание заранее продумывать подобные варианты.
Михаил, спасибо большое за ответы.
[quote]Под виндой не удалось загрузить.[/quote]
Это к сожалению единственный пример который удалось найти, он исключительно для unix/linux. Хотя адаптация под windows на первый взгляд кажется не сложной, но это на первый взгляд конечно же.
[code]sh gtk-server -tcp=localhost:5000 -detach [/code] Выглядит просто как вызов внешней программы, видимо необходимо заменить на аналогичный в sp или gforth под win. А можно думаю и просто bat файлом организовать. [code]gtk-server -tcp=localhost:5000 -detach programm.exe[/code] Запустит в фоне сервер с которым программа будет общаться через 5000 порт по tcp, а в конце вызовет done и сервер благополучно выгрузится из памяти. [code]: done ( -- , disconnect from gtk-server ) gtk{ ." gtk_server_exit" }gtk ; [/code]
Помимо tcp, поддерживаются еще STDIN, FIFO и UDP.
Как только будет достаточно опыта попробую разобраться. Ну и может кто-нибудь еще заинтересуется. Вещь весьма интересная, и переносимость хорошая получается, на любой win/linux/mac платформе будет один и тот же gtk-api использоваться. После того, как на работе переносили здоровый аппаратно-программный комплекс под linux, причем весьма специфический, появилось стойкое желание заранее продумывать подобные варианты.
|
|
|
|
Добавлено: Пт май 29, 2009 12:03 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
harmless писал(а): У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру? Ассемблер есть ассемблер. Генерит нативный код. Может тебя смущает то, что в \arch\386\asm.fs не используется "C," для генерации кода(только ",") . Я тоже этого не понял. Я не использую gforth. Здесь, почти все, сидят на СПФ http://spf.sf.net . harmless писал(а): Форт может работать без операционной системы, так? Как и любой интерпретатор. Однако, Форт легче приспособить к новой среде базирования, тат как он проще устроен. harmless писал(а): Его зашивают в ПЗУ устройства и он загружается при запуске? Бывает такое. harmless писал(а): Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал. Я делал распределенные форт-системы. Часть форт-системы расположена на персоналке а часть на контроллере. Для MSP http://fpauk.narod.ru/spmfor.1.rar harmless писал(а): А реально ли сделать так: драйвера для устройства на форте, софт на форте? Все реально. Форт-технология позволяет обходится необходимым минимумом. Для создания программ для работы вне форт-системы используется целевой компилятор. harmless писал(а): Пример кода:
Под виндой не удалось загрузить.
[quote="harmless"]У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру?[/quote]
Ассемблер есть ассемблер. Генерит нативный код. Может тебя смущает то, что в \arch\386\asm.fs не используется "C," для генерации кода(только ",") . Я тоже этого не понял. Я не использую gforth. Здесь, почти все, сидят на СПФ http://spf.sf.net .
[quote="harmless"]Форт может работать без операционной системы, так? [/quote]
Как и любой интерпретатор. Однако, Форт легче приспособить к новой среде базирования, тат как он проще устроен.
[quote="harmless"]Его зашивают в ПЗУ устройства и он загружается при запуске?[/quote]
Бывает такое.
[quote="harmless"]Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал.[/quote]
Я делал распределенные форт-системы. Часть форт-системы расположена на персоналке а часть на контроллере. Для MSP http://fpauk.narod.ru/spmfor.1.rar [quote="harmless"]А реально ли сделать так: драйвера для устройства на форте, софт на форте? [/quote]
Все реально. Форт-технология позволяет обходится необходимым минимумом. Для создания программ для работы вне форт-системы используется целевой компилятор.
[quote="harmless"]Пример кода: [/quote]
Под виндой не удалось загрузить.
|
|
|
|
Добавлено: Пт май 29, 2009 09:54 |
|
|
|
|
|
Заголовок сообщения: |
Несколько общих вопросов. |
|
|
Здравствуйте, уважаемые участники форума!
Фортом заинтересовался сравнительно недавно, пока время провожу в песочнице, играясь интерпретатором. Лучший способ научиться - это создать реальное, действующие приложение. Появилась мысль, в свободное от работы время так сказать "дублировать" приложения, создаваемые на работе. И при этом полностью соблюсти ТЗ и прочие особенности, для пущего реализма. В связи с чем возникло несколько вопросов, пока естественно не в реализации, а на самом общем уровне.
1. У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру?
2. Форт может работать без операционной системы, так? Его зашивают в ПЗУ устройства и он загружается при запуске? Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал. В обычном случае: windows/linux, драйвер для устройства, софт для работы с устройством. Но дело в том, что использоваться он (компьютер) будет по сути только для вывода информации и настройке приемника. И желательно даже, чтобы операционная система была при этом недоступна. А реально ли сделать так: драйвера для устройства на форте, софт на форте? Или для этого получается нужна некоторая форт-ос? И помимо драйвера устройства потребуется драйвера для видео и всего прочего?
3. Кто-нибудь пробовал использовать gforth и GTK server? Вопрос с gui и кросс-платформой стоит довольно остро. Если использовать не доводилось, посмотрите пожалуйста и выскажите свое мнение:
http://www.turtle.dds.nl/gtk-server/intro.html
http://www.gtk.org/features.html
Пример кода:
Код: #! /usr/bin/env gforth-0.6.2 \ Sample gtk application using gtk-server
require unix/socket.fs vocabulary gui also gui definitions
sh gtk-server -tcp=localhost:5000 -detach
0 value handle create buf 256 allot
: gtk{ ( -- , send subsequent output to gtk-server) handle to outfile-id ;
: }gtk ( -- , finish output to gtk-server, receive response) cr stdout to outfile-id buf 1+ 255 handle read-line abort" GTK read error" drop buf c! ;
: gtkres ( -- x, evaluate gtk-server response ) buf count evaluate ;
: s ( "delimiter" "string" -- , compile string with strange delimiter) char parse postpone sliteral ; immediate compile-only
: init ( -- , init connection with gtk-server) s" localhost" 5000 open-socket to handle gtk{ ." gtk_init NULL NULL" }gtk ;
: show ( widget -- ) gtk{ ." gtk_widget_show " . }gtk ;
: window" ( "title" -- win ) gtk{ ." gtk_window_new 0" }gtk gtkres gtk{ ." gtk_window_set_title " dup . [char] " parse type }gtk ;
: table ( homogeneous colums rows -- widget ) gtk{ ." gtk_table_new " . . . }gtk gtkres ;
: add ( widget container -- ) gtk{ ." gtk_container_add " . . }gtk ;
: label" ( "label" -- widget ) gtk{ s ' gtk_label_new "' type [char] " parse type [char] " emit }gtk gtkres ;
: attach ( bot top right left widget table -- ) gtk{ ." gtk_table_attach_defaults " . . . . . . }gtk ;
: button" ( "name" -- widget ) gtk{ s ' gtk_button_new_with_label "' type [char] " parse type [char] " emit }gtk gtkres ;
: iteration ( -- , perform mainloop iteration ) gtk{ ." gtk_main_iteration" }gtk ;
: check ( -- widget , check for activity ) gtk{ ." gtk_server_callback 0" }gtk gtkres ;
: done ( -- , disconnect from gtk-server ) gtk{ ." gtk_server_exit" }gtk ;
init window" title" constant win 1 30 30 table constant tab tab win add label" Hello world" constant lab 7 3 29 1 lab tab attach button" exit" constant but button" nothing" constant but0 27 23 28 20 but tab attach lab show but show tab show win show : loop begin iteration check but = until done bye ; loop
P.S.: Не подумайте, что решил взяться за все это сразу и одновременно, просто хочется понять в каком направлении стоит начинать копать.
Здравствуйте, уважаемые участники форума!
Фортом заинтересовался сравнительно недавно, пока время провожу в песочнице, играясь интерпретатором. Лучший способ научиться - это создать реальное, действующие приложение. Появилась мысль, в свободное от работы время так сказать "дублировать" приложения, создаваемые на работе. И при этом полностью соблюсти ТЗ и прочие особенности, для пущего реализма. В связи с чем возникло несколько вопросов, пока естественно не в реализации, а на самом общем уровне.
1. У форта ассемблер свой, специфический, рассчитаный на некий виртуальный форт-процессор? Или стандартный, под обычную х86 архитектуру?
2. Форт может работать без операционной системы, так? Его зашивают в ПЗУ устройства и он загружается при запуске? Предположим у нас есть простенький компьютер, к которому подключено устройство, к примеру gps приемник, и компьютер при этом используется просто как терминал. В обычном случае: windows/linux, драйвер для устройства, софт для работы с устройством. Но дело в том, что использоваться он (компьютер) будет по сути только для вывода информации и настройке приемника. И желательно даже, чтобы операционная система была при этом недоступна. А реально ли сделать так: драйвера для устройства на форте, софт на форте? Или для этого получается нужна некоторая форт-ос? И помимо драйвера устройства потребуется драйвера для видео и всего прочего?
3. Кто-нибудь пробовал использовать gforth и GTK server? Вопрос с gui и кросс-платформой стоит довольно остро. Если использовать не доводилось, посмотрите пожалуйста и выскажите свое мнение:
[url]http://www.turtle.dds.nl/gtk-server/intro.html[/url]
[url]http://www.gtk.org/features.html[/url]
Пример кода:
[code] #! /usr/bin/env gforth-0.6.2 \ Sample gtk application using gtk-server
require unix/socket.fs vocabulary gui also gui definitions
sh gtk-server -tcp=localhost:5000 -detach
0 value handle create buf 256 allot
: gtk{ ( -- , send subsequent output to gtk-server) handle to outfile-id ;
: }gtk ( -- , finish output to gtk-server, receive response) cr stdout to outfile-id buf 1+ 255 handle read-line abort" GTK read error" drop buf c! ;
: gtkres ( -- x, evaluate gtk-server response ) buf count evaluate ;
: s ( "delimiter" "string" -- , compile string with strange delimiter) char parse postpone sliteral ; immediate compile-only
: init ( -- , init connection with gtk-server) s" localhost" 5000 open-socket to handle gtk{ ." gtk_init NULL NULL" }gtk ;
: show ( widget -- ) gtk{ ." gtk_widget_show " . }gtk ;
: window" ( "title" -- win ) gtk{ ." gtk_window_new 0" }gtk gtkres gtk{ ." gtk_window_set_title " dup . [char] " parse type }gtk ;
: table ( homogeneous colums rows -- widget ) gtk{ ." gtk_table_new " . . . }gtk gtkres ;
: add ( widget container -- ) gtk{ ." gtk_container_add " . . }gtk ;
: label" ( "label" -- widget ) gtk{ s ' gtk_label_new "' type [char] " parse type [char] " emit }gtk gtkres ;
: attach ( bot top right left widget table -- ) gtk{ ." gtk_table_attach_defaults " . . . . . . }gtk ;
: button" ( "name" -- widget ) gtk{ s ' gtk_button_new_with_label "' type [char] " parse type [char] " emit }gtk gtkres ;
: iteration ( -- , perform mainloop iteration ) gtk{ ." gtk_main_iteration" }gtk ;
: check ( -- widget , check for activity ) gtk{ ." gtk_server_callback 0" }gtk gtkres ;
: done ( -- , disconnect from gtk-server ) gtk{ ." gtk_server_exit" }gtk ;
init window" title" constant win 1 30 30 table constant tab tab win add label" Hello world" constant lab 7 3 29 1 lab tab attach button" exit" constant but button" nothing" constant but0 27 23 28 20 but tab attach lab show but show tab show win show : loop begin iteration check but = until done bye ; loop [/code]
P.S.: Не подумайте, что решил взяться за все это сразу и одновременно, просто хочется понять в каком направлении стоит начинать копать.
|
|
|
|
Добавлено: Чт май 28, 2009 17:50 |
|
|
|
|