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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Структуры
Автор Сообщение
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Victor__v писал(а):
Зачем прописывать смещение, если без него удобней и в случае правок меньше ошибок?

ну, не напрягало ни разу 8)
Сообщение Добавлено: Сб сен 30, 2017 20:10
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
mOleg писал(а):
а зачем так сложно?
ну, вот добавил смещение сразу:
Код:
-4 Struct: something
     7 record: off_one
           byte: off_two
          word: off_tre

   EndStruct

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

Похожий вопрос.
Зачем прописывать смещение, если без него удобней и в случае правок меньше ошибок?
Сообщение Добавлено: Пт сен 29, 2017 11:33
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
а зачем так сложно?
ну, вот добавил смещение сразу:
Код:
-4 Struct: something
     7 record: off_one
           byte: off_two
          word: off_tre

   EndStruct

зачем усложнять себе жизнь?
Сообщение Добавлено: Чт сен 28, 2017 18:04
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Поля с отрицательным смещением.
Пригождается в некоторых случаях.
Т.е. первый элемент имеет смещение не 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-а
Сообщение Добавлено: Ср сен 27, 2017 23:09
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Цитата:
отрицательные поля
Что это значит? Обьясните пожалуйста.
Сообщение Добавлено: Ср сен 27, 2017 22:25
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Цитата:

\ ~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 строит все отрицательные поля
Сообщение Добавлено: Ср сен 27, 2017 20:40
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Ещё более логичный подход.
Имена отдельно значения отдельно
И у нас снова слово, создающее слово, ведущее себя как словарь :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

;
Сообщение Добавлено: Вс июл 17, 2016 13:00
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Итак, структуры в виде слова, которое ведёт себя как словарь
Без 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
Сообщение Добавлено: Вт июн 28, 2016 23:11
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
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]
Сообщение Добавлено: Вт июн 21, 2016 20:50
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Victor__v писал(а):
Создающие слова можно и без Create делать.
К примеру,
: const : lit, [compile] ; ;

CREATE и : имеют одинаковое начало. Просто CREATE еще компилирует код push HERE.
Сообщение Добавлено: Вт июн 21, 2016 00:57
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Цитата:
Кроме того, нет CREATE-слова, которое могло бы порождать экземпляры структур

Создающие слова можно и без Create делать.
К примеру,
: const : lit, [compile] ; ;
: var here 0 , : lit, [compile] ; ;
И всё нормально работает.
Если таким Макаром подойти к созданию структур?
Сообщение Добавлено: Пн июн 20, 2016 23:53
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
VoidVolker писал(а):
Кстати, а как именно компилируются эти локальные определения: среди кода текущего слова или как-то отдельно?

Среди кода. LOC[ создает ссылку вперед и переключает в режим интерпретации. ]LOC разрешает эту ссылку и возвращает в режим компиляции. Таким образом, LOC[ ]LOC - это просто вставка новой цепочки словаря, которая потом будет выключена из поиска (однако все еще видна, пока не отработало ; и не восстановило CURRENT). Поэтому никакого фрагментарного кода и описаний вида "в новой версии размер памяти для локальных определений увеличен до 128 кб" нет и не предвидится. Пока есть память, можно добавлять локальные описания.

Подобную же вещь стоит проделать и со структурами. Имитация синтаксиса структур или классов - это обычный с точки зрения Форта код, который к его основным особенностям не имеет никакого отношения. Раз в Форте управление областью видимости осуществляется с помощью связанных списков (на основе которых строятся словари), то и работу со структурами имеет смысл рассмотреть через призму связанных списков и их особенной организации.
Сообщение Добавлено: Пн июн 20, 2016 14:46
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Hishnik писал(а):
Это выглядит как-то уже за пределами понятия "локальное определение". Оно ведь на то и локальное, чтобы не быть видимым снаружи?

Это если приводить к концепции, приведенной мною ранее. Кстати, а как именно компилируются эти локальные определения: среди кода текущего слова или как-то отдельно?
Сообщение Добавлено: Пн июн 20, 2016 14:30
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
VoidVolker писал(а):
Осталось добавить возможность делать локальные слова доступными снаружи и объявлять не только внутри слова во время определения, но и уже после.

Это выглядит как-то уже за пределами понятия "локальное определение". Оно ведь на то и локальное, чтобы не быть видимым снаружи? Если надо специально, то можно завести указатель на локальный объект, все равно при таком механизме все локальные переменные находятся в точности на тех же местах при каждом вызове внешнего определения.
Сообщение Добавлено: Вс июн 19, 2016 22:00
  Заголовок сообщения:  Re: Структуры  Ответить с цитатой
Hishnik писал(а):
Это уже добавлено: viewtopic.php?f=23&t=2942

О как, а я как-то пропустил. Осталось добавить возможность делать локальные слова доступными снаружи и объявлять не только внутри слова во время определения, но и уже после.
Сообщение Добавлено: Вс июн 19, 2016 21:25

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


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