Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 03:00

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Консольный Тетрис для SPF4
СообщениеДобавлено: Пн фев 17, 2014 17:06 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
Консольный Тетрис для запуска в SPF4 (оригинал из примеров системы Win32Forth)
Код:
\ tt.pfe        Tetris for terminals, redone in ANSI-Forth.
\               Written 05Apr94 by Dirk Uwe Zoller,
\                       e-mail duz@roxi.rz.fht-mannheim.de.
\               Look&feel stolen from Mike Taylor's "TETRIS FOR TERMINALS"
\
\               Please copy and share this program, modify it for your system
\               and improve it as you like. But don't remove this notice.
\

WINAPI: GetTickCount KERNEL32.DLL

\ ONLY FORTH ALSO DEFINITIONS DECIMAL

: BLANK ( --> ) BL FILL ;
: MS ( ms - ) >R  GetTickCount BEGIN GetTickCount OVER - R@ > UNTIL R> 2DROP ;
0 CONSTANT false
-1 CONSTANT true
: >=   < 0= ;
: <=   > 0= ;

: OFF 0! ;
: ON TRUE SWAP ! ;

: .R ( n # --> )
     >R DUP >R ABS S>D <# #S R> SIGN #> R> OVER - 0 MAX SPACES TYPE ;

S" lib\ext\case.f" INCLUDED
S" lib\include\facil.f" INCLUDED
S" devel\~day\common\console.f" INCLUDED
: PAGE  CLS ;

-1 VALUE create-turnkey? \ set to false when you don't want a turnkey app

\ warning OFF

\ Variables, constants

: 2CONSTANT ( x1 x2 "<spaces>name" -- )
  CREATE  , ,  DOES> 2@
;

BL BL 2CONSTANT empty           \ an empty position
VARIABLE wiping                 \ if true: wipe brick, else draw brick
2 CONSTANT col0                \ position of the pit
0 CONSTANT row0

10 CONSTANT wide                \ size of pit in brick positions
20 CONSTANT deep

\ 0x20004 VALUE left-key          \ customize if you don't like them
\ 0x20006 VALUE rot-key           \ currently this values are for the
\ 0x20005 VALUE right-key         \ arrow key's in Win32Forth
\ 0x20007 VALUE drop-key

90 VALUE left-key          \ customize if you don't like them
88 VALUE rot-key           \ currently this values are for the
67 VALUE right-key         \ arrow key's in Win32Forth
32 VALUE drop-key

CHAR P  VALUE pause-key
12      VALUE refresh-key
CHAR Q  VALUE quit-key

VARIABLE score
VARIABLE pieces
VARIABLE levels
VARIABLE delay

VARIABLE brow                   \ where the brick is
VARIABLE bcol


\ stupid random number generator

VARIABLE seed

: randomize     TIME&DATE + + + + + seed ! ;

1 CELLS 4 = [IF]
0x10450405 CONSTANT generator

: rnd  ( -- n )  seed @ generator UM* DROP 1+ DUP seed ! ;

: random ( n -- 0..n-1 )  rnd UM* NIP ;
[ELSE]
: random        \ max --- n ; return random number < max
                seed @ 13 * [ HEX ] 07FFF [ DECIMAL ] AND
                DUP seed !  SWAP MOD ;
[THEN]

\ Access pairs of characters in memory:

: 2C@           DUP 1+ C@ SWAP C@ ;
: 2C!           DUP >R C! R> 1+ C! ;

: d<>           D= 0= ;


\ Drawing primitives:

: 2emit         EMIT EMIT ;

: position      \ row col --- ; cursor to the position in the pit
                2* col0 + SWAP row0 + AT-XY ;

: stone         \ c1 c2 --- ; draw OR undraw these two characters
                wiping @ IF   2DROP 2 SPACES  ELSE  2emit  THEN ;


\ Define the pit where bricks fall into:

: def-pit       CREATE  wide deep * 2* ALLOT
                DOES>   ROT wide * ROT + 2* + ;

def-pit pit

: empty-pit     deep 0 DO wide 0 DO  empty J I pit 2C!
                LOOP LOOP ;


\ Displaying:

: draw-bottom   \ --- ; redraw the bottom of the pit
                deep -1 position
                [CHAR] + DUP stone
                wide 0 DO  [CHAR] = DUP stone  LOOP
                [CHAR] + DUP stone ;

: draw-frame    \ --- ; draw the border of the pit
                deep 0 DO
                    I -1   position [CHAR] | DUP stone
                    I wide position [CHAR] | DUP stone
                LOOP  draw-bottom ;

: bottom-msg    \ addr cnt --- ; output a message in the bottom of the pit
                deep OVER 2/ wide SWAP - 2/ position TYPE ;

: draw-line     \ line ---
                DUP 0 position  wide 0 DO  DUP I pit 2C@ 2emit  LOOP  DROP ;

: draw-pit      \ --- ; draw the contents of the pit
                deep 0 DO  I draw-line  LOOP ;

: show-key      \ char --- ; visualization of that character
                DUP BL <
                IF   [CHAR] @ OR  [CHAR] ^ EMIT  EMIT  SPACE
                ELSE  [CHAR] ` EMIT  EMIT  [CHAR] ' EMIT
                THEN ;

: show-help     \ --- ; display some explanations
                30  1 AT-XY ." ***** T E T R I S *****"
                30  2 AT-XY ." ======================="
                30  4 AT-XY ." Use keys:"
                32  5 AT-XY ." 'key   Z'  Move left"
                32  6 AT-XY ." 'key   C'  Move right"
                32  7 AT-XY ." 'key   X'    Rotate"
                32  8 AT-XY ." 'key Space'   Drop"
                32  9 AT-XY pause-key   show-key ."  Pause"
                32 10 AT-XY refresh-key show-key ."  Refresh"
                32 11 AT-XY quit-key    show-key ."  Quit"
                30 16 AT-XY ." Score:              Next piece:"
                30 17 AT-XY ." Pieces:"
                30 18 AT-XY ." Levels:"
                 0 22 AT-XY ."  ==== This program was written 1994 in pure dpANS Forth by Dirk Uwe Zoller ===="
                 0 23 AT-XY ."  =============================== SPF4 port  ===================================" ;

: update-score  \ --- ; display current score
                38 16 AT-XY score @ 3 .R
                38 17 AT-XY pieces @ 3 .R
                38 18 AT-XY levels @ 3 .R ;

: refresh       \ --- ; redraw everything ON screen
                PAGE draw-frame draw-pit show-help update-score ;


\ Define shapes of bricks:

: def-brick     CREATE  4 0 DO
                            ' EXECUTE  0 DO  DUP I CHARS + C@ C,  LOOP DROP
                            REFILL DROP
                        LOOP
                DOES>   ROT 4 * ROT + 2* + ;

def-brick brick1        S"         "
                        S" ######  "
                        S"   ##    "
                        S"         "

def-brick brick2        S"         "
                        S" <><><><>"
                        S"         "
                        S"         "

def-brick brick3        S"         "
                        S"   {}{}{}"
                        S"   {}    "
                        S"         "

def-brick brick4        S"         "
                        S" ()()()  "
                        S"     ()  "
                        S"         "

def-brick brick5        S"         "
                        S"   [][]  "
                        S"   [][]  "
                        S"         "

def-brick brick6        S"         "
                        S" @@@@    "
                        S"   @@@@  "
                        S"         "

def-brick brick7        S"         "
                        S"   %%%%  "
                        S" %%%%    "
                        S"         "

\ this brick is actually in use:
def-brick brick         S"         "
                        S"         "
                        S"         "
                        S"         "

\ this brick will come next:
def-brick next-brick    S"         "
                        S"         "
                        S"         "
                        S"         "

def-brick scratch       S"         "
                        S"         "
                        S"         "
                        S"         "

CREATE bricks   ' brick1 ,  ' brick2 ,  ' brick3 ,  ' brick4 ,
                ' brick5 ,  ' brick6 ,  ' brick7 ,

CREATE brick-val 1 C, 2 C, 3 C, 3 C, 4 C, 5 C, 5 C,

VARIABLE brick-value

: is-next-brick \ brick --- ; activate a shape of brick
                >BODY ['] next-brick >BODY 32 CMOVE ;

: get-next-brick \ --- ; select the next brick by random
                1 pieces +!  7 random
                bricks OVER CELLS + @ is-next-brick
                brick-val SWAP CHARS + C@ brick-value ! ;

: is-brick      \ brick --- ; activate a shape of brick
                >BODY ['] brick >BODY 32 CMOVE ;

: new-brick     \ --- ; select brick, count it
                ['] next-brick is-brick brick-value @ score +!
                get-next-brick ;

: rotleft       4 0 DO 4 0 DO
                    J I brick 2C@  3 I - J scratch 2C!
                LOOP LOOP
                ['] scratch is-brick ;

: rotright      4 0 DO 4 0 DO
                    J I brick 2C@  I 3 J - scratch 2C!
                LOOP LOOP
                ['] scratch is-brick ;

: draw-brick    \ row col
                4 0 DO 4 0 DO
                    J I brick 2C@  empty d<>
                    IF   OVER J + OVER I +  position
                        J I brick 2C@  stone
                    THEN
                LOOP LOOP 2DROP ;

: show-brick    wiping OFF draw-brick ;
: hide-brick    wiping ON  draw-brick ;

: draw-next-brick \ row col ---
                4 0 DO 4 0 DO
                    J I next-brick 2C@  empty d<>
                    IF   OVER J + OVER I +  position
                        J I next-brick 2C@  stone
                    THEN
                LOOP LOOP 2DROP ;

: show-next-brick    wiping OFF draw-next-brick ;
: hide-next-brick    wiping ON  draw-next-brick ;

: put-brick     \ row col --- ; put the brick into the pit
                4 0 DO 4 0 DO
                    J I brick 2C@  empty d<>
                    IF   OVER J +  OVER I +  pit
                        J I brick 2C@  ROT 2C!
                    THEN
                LOOP LOOP  2DROP ;

: remove-brick  \ row col --- ; remove the brick from that position
                4 0 DO 4 0 DO
                    J I brick 2C@  empty d<>
                    IF   OVER J + OVER I + pit empty ROT 2C!  THEN
                LOOP LOOP  2DROP ;

: test-brick    \ row col --- flag ; could the brick be there?
                4 0 DO 4 0 DO
                    J I brick 2C@ empty d<>
                    IF   OVER J +  OVER I +
                        OVER DUP 0< SWAP deep >= OR
                        OVER DUP 0< SWAP wide >= OR
                        2SWAP pit 2C@  empty d<>
                        OR OR IF   UNLOOP UNLOOP 2DROP false  EXIT  THEN
                    THEN
                LOOP LOOP  2DROP true ;

: move-brick    \ rows cols --- flag ; try to move the brick
                brow @ bcol @ remove-brick
                SWAP brow @ + SWAP bcol @ + 2DUP test-brick
                IF   brow @ bcol @ hide-brick
                    2DUP bcol ! brow !  2DUP show-brick put-brick  true
                ELSE  2DROP brow @ bcol @ put-brick  false
                THEN ;

: rotate-brick  \ flag --- flag ; left/right, success
                brow @ bcol @ remove-brick
                DUP IF   rotright  ELSE  rotleft  THEN
                brow @ bcol @ test-brick
                OVER IF   rotleft  ELSE  rotright  THEN
                IF   brow @ bcol @ hide-brick
                    IF   rotright  ELSE  rotleft  THEN
                    brow @ bcol @ put-brick
                    brow @ bcol @ show-brick  true
                ELSE  DROP false  THEN ;

: insert-brick  \ row col --- flag ; introduce a new brick
                2DUP test-brick
                IF   2DUP bcol ! brow !
                    2DUP put-brick  draw-brick  true
                ELSE  false  THEN ;

: drop-brick    \ --- ; move brick down fast
                BEGIN  1 0 move-brick 0=  UNTIL ;

: move-line     \ from to ---
                OVER 0 pit  OVER 0 pit  wide 2*  CMOVE  draw-line
                DUP 0 pit  wide 2*  BLANK  draw-line ;

: line-full     \ line-no --- flag
                true  wide 0
                DO  OVER I pit 2C@ empty D=
                    IF   DROP false  LEAVE  THEN
                LOOP NIP ;

: remove-lines  \ ---
                deep deep
                BEGIN
                    SWAP
                    BEGIN  1- DUP 0< IF   2DROP EXIT  THEN  DUP line-full
                    WHILE  1 levels +!  10 score +!  REPEAT
                    SWAP 1-
                    2DUP <> IF   2DUP move-line  THEN
                AGAIN ;

: to-upper      \ char --- char ; convert to upper case
                DUP [CHAR] a >= OVER [CHAR] z <= AND IF   BL -  THEN ;

: interaction   \ --- flag

                CASE  KEY to-upper 
                    left-key    OF  0 -1 move-brick DROP  ENDOF
                    right-key   OF  0  1 move-brick DROP  ENDOF
                    rot-key     OF  0 rotate-brick DROP  ENDOF
                    drop-key    OF  drop-brick  ENDOF
                    pause-key   OF  S"  paused " bottom-msg  KEY DROP
                                    draw-bottom  ENDOF
                    refresh-key OF  refresh  ENDOF
                    quit-key    OF  false EXIT  ENDOF
                ENDCASE  true ;

: initialize    \ --- ; prepare for playing
                randomize empty-pit refresh
                0 score !  0 pieces !  0 levels !  100 delay !
                get-next-brick ;

: adjust-delay  \ --- ; make it faster with increasing score
                levels @
                DUP  50 < IF   100 OVER -  ELSE
                DUP 100 < IF    62 OVER 4 / -  ELSE
                DUP 500 < IF    31 OVER 16 / -  ELSE  0  THEN THEN THEN
                delay !  DROP ;

: play-game     \ --- ; play one tetris game
                BEGIN
                    15 30 hide-next-brick
                    new-brick
                    15 30 show-next-brick

                    -1 3 insert-brick
                WHILE
                    BEGIN  4 0
                        DO  35 13 AT-XY
                            delay @ MS  KEY?
                            IF  interaction 0=
                                IF   UNLOOP EXIT  THEN
                            THEN
                        LOOP
                        1 0 move-brick  0=
                    UNTIL
                    remove-lines
                    update-score
                    adjust-delay
                REPEAT ;

\ FORTH DEFINITIONS

: tt            \ --- ; play the tetris game
      PAGE
                initialize
                S"  Press any key " bottom-msg KEY DROP draw-bottom
                BEGIN
                    play-game
                    S"  Again? " bottom-msg KEY to-upper [CHAR] Y =
                WHILE  initialize  REPEAT
                create-turnkey?
                IF    BYE \ quit our turnkey application
                ELSE 0 23 AT-XY CR
                THEN ;


\ create a turnkey application
create-turnkey? [IF]

FALSE TO SPF-INIT?
' ANSI>OEM TO ANSI><OEM
FALSE TO ?GUI
' tt TO <MAIN>
S" tetris.exe" SAVE

tt

[ELSE]

tt

[THEN]


P.S. Отличия: В Win32Forth управление через клавиши курсора, а в SPF4 через клавишы ZXC и Пробел.
Можно добавить к консольным примерам дистрибутива SPF4 :)

P.P.S Этот же тетрис для КолибриОС :?
Консольный Tetris для Колибри


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Пт фев 21, 2014 12:13 
Вот и ответ о причине непопулярности Forth:
1. Запустив diff для этого текста и примера Win32Forth получим 700 строк различий на 450 исходных. Конечно, большая часть - различия в регистрах и комментариях, но кто будет в этом разбираться?
2. Оставшиеся принципиальные различия никак не сводятся к простому "вместо интерфейса одной системы тупо подставим другой". Требуется найти и изменить множество мелочей, разбросанных по всему тексту. И, кстати, нет никакой гарантии, что эти программы работают одинаково.
3. Программа написана практически на C. На каждый чих - отдельная переменная/функция. Используемые слова-макросы даже тупее, чем те, что обычно встречаются в C-шных #define. Никаких Forth-финтов, облегчающих жизнь. Наоборот, жуткое количество стековых перетасовок.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Сб фев 22, 2014 14:53 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
gudleifr писал(а):
Вот и ответ о причине непопулярности Forth:
1. Запустив diff для этого текста и примера Win32Forth получим 700 строк различий на 450 исходных. Конечно, большая часть - различия в регистрах и комментариях, но кто будет в этом разбираться?

Быть словам Форт системы регистро-зависимым или нет это один из вопросов по разному решаемому в существующих Фортах.
SPF4 - регистро-зависим, но есть возможность включить регистро-независимость как это сделано для SPF4 в тесте benchmark.

gudleifr писал(а):
2. Оставшиеся принципиальные различия никак не сводятся к простому "вместо интерфейса одной системы тупо подставим другой". Требуется найти и изменить множество мелочей, разбросанных по всему тексту.

Основные изменения из-за отсутствия тех или иных дополнительных встроенных стандартных слов ANSI в SPF4.

gudleifr писал(а):
И, кстати, нет никакой гарантии, что эти программы работают одинаково.

По моему одинаково.

gudleifr писал(а):
3. Программа написана практически на C. На каждый чих - отдельная переменная/функция. Используемые слова-макросы даже тупее, чем те, что обычно встречаются в C-шных #define. Никаких Forth-финтов, облегчающих жизнь. Наоборот, жуткое количество стековых перетасовок.

Задачи написания "TRUE" консольного Форт тетриса не было, а лишь запуск данного примера :)
Кстати заработал почти сразу, как в Windows так и в порте SPF4 для Koлибри (хотя есть подозрения что порт не совсем совместим - попытка влючить регистро-независимость не получилась, а при тесте ANSI совместимости выявлена ошибка в реализации FM/MOD и пофиксена и не работает RECURSE и тест : abc 123 ; : def abc 456 ; )

P.S. Во всех языках программирования существует разрыв между синтаксическим и семантическим уровнями языка при создания решения задачи
и попытки "стандартизровать" семантические варианты шаблонов решения задачи на синтаксическом уровне не настолько "плодотворны" и могут
приводить (и приводят) к огромному оверхеду кода.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Сб фев 22, 2014 16:57 
KPG писал(а):
....
Я нисколько не ругаю Ваш "перевод". Простите, если так показалось. Я лишь обратил внимание, на то, что подобные примеры могут произвести (и производят) на не-фортеров отталкивающее впечатление.

P.S. Можно ведь было бы написать вместо всех этих def-brick что-то вроде:

\ Рисование от точки 2,2
7 bricks: LBDBR LBRR DBRR LBRD RDL LBDR RBDL

И короче, и попсовее и фортовее...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Сб фев 22, 2014 21:29 
Не в сети

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

Ну это уж как автор данного тетриса сделал :)

P.S Сборка Форт системы под Колибри с некоторыми изменениями варианта Михаила
(использован SP4.18, исправлены некоторые ошибки и добавлен "побочный" функционал, на более поздних версиях пока не собирается)
В качестве "побочного" функционала добавлена возможность дизасемблирования "трассы инструментального слова" (со всеми используемыми)
в изменённом disasm2.f (cм. gspf.f)

сборка KolSPForth12 под Windows
Вложение:
KolSPForth12.zip [390.37 Кб]
Скачиваний: 2063


Последний раз редактировалось KPG Вс фев 23, 2014 17:55, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Сб фев 22, 2014 22:14 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
KPG писал(а):
в порте SPF4 для Koлибри

А можно линк на "скачать SPF4 для колибри"? Колибри - штука довольно интересная для экспериментов.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Сб фев 22, 2014 22:36 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
VoidVolker писал(а):
KPG писал(а):
в порте SPF4 для Koлибри

А можно линк на "скачать SPF4 для колибри"? Колибри - штука довольно интересная для экспериментов.

А выше сообщение для чего? (c прикрелённым файлом)
Кросс SPF4.18 (build.bat) собирается образ asm img и далее с помощью FASM (mbuld.bat)
собирается конечный запускаемый бинарник Meforth - название лучше сделать другое (c помощью kpack можно ужать до гораздо меньшего размера)

P.S. В каком направлении дальше изменять пока непонятно, но хочется иметь и "само" собирающуюся Форт систему в самой Колибри
используя уже собранный таким образом исполняемый файл. ANSI тест проходит, если исключить тест рекурсии и предпоследний тест на поиск в словаре (?)
и непонятный Wrong на AND. Бенчмарк не запустил т.к. нужно подключать режим регистро-независимости и желательно ENVIRONMENT ("стандартно" SPF4 не заработавший на данном варианте SPF Форта, а с "внутренностями" последних SPF4 мне ещё нужно разбираться). Но для экспериментов в Koлибри вполне
функционален и в текущей версии (немного напрягает раскладка клавиатуры как то не совсем только доделана)
Проще (до определённой степени понимания) использования Форта в Колибри в сравнении с Windows и Linux, вряд ли возможно :)
(бонусом идёт возможность их запускать под эмулятором в XP или в виртуальном варианте вместе с, например, QEMU в самозапускающемся архиве)

Топики на форуме Колибри по обсуждению Форт

а также (сборка KolSPForthL12 под Ubuntu)
Вложение:
KolSPForthL12.tar.bz2 [343.33 Кб]
Скачиваний: 1735


Последний раз редактировалось KPG Вс фев 23, 2014 17:56, всего редактировалось 5 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Вс фев 23, 2014 00:18 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
А слона-то я и не заметил ))
Цитата:
flat assembler version 1.70.03 (1048575 kilobytes memory)
meforth.ASM [443]:
include 'gif_lite.inc'
error: file not found.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Вс фев 23, 2014 00:30 
Не в сети

Зарегистрирован: Пн янв 07, 2013 22:40
Сообщения: 2141
Благодарил (а): 8 раз.
Поблагодарили: 74 раз.
VoidVolker писал(а):
А слона-то я и не заметил ))
Цитата:
flat assembler version 1.70.03 (1048575 kilobytes memory)
meforth.ASM [443]:
include 'gif_lite.inc'
error: file not found.

А разве он нужен для сборки? если убрать.
P.S. Этот файл примера вроде из архива 7-й сборки (которую я "доводил" до варианта 11-й сборки) kolForth (в 11-й вроде нет) и по незнанию непопавщий в архив.
Позже прикреплю к сообщению, на всякий случай. или можно поискать в файлах сообщений на форуме Колибри.
Вложение:
gif_lite.inc.zip


P.S. А SPF 4.18 не надо? Думаю есть :)
Может название топика как то изменить или открыть для обсуждения отдельный "топик" по экспериментам с SPF Форт в Колибри.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Вс фев 23, 2014 01:18 
Не в сети

Зарегистрирован: Чт ноя 23, 2006 00:44
Сообщения: 494
Откуда: СПб
Благодарил (а): 19 раз.
Поблагодарили: 8 раз.
gudleifr писал(а):
Вот и ответ о причине непопулярности Forth:
1. Запустив diff для этого текста и примера Win32Forth получим 700 строк различий на 450 исходных. Конечно, большая часть - различия в регистрах и комментариях, но кто будет в этом разбираться?
2. Оставшиеся принципиальные различия никак не сводятся к простому "вместо интерфейса одной системы тупо подставим другой". Требуется найти и изменить множество мелочей, разбросанных по всему тексту. И, кстати, нет никакой гарантии, что эти программы работают одинаково.
3. Программа написана практически на C. На каждый чих - отдельная переменная/функция. Используемые слова-макросы даже тупее, чем те, что обычно встречаются в C-шных #define. Никаких Forth-финтов, облегчающих жизнь. Наоборот, жуткое количество стековых перетасовок.

Извините! Я не профессиональный программист, но пытаясь найти нужную инфу, наталкиваюсь на посты "мэинстрим программеров" (C++,Java, Pascal, ...) - это просто ж..а! Пример, люди неделями постичь вызов сист. функции mmap (Linux) - мне хватило ночи для реализации данной ф-ци на ARM процессоре (прямой доступ к GPIO портам платы Cubieboard). Что произойдет, если отобрать "нужную" библиотеку у маинстрим-программиста - недоумение и куча вопросов на форумах, Фортер - реализует сам.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Вс фев 23, 2014 11:37 
Ilya писал(а):
Извините!
... Что произойдет, если отобрать "нужную" библиотеку у маинстрим-программиста - недоумение и куча вопросов на форумах, Фортер - реализует сам.
Именно! Поэтому майнстриммерам FORTH надо показывать оч-ч-чен-н-но осторожно. Без "выкидываем разом все библиотеки"....
С этой стороны, кстати тетрис-пример безупречен - вся лабуда с библиотеками на месте.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Вс фев 23, 2014 13:11 
Не в сети

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

Интересная заметка, возможно что то объясняющая. (с хабрахабр)
Тихое большинство экспертов
Код:
Джеймс Хейг

В те времена, когда я следил за группой comp.lang.forth в Usenet, я был не единственным, кого неприятно удивляло отсутствие людей, способных выделывать интересные штуки с Фортом. Элизабет Ратер, сооснователь Forth, Inc., предложила такое объяснение: есть люди, занимающиеся реальными проблемами языка, но в ньюсгруппе они не сидят. Она это знала наверняка: её компания была создана для поддержки создания коммерческих проектов на Форте.

В 1996 году я работал над портированием игры The Need for Speed на Sega Saturn. (Эта игровая приставка вам кажется необычной для того, чтобы с ней связываться? А я занимался разработкой под 3DO и посетил конференцию Jaguar в головном отделе Atari.) Уже в 90-х было некоторое количество известных разработчиков, но ведущие специалисты, занимавшиеся оригинальной версией выпущенной в 1994 году The Need for Speed, были никому неизвестными людьми. И это несмотря на то, что они написали игру, основанную на физике твердых тел, до того, как большинство других узнали, что эти слова вообще относятся к разработке 3D-видеоигр. И сделали они это без математического сопроцессора: весь движок использовал арифметику с фиксированной запятой.

Да, сейчас многие пишут в блогах или ещё каким-то путем публично обсуждают методологию и то, над чем они сейчас работают, но есть ещё большей людей, не делающих этого. Блогерство отнимает время, и, к примеру, не всем оно нравится. Другие же работают над коммерческими продуктами и не могут позволить себе разглашать внутренние наработки собственного кода.

Необычный аспект наших сетевых обсуждений состоит в том, что от тихого большинства мы научиться ничему не можем. Факт наличия известного ореола презрения вокруг C++, Perl или других языков ещё не означает того, что этими языками не пользуются очень умные ребята, которые строят потрясающие, прекрасно выполненные программы. Безумно плюсуемая привлекательная теория может иметь хорошо известные, но неочевидные недостатки. Мы видим лишь мнения людей, которые работают над интересными вещами и пишут о них — только и всего. Большая же часть разработчиков, к примеру, Chrome не имеет активных профилей в Twitter, не пишет в блоги, не использует Github, вы сможете связаться с ними только в списках рассылок и в багрепортах, и то лишь потому, что Chrome является свободным программным обеспечением.

Вам лучше будет попробовать многое самим, чем слушать то, что думают другие.


P.S.
gudleifr писал(а):
С этой стороны, кстати тетрис-пример безупречен - вся лабуда с библиотеками на месте.

На всякий случай (для полноты картины) ссылка на оригинальный текст данного тетриса для Win32Forth Terminal Tetris for Win32Forth
и добавлена (в сообщении выше) сборка kolSForth12 под Ubuntu


Последний раз редактировалось KPG Вс фев 23, 2014 18:00, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Вс фев 23, 2014 13:36 
KPG писал(а):
Интересная заметка, возможно что то объясняющая...
Поражает другое: от интернетов в данном контексте чего-то ждут. Это просто жутко ускоренный процесс обмена письмами и проведения конференций. Количество, конечно, переходит в качество, но немного не так... А мысли, мысли - они в книгах. А книг по FORTH как было пять, так и осталось... Остальное - пересказы и отчеты...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Консольный Тетрис для SPF4
СообщениеДобавлено: Вт мар 04, 2014 20:11 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
Ilya писал(а):
Пример, люди неделями постичь вызов сист. функции mmap (Linux) - мне хватило ночи для реализации данной ф-ци на ARM процессоре (прямой доступ к GPIO портам платы Cubieboard).

Ваша функция может отобразить R/W заданный дескриптором файл в адресные пространства нескольких процессов?
Если нет, это не mmap.


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

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


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

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


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

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