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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Вт июн 21, 2016 00:57 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Victor__v писал(а):
Создающие слова можно и без Create делать.
К примеру,
: const : lit, [compile] ; ;

CREATE и : имеют одинаковое начало. Просто CREATE еще компилирует код push HERE.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Вт июн 21, 2016 20:50 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Create и : имеют одинаковое начало
Но фигурка вырастает, однако, разная. По крайней мене, в СПФ

Вот лог
Код:
[quote]: M1 HERE >R ALLOT : R> LIT, ['] + COMPILE, [COMPILE] ; ;
: M2  CREATE ALLOT DOES> + ;
Ok

10 M1 MASSIV

1 MASSIV
Ok ( 5712556 )
0 MASSIV
Ok ( 5712556 5712555 )

SEE MASSIV

572ACB 8D80AB2A5700   LEA     EAX , 572AAB  ( M1+38  ) [EAX]
572AD1 C3      RET     NEAR
END-CODE   Ok
10 M2 ARRAY
Ok
SEE ARRAY

572AE7 E846FFFFFF   CALL    572A32  ( M2+F  )
END-CODE   Ok

0 ARRAY
Ok ( 5712620 )
1 ARRAY
Ok ( 5712620 5712621 )[/quote]

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Вт июн 28, 2016 23:11 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Итак, структуры в виде слова, которое ведёт себя как словарь
Без create, но с лямбдами :)

Код:
REQUIRE (: ~yz/lib/inline.f

: STRUCT(
 
  HERE >R

  BEGIN
  PARSE-NAME
   DUP 0= IF 2DROP
             REFILL DROP \ чтоб писалось в несколько строк
             [ 2SWAP 2DUP ] \ манипуляции
              AGAIN         \ со стеком
             [ 2SWAP ]      \ потока-управления
             THEN
   DUP 1 = >R OVER C@ [CHAR] ) = R> AND INVERT
   WHILE
         
   DUP C,
   S,
   HERE \ место откуда указывает указатель :)
   0 ,
    BEGIN
   PARSE-NAME
    DUP 0= IF 2DROP
             REFILL DROP
             [ 2SWAP  ]
              AGAIN
              THEN

['] EVALUATE CATCH IF
                      2DROP
                      R> DP ! \ очищаем память
                      -2001 THROW
                    THEN
  ALLOT
  HERE SWAP ! \ указатель сформирован.
             
  REPEAT
  2DROP
  0 ,

   BEGIN
   PARSE-NAME
    DUP 0= IF 2DROP
             REFILL DROP
             [ 2SWAP  ]
              AGAIN
              THEN
   SHEADER       \ создаём определение
   ['] ] EXECUTE \ подсмотрено через
   HIDE          \ дизъассемблер

  \ Это аналог DOES>
   R> LIT,


(:
   BEGIN
   PARSE-NAME
    DUP 0= IF 2DROP
             REFILL DROP
             [ 2SWAP  ]
              AGAIN
              THEN
2>R
   BEGIN
   COUNT 2DUP 2R@ COMPARE 0=
     IF + CELL+ [COMPILE] LITERAL RDROP RDROP EXIT
     ELSE + @ 
              DUP @ 0= \ уже конец структуры и эл-т не найден ?
               IF RDROP
                  RDROP
                  -2003 THROW
               THEN
     THEN
   AGAIN
;)
   COMPILE,
  [COMPILE] ;
  [COMPILE] IMMEDIATE

;

Как бонус, структуру можно писать в несколько строк.
А теперь опишем порождатель структур

Код:
REQUIRE COMP-STR ~ER\MY-SLIT.F
REQUIRE STRUCT( ~ER\STRUCT\STRUCT2.F


: CREA-STRUCT(
  10000 ALLOCATE THROW >R
 
  S{ STRUCT(  } R@ SWAP >R R@ MOVE
  R> R@ + >R
  BEGIN
  PARSE-NAME
   DUP 0= IF 2DROP
             REFILL DROP \ чтоб писалось в несколько строк
             [ 2SWAP 2DUP ] \ манипуляции
              AGAIN         \ со стеком
             [ 2SWAP ]      \ потока-управления
             THEN
   DUP 1 = >R OVER C@ [CHAR] ) = R> AND INVERT
   WHILE
   [ BL LIT, ] R@ C!
    R> 1+ >R
    R@ SWAP >R R@ MOVE
    R> R> + >R

  REPEAT
  2DROP
  S{  )  } R@ SWAP >R R@ MOVE
  R> R> + >R


   BEGIN
   PARSE-NAME
    DUP 0= IF 2DROP
             REFILL DROP
             [ 2SWAP  ]
              AGAIN
              THEN
   SHEADER       \ создаём определение
   ['] ] EXECUTE \ подсмотрено через
   HIDE          \ дизъассемблер

   R> R@ - R@ SWAP
   COMP-STR
   R> FREE THROW
   
    \ всеми любимый does>
   (:
   10000  ALLOCATE THROW >R
     R@ >R
     R@ SWAP >R R@ MOVE
     R> R> + >R

     BEGIN
     PARSE-NAME
     DUP 0= IF 2DROP
             REFILL DROP
             [ 2SWAP  ]
              AGAIN
              THEN

     R@ SWAP >R R@ MOVE
     R> R> + R@ - R@ SWAP 
     EVALUATE
     R> FREE THROW

   ;)   
    COMPILE,
   [COMPILE] ;
;



Как писать
STRUCT( x 10 y 10 z cell )
test
test z
CREA-STRUCT( x cell y cell str 255 ) vrag
vrag alias vrag qwerty

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Вс июл 17, 2016 13:00 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Ещё более логичный подход.
Имена отдельно значения отдельно
И у нас снова слово, создающее слово, ведущее себя как словарь :wink:
Код:
REQUIRE (: ~yz/lib/inline.f

: STRUCT(
 
  HERE >R

  BEGIN
  PARSE-NAME
   DUP 0= IF 2DROP
             REFILL DROP \ чтоб писалось в несколько строк
             [ 2SWAP 2DUP ] \ манипуляции
              AGAIN         \ со стеком
             [ 2SWAP ]      \ потока-управления
             THEN
   DUP 1 = >R OVER C@ [CHAR] ) = R> AND INVERT
   WHILE
         
   DUP C,
   S,
    BEGIN
   PARSE-NAME
    DUP 0= IF 2DROP
             REFILL DROP
             [ 2SWAP  ]
              AGAIN
              THEN

['] EVALUATE CATCH IF
                      2DROP
                      R> DP ! \ очищаем память
                      -2001 THROW
                    THEN
   , \ сколько выделить памяти в будущем?
             
  REPEAT
  2DROP
 
   0 , \ конец поля имён структуры
   R@
   BEGIN
   COUNT +
   >R
   R@ @
   HERE R@ !
   ALLOT
   R> CELL+ DUP @ 0=
   UNTIL
   DROP
   
   BEGIN
   PARSE-NAME
    DUP 0= IF 2DROP
             REFILL DROP
             [ 2SWAP  ]
              AGAIN
              THEN
   SHEADER       \ создаём определение
   ['] ] EXECUTE \ подсмотрено через
   HIDE          \ дизъассемблер

 
  \ Это аналог DOES>
   R> LIT,


(:  \ сделать хардкор-вариант лямбды с пом. маш.кода?
   BEGIN
   PARSE-NAME
    DUP 0= IF 2DROP
             REFILL DROP
             [ 2SWAP  ]
              AGAIN
              THEN
2>R
   BEGIN
   COUNT 2DUP 2R@ COMPARE 0=
     IF + @ [COMPILE] LITERAL RDROP RDROP EXIT
     ELSE + CELL+ 
              DUP @ 0= \  имя не найдено ?
               IF
               -2003 THROW
               THEN
     THEN
   AGAIN
;)
   COMPILE,
  [COMPILE] ;
  [COMPILE] IMMEDIATE

;

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Ср сен 27, 2017 20:40 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Цитата:

\ ~er 27.09.2017
\ Структуры с возможностью задания отрицательных полей
\


VECT --
: minus(--)
SWAP >R
HEADER
LAST-CFA @
R> 1+
;

: minus:
['] minus(--) TO --
0
;


: plus(--)
HEADER
OVER LIT, ['] + COMPILE, RET,
+
;




: STRUCT:
0 CONSTANT LAST-CFA @ @ 5 +
['] plus(--) TO --
0
;


: center \ size CFA ... n -- all-s 0
0 2>R
BEGIN
RP@ CELL+ @ WHILE
HERE SWAP !
R> + >R
R@ LIT,
['] - COMPILE, RET,
-1 RP@ CELL+ +!
REPEAT
R> RDROP
SWAP

['] plus(--) TO --

;


: STRUCT;
+ SWAP !
['] plus(--) TO --
;




Общий вид

STRUCT: test
minus:
CELL -- A \ отрицательные поля
CELL -- B
center \ слово-разграничитель
CELL -- C \ положительные поля
CELL -- D
STRUCT;

Особенности реализации.
По факту слово center строит все отрицательные поля

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Ср сен 27, 2017 22:25 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Цитата:
отрицательные поля
Что это значит? Обьясните пожалуйста.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Ср сен 27, 2017 23:09 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Поля с отрицательным смещением.
Пригождается в некоторых случаях.
Т.е. первый элемент имеет смещение не 0 а -n ( в байтах )
В частности, отрицательное смещение используется в СПФ для хранения информации о слове ( флаги, CFA и пр )

Одно из применений структур с отриц.полями это дополнение самой структуры слова.
К примеру в моём ( всё ещё не написанном ) форте
Так
CELL -- NFA
2 -- COUNT
2 -- FFA
CELL -- HashFA
CELL -- CFA
CELL -- LFA \ данное поле является центральным т.е. его смещение 0
CELL -- LLFA \ поле где хранится цепочка слов в словаре
CELL -- HereFA \ указатель на переменную кодофайла
2 CELLS - MaskFA \ поле для хранения маски поиска в словаре

Вот, смотри, какая ситуация получается:
Если у нас просто слова, то нам нужны поля до LFA
Если у нас словарь, то нам нужно всё
Если у нас временный словарь, то нам достаточно плясать от LLFA

Т.е. все отрицательные поля и LFA характеризуют обычное слово, а все положительные временный словарь,
а их соединение словарь обычный.
Как-то так

P.S.
Ещё на форуме видел вариант реализации от mOleg-а

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Чт сен 28, 2017 18:04 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
а зачем так сложно?
ну, вот добавил смещение сразу:
Код:
-4 Struct: something
     7 record: off_one
           byte: off_two
          word: off_tre

   EndStruct

зачем усложнять себе жизнь?

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Пт сен 29, 2017 11:33 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1288
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
mOleg писал(а):
а зачем так сложно?
ну, вот добавил смещение сразу:
Код:
-4 Struct: something
     7 record: off_one
           byte: off_two
          word: off_tre

   EndStruct

зачем усложнять себе жизнь?

Похожий вопрос.
Зачем прописывать смещение, если без него удобней и в случае правок меньше ошибок?

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Структуры
СообщениеДобавлено: Сб сен 30, 2017 20:10 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Victor__v писал(а):
Зачем прописывать смещение, если без него удобней и в случае правок меньше ошибок?

ну, не напрягало ни разу 8)

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

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


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

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


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

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