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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 110 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8  След.
Автор Сообщение
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Чт дек 13, 2012 20:52 
Не в сети
Аватара пользователя

Зарегистрирован: Пн дек 10, 2012 16:20
Сообщения: 23
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Полное описание на офф. вики.
Я перевёл описание периферии тут. (второй пост -> гайды -> Низкоуровневое управление устройствами)

Эмулятор:
F2 - настройки (в.ч. ускорители)
F3 - выбор устройств.
F4 - декодеры. (управление сигналами)
F6 - внутренний монитор. (там можно поставить метки)

И такая особенность дисковода в эмуляторе: файл выбирается по имени дискеты.

_________________
Белый и пушистый.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Чт дек 13, 2012 20:55 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Jelsay писал(а):
не обязательно же лезть в "сам Форт" - одно из решений предполагает препроцессорный разбор входного потока в удобоваримый для имеющегося Форта вид.. а потом уж трансляция этого перелопаченного текста "обычным" Фортом..


В шутку и всерьёз:) о Форт на лурке

P.S. Препроцессорный разбор внутри Форт файла с Форт текстом делается, при необходимости, минимальными средствами самого Форта! в этом же файле
(в разных вариантах, с возможной несовместимостью при исполнении в разных Форт системах)
P.S. Для интереса, например, простым скриптом можно получить ассемблерный код самой Форт системы при наличии встроенного дизассемблера.
(попробовал, например, данный приём на VFX форте и получил кучу внутреннего асм кода Форт системы:)


Последний раз редактировалось Kopa Чт дек 13, 2012 21:26, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Чт дек 13, 2012 21:06 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Ср дек 06, 2006 09:23
Сообщения: 660
Благодарил (а): 7 раз.
Поблагодарили: 25 раз.
Kopa писал(а):
Jelsay писал(а):
не обязательно же лезть в "сам Форт" - одно из решений предполагает препроцессорный разбор входного потока в удобоваримый для имеющегося Форта вид.. а потом уж трансляция этого перелопаченного текста "обычным" Фортом..


В шутку и всерьёз:) о Форт на лурке


+1 :))


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Чт дек 13, 2012 21:25 
Не в сети
Аватара пользователя

Зарегистрирован: Пн дек 10, 2012 16:20
Сообщения: 23
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Начинаю потихоньку сливать сюда исходники. Жаль, что тут нет спойлеров...
Используются нуль-терминированные строки.

Реализованы на ассемблере:
Код:
DOCON DOVAR DODOES (lit) EXIT (branch) (?branch) (do) (?do) (loop) (+loop) (leave) UNLOOP I J EXECUTE DUP ?DUP 2DUP DROP 2DROP SWAP PICK OVER 2OVER ROT 2SWAP -ROT NIP TUCK >R R> ! +! -! C! @ C@ + - M* UM* * U* SM/REM FM/MOD UM/MOD 2* 2/ U>> << AND OR XOR INVERT NEGATE 1+ 1- SP@ SP! RP@ RP! 0= 0<> 0< <> < > U< U> <= >= = CELL CELLS MAX MIN MOVE FILL MEMCMP STRLEN RSTRLEN


Код:
HEX
FFFF CONSTANT TRUE
0000 CONSTANT FALSE
0040 CONSTANT SCRATCH
0080 CONSTANT TIB
VARIABLE RADIX
0020 CONSTANT BL

: UITOA ( n --> str )
SCRATCH 14 +
0 OVER C!
BEGIN
  1- SWAP 0 RADIX @
  UM/MOD -ROT 30 +
  DUP 39 >
  IF 7 + THEN
  OVER C! OVER 0=
UNTIL
NIP
;

: WORD ( str --> str+, str )
BEGIN
  DUP C@
  DUP 20 =
  OVER 9 = OR
  OVER A = OR
  OVER D = OR
  NIP
WHILE
  1+
REPEAT
DUP C@ 0= IF
  DUP EXIT THEN
DUP
BEGIN
  DUP C@
  DUP 20 <>
  OVER 0<> AND
  OVER 9 <> AND
  OVER A <> AND
  OVER D <> AND
  NIP
WHILE
  1+
REPEAT
DUP C@ IF
  0 OVER C! 1+
THEN
SWAP
;

: SPLIT ( str, b -->)
SWAP
BEGIN
  OVER OVER C@ =
WHILE
  1+
REPEAT
TUCK
BEGIN
  OVER
  OVER C@ <>
  OVER C@ 0<> AND
WHILE
  1+
REPEAT
DUP C@ IF
  0 OVER C! 1+
THEN
NIP SWAP
;

: STRCMP ( str1, str2 --> )
2DUP  STRLEN
SWAP STRLEN
MIN 1+ MEMCMP
;

: ISUNUM ( b --> )
DUP 40 > IF
  07 -
THEN
30 - DUP 0<
SWAP RADIX @ 1-
> OR 0=
;

: ISNUM ( b --> )
DUP ISUNUM
SWAP 2D = OR
;

: UATOI ( str --> n )
0
BEGIN
  OVER C@ DUP 40 >
  IF 7 - THEN
  30 - DUP 0<
  OVER RADIX @ >= OR 0=
WHILE
  SWAP RADIX @
  U* + SWAP 1+ SWAP
REPEAT
DROP NIP EXIT

: ATOI ( str --> n )
DUP C@ 2D =
IF
  1+ UATOI NEGATE
ELSE
  UATOI
THEN ;

: HEX
10 RADIX ! ;

: DECIMAL
A RADIX ! ;


RBP! и TICK на ассемблере.

Продолжение следует...

_________________
Белый и пушистый.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Чт дек 13, 2012 21:41 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
ХитрыйЛис писал(а):
Начинаю потихоньку сливать сюда исходники. Жаль, что тут нет спойлеров...

Вот это то и немного непонятно в подходе данной Форт системы -> тянуть дополнительные "частные" реализации "Бейсик-Си" подобных функций
на Форте без использования существующих "стандартных" решений (нужно/не нужно под вопросом) устоявшегося базиса базовых слов разных Форт систем.
и слово WORD очень отличается от стандарта. В этом случае подошло бы определение данного слова, например как (WORD) или как то иначе.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Чт дек 13, 2012 23:09 
Не в сети
Аватара пользователя

Зарегистрирован: Пн дек 10, 2012 16:20
Сообщения: 23
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Тут WORD разрезает строку на две так, чтобы отрезать первое слово.
Отлично, говорите что не по стандарту, а я запишу это где-нибудь...

Продолжаю слив:
Наверное, аппаратные слова не самые интересные, но...
Код:
HEX
VARIABLE TERMADDR

: PAGE ( --> )
TERMADDR @ RBP! \ порт настраивается на терминал
0  303 C!       \ прячет курсор
20 308 C!       \ символ, которым будет заполнена область
0  30A !        \ начало области заполнения
3250 30C !      \ конец области (выбран весь экран)
1 307 C!        \ команда на заполнение
BEGIN
  307 C@ 0= TICK
UNTIL
1 301 !         \ установка курсора
2 303 C!        \ включение курсора
;

: SCROLL ( --> )
TERMADDR @ RBP!
0   303 C!  \ копирование области
100 308 !
0   30A !
3150 30C !
3 307 C!
BEGIN
307 C@ = TICK
UNTIL
20 308 C! \ очистка последней строки
3100 30A !
150 30C !
1 307 C!
BEGIN
  307 C@ = TICK
UNTIL
2 303 C!
;

: CR ( --> )
TERMADDR @ RBP!
302 C@
30 >
IF
  SCROLL
ELSE
  302 C@ 1+
  302 C!
THEN
0 301 C!
;

: EMIT ( b --> )
TERMADDR @ RBP!
302 C@
300 C!
301 C@
310 + C!
301 C@
4E > IF
  CR
ELSE
  301 C@ 1+
  301 C!
THEN
;


Реализованы на ассемблере: BS KEY? KEY AT-XY

Код:
HEX
: (.") \ служебное
R>
BEGIN
  DUP C@ ?DUP
WHILE
  EMIT 1+
REPEAT
1+ >R
;

: SPACE ( --> )
BL EMIT ;

: TYPE (str --> )
BEGIN
  DUP C@ ?DUP
WHILE
  EMIT 1+
REPEAT
DROP
;

: .
DUP 0< IF
  NEGATE UITOA 1-
  2D OVER C!
ELSE
  UITOA TYPE SPACE
THEN
;

: U.
UITOA TYPE SPACE ;

: /MOD
OVER 0< SWAP FM/MOD ;

: /
/MOD DROP ;

: MOD
/MOD NIP ;

: ABORT
SP0 SP! QUIT ;


Немного переменных и резервирование памяти.
Код:
VARIABLE TIBPTR
VARIABLE VOCAB
VARIABLE (HERE)
: HERE (HERE) @ ;
VARIABLE TOP
VARIABLE STATE

HEX
: PROBE ( --> n) \ возвращает вершину доступной памяти
1FFF
BEGIN
  DUP 2000 +
  DUP C@
  DUP INVERT
  2OVER !
  DUP 2OVER C@ =
  SWAP 2OVER C!
  IF DROP EXIT THEN
  NIP DUP FFFF =
UNTIL ;

: FREE
TOP @ HERE - ;

: ALLOT ( n --> addr ) \ ТОЛЬКО резервирует память
DUP 2 + FREE U>
IF ." Out of memory" CR ABORT THEN
HERE SWAP (HERE) +!
;

: ,
CELL ALLOT ! ;

: ,C
1 ALLOT C! ;

: ,S
BEGIN
  DUP C@
WHILE
  DUP C@ ,C 1+
REPEAT
DROP 0 ,C
;


Часть диалоговой системы.
Код:
HEX
: TIBWORD
TIBPTR @ WORD SWAP TIBPTR ! ;

: TIBSPLIT
TIBPTR @ SWAP SPLIT SWAP TIBPTR ! ;

: HEADER
0 ,C
TIBWORD ,S
0 ,C
VOCAB @ ,
HERE VOCAB !
;

: CONSTANT
HEADER
22 ,C   \ инструкция интерпретации
LITERAL DOCON ,
;

: CREATE
HEADER
22 ,C
LITERAL DOVAR
;

: VARIABLE
CREATE 0 , ;

\ вот тут может возникнуть путаница...
: [
1'STATE ! ;

: ]
0 STATE ! ;

: HIDE
VOCAB @ 3 -
DUP C@ 2 OR
SWAP C!
;

: REVEAL
VOCAB @ 3 -
DUP C@ 1 AND
SWAP C!
;

: IMMEDIATE
VOCAB @ 3 -
DUP C@ 1 OR
SWAP C!
;

: (does)
R> VOCAB @ 1+ ! ;

: DOES>
LITERAL (does)
22 ,C
LITERAL DODOES
;

: :
HEADER HIDE 22 ,C [ ;

: ;
LITERAL EXIT , ] REVEAL ;

: IF
LITERAL (?branch) HERE 0 , 0 ;

: THEN
DROP HERE SWAP ! ;

: ELSE
DROP LITERAL (branch)
HERE 0 , SWAP HERE SWAP ! 0 ;

: ."
LITERAL (.") 22 TIBSPLIT ,S ;

: BEGIN
HERE 0 ;

: AGAIN
DROP LITERAL (branch) , ;

: UNTIL
DROP LITERAL (?branch) , ;

: WHILE
LITERAL (?branch) HERE 0 , 0 ;

: REPEAT
DROP NIP SWAP LITERAL (branch) , HERE SWAP ! ;

: DO
LITERAL (do) HERE 0 , HERE SWAP ;

: ?DO
LITERAL (?do) HERE 0 , HERE SWAP ;

: LOOP
SWAP LITERAL (loop) ,
LITERAL UNLOOP HERE SWAP ! ;

: +LOOP
SWAP LITERAL (+loop) ,
LITERAL UNLOOP HERE SWAP ! ;

Продолжение следует...

_________________
Белый и пушистый.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Чт дек 13, 2012 23:45 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
ХитрыйЛис писал(а):
Отлично, говорите что не по стандарту, а я запишу это где-нибудь...
.

Тогда может сразу в комментариях слов об этом указывать (часть информации озвучена в сообщениях выше)
или написать памятку по различию общих слов и в существующих учебниках по Форт:)
+ добавить описание корректирующих слов для согласования с другими Форт расширениями.

P.S. Ассемблерные примитивы данного Форта, при использовании, "расширенного" кросс средства можно составлять, достаточно
высокоуровне нивелируя различия между асм и форт кодом. Часть высокоуровневых "примитивных" слов тогда с таким же пониманием
можно составить на асме. Расширить Форт небольшим асмом тоже стоит.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Пт дек 14, 2012 00:15 
Не в сети
Аватара пользователя

Зарегистрирован: Пн дек 10, 2012 16:20
Сообщения: 23
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
В этом вся загвоздка: я не знаком со стандартом, а различия с учебником корректировал на практике =(

В общем, я вижу 2 пути:
1) Составить памятку о различиях и написать "библиотеку совместимости".
2) Переписать внутренности.

Кстати о втором:
Есть альтернативная система, написанная некими BR2k и tpw_rules.
Всё, что они сделали - это вырезали заголовки у служебных слов и переписали часть на ассемблере.
На основе этой системы я сделал свою. Я переписал ещё больше слов на асме и вставил небольшую защиту от ошибок исполнения. И ещё "научил" интерпретатор нормально распознавать числа...
Скачать.

По поводу расширения асмом...
Я в сомнении, т.к. этим Фортом будут пользоваться в основном новички.
Есть дополнительная библиотека MineUI, там часть функций написано на ассемблере и, чтобы можно было её загрузить, написаны слова, которые принимают байт-код.

_________________
Белый и пушистый.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Пт дек 14, 2012 01:10 
Не в сети
Аватара пользователя

Зарегистрирован: Пн дек 10, 2012 16:20
Сообщения: 23
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Последняя часть кода:

Код:
HEX
: LEAVE
1
BEGIN
  DUP PICK 0=
WHILE
  2 +
REPEAT
LITERAL (leave) PICK 2 - , ;

: \
D TIBSPLIT DROP ;

: (
29 TIBSPLIT DROP ;

: (")
R> DUP
BEGIN
  DUP C@
WHILE
  1+
REPEAT
1+ >R ;

: "
LITERAL (")
22 TIBSPLIT ,S ;

: TIMES
STATE @ 0=
IF
  ' SWAP 0 ?DO
    DUP EXECUTE
  LOOP
  DROP
ELSE
  ' LITERAL (lit)
  0 , LITERAL (?do)
  HERE A + , ,
  HERE 2 -
  LITERAL (loop) ,
  LITERAL UNLOOP
THEN
;

: LITERAL \ вот тут уж извините...
' LITERAL (lit) , ;

: POSTPONE
' DUP 3 - C@ 1 AND
IF
  ,
ELSE
  LITERAL (lit) ,
THEN ;

: RECURSE
VOCAB @ , ;

: TICKS
?DUP IF
  BEGUN
    TICK 1-
  UNTIL
THEN ;

200 CONSTANT SP0
300 CONSTANT RP0

: >NAME
05 - DUP RSTRLEN - 1+ ;

: NAME>
DUP STRLEN + 6 + ;

: FIND ( str --> addr|0 )
VOCAB @
BEGIN
  DUP
  IF
    2DUP >NAME
    STRCMP 0=
    OVER 3 - C@
    2 AND 0= AND
    IF
      TRUE
    ELSE
      CELL - @ FALSE
    THEN
  ELSE
    TRUE
  THEN
UNTIL
NIP
;

: ACCEPT ( str n --> str )
OVER + 1- OVER
BEGIN
  KEY DUP D <>
WHILE
  DUP 8 =
  IF
    DROP 2OVER OVER <
    IF
      BS 1-
    THEN
  ELSE
    DUP EMIT
    OVER C!
    1+ OVER MIN
  THEN
REPEAT 
DROP MIN 0 SWAP C!
;

: 0SP
SP0 SP! ;

: INTERPRET ( str --> )
BEGIN
  WORD DUP STRLEN 0<>
WHILE
SWAP TIBPTR !
DUP FIND ?DUP
IF
   NIP STATE @
   IF
     DUP 3 - C@ 1 AND
     IF EXECUTE ELSE , THEN
   ELSE
     EXECUTE
   THEN
ELSE
   DUP C@ ISNUM
   IF
     ATOI STATE @ IF LITERAL (lit) ,
   ELSE
     ." Unknown Token: "
     TYPE CR ABORT
   THEN
THEN
TIBPTR @
REPEAT
DROP DROP
;

: QUIT
RP0 RP!
0 STATE !
BEGIN
DEPTH 0<
IF
   ." Empty Stack" SP0 SP! CR
THEN
STATE @ 0=
IF
   ." > "
ELSE
   ." compile: "
THEN
TIB 78 ACCEPT
SPACE INTERPRET
AGAIN
;

: WORDS
VOCAB @
BEGIN
DUP
WHILE
DUP >NAME TYPE
SPACE CELL - @
REPEAT
DROP
;

: DEPTH
SP@ SP0 SWAP - 2/ ;

: .S
DEPTH DUP 0
DO
DUP I - PICK .
LOOP
DROP
;

: '
TIBWORD DUP
FIND ?DUP 0=
IF ." Unknown Token: " TYPE CR ABORT THEN
NIP
;

: FORGET
' DUP >NAME 1- (HERE) ! CELL - @ VOCAB ! ;

: COLD
0 C@ DISKADDR !
1 C@ TERMADDR !
CR CR ." MineOS XP V1.2 Initialized" CR
PROBE TOP ! FREE U. ." bytes free." CR QUIT
;

Вроде всё остальное (если не считать LOAD) предназначено чисто для устройств.

--------------------------------

Итог:
Из замеченных мной несоответствий:
WORD (Что вообще должно делать?)
Перепутаны имена у скобок [ и ]
ALLOT резервирует, но не освобождает память + возвращает адрес

Насчёт этих слов не уверен: COLD LITERAL FORGET

_________________
Белый и пушистый.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Пт дек 14, 2012 08:23 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
ХитрыйЛис писал(а):
Всем доброго времени суток.
Наткнулся на вас случайно =)

Если у вас есть вопросы по этой реализации Форта, то постараюсь на них ответить.

У меня есть исходники этой системы и вопрос: что стоит переделать?

P.S: Можете считать, что я с Фортом знаком лишь поверхностно.

viewtopic.php?p=36603#p36603
viewtopic.php?p=36609#p36609

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Пт дек 14, 2012 16:39 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
ХитрыйЛис писал(а):
Из замеченных мной несоответствий:
WORD (Что вообще должно делать?)

слово WORD ( <char> -- аddr )
Выделяет из входного потока слово ограниченное разделителем <char> (первично данный ограничитель не учитывается)
и оставляет адрес строки со счётчиком. Обычно, если позволяет реализация, данная строка заносится по адресу HERE (текущему указателю
свободного пространства "кодо-файла" Форт системы) без изменения HERE. ?может быть удобно при дальнейшей её фиксации в кодофайле) В некоторых фортах данную строку дополняют ещё завершающим терминатором - 0 для возможности работать и с такими строками.
по слову ALLOT ( n -- ) указатель HERE сдвигается на n-байт n может быть и отрицательным числом (вроде бы)
ХитрыйЛис писал(а):
Перепутаны имена у скобок [ и ]

Похоже + сразу не смог понять как скомпилировать в кодо-файл литерал после вычисления в интерпритирующем состоянии.

ХитрыйЛис писал(а):
По поводу расширения асмом...
Я в сомнении, т.к. этим Фортом будут пользоваться в основном новички.

С заложенными параметрами "железа", для некоторых задач, использование asm может оказаться наиболее эффективным решением учитывая уровень
абстракций которые могут быть "поддержаны" (например планировщик задач). + Использование для обработки игровых данных и управления игровыми
механизмами в игровом времени. (да хоть какую нибудь бегущую строку вывести на построенном игровом индикаторе-дисплее) что на ассемблере может
занять минимум процессорных команд и времени их выполнения. Как одно из решений вычислительную мощность повыситьза счёт объединения n-компьютеров.:)
(желающие, на "проект строительства и управления" механизмом "века" могут объединяться.) Остаётся вопрос удобства родной или своей мнемоники ассемблерных команд. Асемблер может быть как "классического" вида так и в Форт стиле. Можно даже поддержать ассемблер отличного от данного варианта ядра

P.S. В Форте cущественный момент - знание внутреннего устройства конкретной ситемы (хотя это и может быть дополнительным фактором несовместимости кода)


Последний раз редактировалось Kopa Пт дек 14, 2012 17:18, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Пт дек 14, 2012 17:17 
Не в сети
Аватара пользователя

Зарегистрирован: Пн дек 10, 2012 16:20
Сообщения: 23
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Kopa писал(а):
слово WORD ( <char> -- аddr )
Выделяет из входного потока слово ограниченное разделителем <char> и оставляет адрес строки со счётчиком.

Аналогичное выполняет TIBSPLIT (кто бы мог подумать...).
Но возвращает адрес строки без счётчика. Пропускает символ <char> в начале (если есть), а затем вставляет 0 на место следующего такого символа. Если нужно скомпилировать строку, то сразу после него ставят ,S.

WORD же, выделяет из строки первое слово, но учитывает сразу 4 символа: пробел, таб, перенос (Enter) и ещё символ с номером 0хА (Line Feed, но набрать не получается).
Попробую провести эксперимент: заменить TIBWORD на TIBSPLIT в INTERPRET
(Может, Элораам через чур перестраховалась...)

С ALLOT понятно: сделано с упрощением, чтобы слова , и были на 2 байта короче :))
Но это вызвало вот такою ситуацию - новички резервируют массивы так: 5 ALLOT CONSTANT buf
Вместо: CREATE buf 5 ALLOT

VoidVolker писал(а):
viewtopic.php?p=36603#p36603
viewtopic.php?p=36609#p36609

Помимо вышесказанного и путаницы с именами, самой главной проблемой совместимости являются строки.

А зачем COMPARE нужны длины строк?


UPD: Насчёт символов: видимо, за них отвечает файл "charset.rom", но как символы в нём закодированы я не знаю.

_________________
Белый и пушистый.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Пт дек 14, 2012 17:38 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
ХитрыйЛис писал(а):
(Может, Элораам через чур перестраховалась...)

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

с классческим WORD тоже могут быть "заморочки" при его использовании:)

ХитрыйЛис писал(а):
Kopa писал(а):
слово WORD ( <char> -- аddr )
Выделяет из входного потока слово ограниченное разделителем <char> и оставляет адрес строки со счётчиком.

Аналогичное выполняет TIBSPLIT (кто бы мог подумать...).
Но возвращает адрес строки без счётчика. Пропускает символ <char> в начале (если есть), а затем вставляет 0 на место следующего такого символа. Если нужно скомпилировать строку, то сразу после него ставят ,S.

Тоже ?неплохое решение.(но это уже вопрос к "форт теории") Cлово TIBSPLIT не сильно осязаемо. Бывает ещё добавляют к словарику cлово NEXT-WORD

ХитрыйЛис писал(а):
С ALLOT понятно: сделано с упрощением, чтобы слова , и ,С были на 2 байта короче
Но это вызвало вот такою ситуацию - новички резервируют массивы так: 5 ALLOT CONSTANT buf
Вместо: CREATE buf 5 ALLOT

Т.е. неявно произошло изменение способа работы с памятью по Си восприятию:)

P.S. Слово ,C кстати тоже нестандартно, правильно С,
ХитрыйЛис писал(а):
В этом вся загвоздка: я не знаком со стандартом, а различия с учебником корректировал на практике =(

Русский перевод стандарта 94года


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Пт дек 14, 2012 19:35 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
ХитрыйЛис писал(а):
WORD же, выделяет из строки первое слово, но учитывает сразу 4 символа: пробел, таб, перенос (Enter) и ещё символ с номером 0хА

Обычно, разделителем считаются все символы с номером меньше 33, т.е. все до пробела(32) включительно.
ХитрыйЛис писал(а):
Помимо вышесказанного и путаницы с именами, самой главной проблемой совместимости являются строки.

А в чем именно проблема? Я во все строковые литералы(ac, au) в конце пишу ноль - для совместимости с апи вызовами. Но так делают не все форты.
ХитрыйЛис писал(а):
А зачем COMPARE нужны длины строк?

Потому что в форте наиболее распространены a u строки.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: FORTH в игре, или Red Power 2 Control для Minecraft.
СообщениеДобавлено: Вс дек 16, 2012 01:52 
Не в сети
Аватара пользователя

Зарегистрирован: Пн дек 10, 2012 16:20
Сообщения: 23
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Kopa писал(а):
Cлово TIBSPLIT не сильно осязаемо.
Ну, я прослеживаю логику так:
SPLIT - разрезать произвольную строку.
WORD - выделить первое слово из произвольной строки.
TIB - буфер входной строки (на 120 символов)
TIBSPLIT - разрезать строку во входном буфере.
TIBWORD - выделить первое слово из входного буфера.

VoidVolker писал(а):
Обычно, разделителем считаются все символы с номером меньше 33, т.е. все до пробела(32) включительно.
Пожалуй, переделаю алгоритм с этим замечанием...

VoidVolker писал(а):
А в чем именно проблема?
В том, что MineOS вообще не принимает во внимание существование строк со счётчиком...


UPD: Посмотрев исходники эмулятора я разобрался с форматом файла "charset.rom".
Каждый символ закодирован битовым полем 8х8. 0 означает цвет фона, 1 - соответственно, цвет шрифта.
Можно нарисовать кириллические символы, но тут встревают 2 проблемы:
1) Эмулятор не принимает эти символы.
2) В таблице нет места.
Если использовать коды выше 127, то будут проблемы с выделением текста, т.к. терминал считает, что старший бит символа отвечает за инверсию цвета.

UPD2: Прошу проверить этот диск.
Переименовал:
,C --> C,
,S --> S,
[ --> ]
] --> [
U>> --> >>
RADIX --> BASE

Переделал:
ALLOT - по стандарту.
FIND - по стандарту, но строки без счётчика.
STRCMP -> COMPARE - по стандарту, но строки без счётчика.

Вопрос: на какое поле ссылается LAST?
По ходу, LITERAL работает не так как надо. Приведите пример его использования.

_________________
Белый и пушистый.


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

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


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

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


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

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