Forth http://fforum.winglion.ru/ |
|
Структуры http://fforum.winglion.ru/viewtopic.php?f=2&t=3101 |
Страница 2 из 2 |
Автор: | Hishnik [ Вт июн 21, 2016 00:57 ] |
Заголовок сообщения: | Re: Структуры |
Victor__v писал(а): Создающие слова можно и без Create делать. К примеру, : const : lit, [compile] ; ; CREATE и : имеют одинаковое начало. Просто CREATE еще компилирует код push HERE. |
Автор: | Victor__v [ Вт июн 21, 2016 20:50 ] |
Заголовок сообщения: | 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] |
Автор: | Victor__v [ Вт июн 28, 2016 23:11 ] |
Заголовок сообщения: | 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 |
Автор: | Victor__v [ Вс июл 17, 2016 13:00 ] |
Заголовок сообщения: | Re: Структуры |
Ещё более логичный подход. Имена отдельно значения отдельно И у нас снова слово, создающее слово, ведущее себя как словарь Код: 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 ; |
Автор: | Victor__v [ Ср сен 27, 2017 20:40 ] |
Заголовок сообщения: | 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 строит все отрицательные поля |
Автор: | _KROL [ Ср сен 27, 2017 22:25 ] |
Заголовок сообщения: | Re: Структуры |
Цитата: отрицательные поля Что это значит? Обьясните пожалуйста.
|
Автор: | Victor__v [ Ср сен 27, 2017 23:09 ] |
Заголовок сообщения: | 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-а |
Автор: | mOleg [ Чт сен 28, 2017 18:04 ] |
Заголовок сообщения: | Re: Структуры |
а зачем так сложно? ну, вот добавил смещение сразу: Код: -4 Struct: something 7 record: off_one byte: off_two word: off_tre EndStruct зачем усложнять себе жизнь? |
Автор: | Victor__v [ Пт сен 29, 2017 11:33 ] |
Заголовок сообщения: | Re: Структуры |
mOleg писал(а): а зачем так сложно? ну, вот добавил смещение сразу: Код: -4 Struct: something 7 record: off_one byte: off_two word: off_tre EndStruct зачем усложнять себе жизнь? Похожий вопрос. Зачем прописывать смещение, если без него удобней и в случае правок меньше ошибок? |
Автор: | mOleg [ Сб сен 30, 2017 20:10 ] |
Заголовок сообщения: | Re: Структуры |
Victor__v писал(а): Зачем прописывать смещение, если без него удобней и в случае правок меньше ошибок? ну, не напрягало ни разу 8) |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |