Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
вот, давно хотел сделать блокирование повторного входа в секцию. (можно посмотреть на использование (BOX) \ 15.04.2009 ~mOleg \ Сopyright [C] 2009 mOleg mininoleg@yahoo.com \ блокирование повторного исполнения секций кода между потоками Форт-системы
memory/ box.fts \ мне все больше нравится эта либа!
\ используя addr как начало блокируемой секции с мьютексом в начале секции \ выполнить одно из двух действий: если мьютекс (а это глобальная переменная) \ не занят, занять его, и передать управление на блокируемую секцию, после \ выполнения мьютекс освобождается, и возвращается флаг false успешности \ завершения операции. В противном случае, то есть мьютекс уже занят, выйти \ на точку PERMIT с ошибкой. Ошибка так же возвращается, если возникла ошибка \ во время выполнения кода в блокируемой секции. : (PERMIT) ( addr --> false | err ) DUP >R ?LockMutex IF R@ CELL + CATCH R> UnlockMutex ELSE RDROP NOTICE" Исполнение секции заблокировано!" THEN ;
\ начать описание блокируемой секции : BAN ( --> ) BOX{ 0 , ; IMMEDIATE
\ завершить описание блокируемой секции : PERMIT ( --> 0 | err ) RET, }BOX COMPILE (PERMIT) ; IMMEDIATE
?DEFINED test{ \EOF -- тестовая секция ---------------------------------------
.\lib\vocs\compile.fts
test{
: sample-a 720498 BAN 402984 PERMIT 598750 ; sample-a 598750 <> THROW THROW 402984 <> THROW 720498 <> THROW : sample-b 720498 BAN 94875 THROW PERMIT 598750 ; sample-b 598750 <> THROW 94875 <> THROW 720498 <> THROW : sample-c 720498 BAN 402984 RECURSE PERMIT 598750 ; \ тут RECURSE, чтобы не возиться с многозадачностью sample-c 598750 <> THROW THROW 598750 <> THROW 0 = THROW 720498 <> THROW 402984 <> THROW 720498 <> THROW }test </pre>
кстати box тоже изменился чуточку: <pre> \ 2009-02-05 ~mOleg \ Сopyright [C] 2009 mOleg mininoleg@yahoo.com \ контейнеры с данными внутри кода
\ обойти данные в коде, начинающиеся со следующей ячейки, \ вернуть адрес начала данных \ : (BOX) ( r: addr --> addr ) AR@ CELL + AR@ @ R+ ;
\ для использования в других структурах не-immediate варианты BOX[ ]BOX : BOX{ ( --> l: addr ) ?COMP COMPILE (BOX) HERE >L 0 , ; : }BOX ( l: addr --> ) HERE L@ - L> ! ;
\ начать описание контейнера : BOX[ ( --> l: addr ) BOX{ [COMPILE] [ ; IMMEDIATE
\ завершить описание контейнера, зафиксировать его размер, \ вернуться к состоянию компиляции : ]BOX ( l: addr --> ) }BOX ] ; IMMEDIATE
?DEFINED test{ \EOF -- тестовая секция ---------------------------------------
test{ : test 479875 BOX[ 49857 , -1984 , 564757 , ]BOX 98374 ; test 98374 <> THROW SWAP 479875 <> THROW DUP @ 49857 <> THROW DUP CELL + @ -1984 <> THROW 2 CELLS + @ 564757 <> THROW }test
вот, давно хотел сделать блокирование повторного входа в секцию. (можно посмотреть на использование (BOX) [pre]\ 15.04.2009 ~mOleg \ Сopyright [C] 2009 mOleg mininoleg@yahoo.com \ блокирование повторного исполнения секций кода между потоками Форт-системы
memory/ box.fts \ мне все больше нравится эта либа!
\ используя addr как начало блокируемой секции с мьютексом в начале секции \ выполнить одно из двух действий: если мьютекс (а это глобальная переменная) \ не занят, занять его, и передать управление на блокируемую секцию, после \ выполнения мьютекс освобождается, и возвращается флаг false успешности \ завершения операции. В противном случае, то есть мьютекс уже занят, выйти \ на точку PERMIT с ошибкой. Ошибка так же возвращается, если возникла ошибка \ во время выполнения кода в блокируемой секции. : (PERMIT) ( addr --> false | err ) DUP >R ?LockMutex IF R@ CELL + CATCH R> UnlockMutex ELSE RDROP NOTICE" Исполнение секции заблокировано!" THEN ;
\ начать описание блокируемой секции : BAN ( --> ) BOX{ 0 , ; IMMEDIATE
\ завершить описание блокируемой секции : PERMIT ( --> 0 | err ) RET, }BOX COMPILE (PERMIT) ; IMMEDIATE
?DEFINED test{ \EOF -- тестовая секция ---------------------------------------
.\lib\vocs\compile.fts
test{
: sample-a 720498 BAN 402984 PERMIT 598750 ; sample-a 598750 <> THROW THROW 402984 <> THROW 720498 <> THROW : sample-b 720498 BAN 94875 THROW PERMIT 598750 ; sample-b 598750 <> THROW 94875 <> THROW 720498 <> THROW : sample-c 720498 BAN 402984 RECURSE PERMIT 598750 ; \ тут RECURSE, чтобы не возиться с многозадачностью sample-c 598750 <> THROW THROW 598750 <> THROW 0 = THROW 720498 <> THROW 402984 <> THROW 720498 <> THROW }test </pre>
кстати box тоже изменился чуточку: <pre> \ 2009-02-05 ~mOleg \ Сopyright [C] 2009 mOleg mininoleg@yahoo.com \ контейнеры с данными внутри кода
\ обойти данные в коде, начинающиеся со следующей ячейки, \ вернуть адрес начала данных \ : (BOX) ( r: addr --> addr ) AR@ CELL + AR@ @ R+ ;
\ для использования в других структурах не-immediate варианты BOX[ ]BOX : BOX{ ( --> l: addr ) ?COMP COMPILE (BOX) HERE >L 0 , ; : }BOX ( l: addr --> ) HERE L@ - L> ! ;
\ начать описание контейнера : BOX[ ( --> l: addr ) BOX{ [COMPILE] [ ; IMMEDIATE
\ завершить описание контейнера, зафиксировать его размер, \ вернуться к состоянию компиляции : ]BOX ( l: addr --> ) }BOX ] ; IMMEDIATE
?DEFINED test{ \EOF -- тестовая секция ---------------------------------------
test{ : test 479875 BOX[ 49857 , -1984 , 564757 , ]BOX 98374 ; test 98374 <> THROW SWAP 479875 <> THROW DUP @ 49857 <> THROW DUP CELL + @ -1984 <> THROW 2 CELLS + @ 564757 <> THROW }test[/pre]
|
|
|
|
Добавлено: Пт апр 17, 2009 00:32 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
кстати, штука полезная оказалась.
покрутилось в голове и сошлось, что SLITERAL конструкция <: .... ;> и этот самый (BOX) выполняют одно и то же, поэтому
сейчас (BOX) внесен в ядро, через него определены строки, и все остальные подобные штуки. Вот.
кстати, штука полезная оказалась.
покрутилось в голове и сошлось, что SLITERAL конструкция <: .... ;> и этот самый (BOX) выполняют одно и то же, поэтому
сейчас (BOX) внесен в ядро, через него определены строки, и все остальные подобные штуки. Вот.
|
|
|
|
Добавлено: Ср апр 15, 2009 20:51 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
_Harry писал(а): Кстати хотелось бы примерчик конкретно илюстрирующий полезность данного способа. а вот, пожалуйста смотрите в пример _Harry писал(а): Это я к тому что раз уж разговор об образовании пошел надо объяснять лучче
а это поправимо
[quote="_Harry"]Кстати хотелось бы примерчик конкретно илюстрирующий полезность данного способа.[/quote] [url=http://fforum.winglion.ru/viewtopic.php?p=20502#20502]а вот, пожалуйста смотрите в пример[/url] ;)
[quote="_Harry"]Это я к тому что раз уж разговор об образовании пошел надо объяснять лучче [/quote]
а это поправимо :)
|
|
|
|
Добавлено: Пт мар 27, 2009 13:25 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Если говорить об образовательных целях,
то надо бы так:
Код: \ 2009-02-05 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ контейнеры с данными внутри кода (набросок)
\ выложить адрес содержимого контейнера
\ и обойти данные в коде
\ : (BOX) ( r: addr --> ) R@ CELL + R> @ JUMP ; : (BOX) ( r: addr --> addr ) \ стековая диаграмма вроде должна быть такая??? R@ CELL + \ Положить на стек адрес начала контейнера данных R> @ JUMP ; \ Перейти на адрес следующий за контейнером
\ начать описание контейнера
: BOX{ ( --> )
COMPILE (BOX) HERE 0 A, \ по идее надо написать зачем пишем 0
[COMPILE] [ ; IMMEDIATE
: }BOX ( addr --> ) HERE SWAP A! ] ; IMMEDIATE \ ну и здесь тоже что за адрес зачем пишется?
\EOF пример использования:
: test ." контейнер данных в коде начинается с "
BOX{ 10 ALLOT }BOX H.
." Адреса " ;
Это я к тому что раз уж разговор об образовании пошел надо объяснять лучче
Кстати хотелось бы примерчик конкретно илюстрирующий полезность данного способа.
Если говорить об образовательных целях,
то надо бы так:
[code]\ 2009-02-05 ~mOleg
\ Сopyright [C] 2009 mOleg mininoleg@yahoo.com
\ контейнеры с данными внутри кода (набросок)
\ выложить адрес содержимого контейнера
\ и обойти данные в коде
\ : (BOX) ( r: addr --> ) R@ CELL + R> @ JUMP ; : (BOX) ( r: addr --> addr ) \ стековая диаграмма вроде должна быть такая??? R@ CELL + \ Положить на стек адрес начала контейнера данных R> @ JUMP ; \ Перейти на адрес следующий за контейнером
\ начать описание контейнера
: BOX{ ( --> )
COMPILE (BOX) HERE 0 A, \ по идее надо написать зачем пишем 0
[COMPILE] [ ; IMMEDIATE
: }BOX ( addr --> ) HERE SWAP A! ] ; IMMEDIATE \ ну и здесь тоже что за адрес зачем пишется?
\EOF пример использования:
: test ." контейнер данных в коде начинается с "
BOX{ 10 ALLOT }BOX H.
." Адреса " ;[/code]
Это я к тому что раз уж разговор об образовании пошел надо объяснять лучче :)
Кстати хотелось бы примерчик конкретно илюстрирующий полезность данного способа.
|
|
|
|
Добавлено: Пт мар 27, 2009 13:17 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
WingLion писал(а): п.с. про "учебные цели" тут лучше не говорить, а то получается обучение "непойми-чему и нафига-оно-надо-зачем" тот, кому надо на "учебные цели" не будет смотреть. WingLion писал(а): Чего мне непонятно, так это вопрос - неужели программист настолько ленивое животное, что не способен оторваться от кодирования очередного слова и не может вставить перед ним строчку: CREATE нужные-мне-данные 100 ALLOT и после этого вернуться к кодированию этого слова?
может, но оно не всегда надо. Не всегда хочется создавать себе проблемы.
Объявляя глобальное имя, всегда думаешь, что найдется умелец, который решит использовать удобное место для хранения своих данных.
То есть иногда нужно иметь приватные данные внутри слова, которые никто не сможет использовать без особого изврата.
А написать в коде BOX{ ... }BOX проще, чем писать: CREATE нужные-мне-данные 100 ALLOT
[quote="WingLion"]п.с. про "учебные цели" тут лучше не говорить, а то получается обучение "непойми-чему и нафига-оно-надо-зачем"[/quote] тот, кому надо на "учебные цели" не будет смотреть.
[quote="WingLion"]Чего мне непонятно, так это вопрос - неужели программист настолько ленивое животное, что не способен оторваться от кодирования очередного слова и не может вставить перед ним строчку: CREATE нужные-мне-данные 100 ALLOT и после этого вернуться к кодированию этого слова?[/quote]
может, но оно не всегда надо. Не всегда хочется создавать себе проблемы.
Объявляя глобальное имя, всегда думаешь, что найдется умелец, который решит использовать удобное место для хранения своих данных.
То есть иногда нужно иметь приватные данные внутри слова, которые никто не сможет использовать без особого изврата.
А написать в коде BOX{ ... }BOX проще, чем писать: CREATE нужные-мне-данные 100 ALLOT
|
|
|
|
Добавлено: Пт фев 06, 2009 19:01 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Чего мне непонятно, так это вопрос - неужели программист настолько ленивое животное, что не способен оторваться от кодирования очередного слова и не может вставить перед ним строчку: CREATE нужные-мне-данные 100 ALLOT и после этого вернуться к кодированию этого слова?
п.с. про "учебные цели" тут лучше не говорить, а то получается обучение "непойми-чему и нафига-оно-надо-зачем"
Чего мне непонятно, так это вопрос - неужели программист настолько ленивое животное, что не способен оторваться от кодирования очередного слова и не может вставить перед ним строчку: [b]CREATE нужные-мне-данные 100 ALLOT [/b] и после этого вернуться к кодированию этого слова?
п.с. про "учебные цели" тут лучше не говорить, а то получается обучение "непойми-чему и нафига-оно-надо-зачем"
|
|
|
|
Добавлено: Пт фев 06, 2009 18:56 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg писал(а): минусы: 1) создается лишнее имя 2) всего один массив (когда в случае с BOX{ можно делать столько, сколько душе угодно )
Код: 1 [C], 2 [C], 3 [C],
[quote="mOleg"]минусы: 1) создается лишнее имя 2) всего один массив (когда в случае с BOX{ можно делать столько, сколько душе угодно )[/quote]
[code]1 [C], 2 [C], 3 [C],[/code]
|
|
|
|
Добавлено: Пт фев 06, 2009 18:29 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): Код:CONTAINER кучаинициализированногокода 1 [C], 2 [C], 3 [C],
минусы:
1) создается лишнее имя
2) всего один массив (когда в случае с BOX{ можно делать столько, сколько душе угодно )
[quote="Хищник"]Код:CONTAINER кучаинициализированногокода 1 [C], 2 [C], 3 [C],[/quote]
минусы:
1) создается лишнее имя
2) всего один массив (когда в случае с BOX{ можно делать столько, сколько душе угодно )
|
|
|
|
Добавлено: Пт фев 06, 2009 18:03 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Код: CONTAINER кучаинициализированногокода 1 [C], 2 [C], 3 [C],
[code]CONTAINER кучаинициализированногокода 1 [C], 2 [C], 3 [C],[/code]
|
|
|
|
Добавлено: Пт фев 06, 2009 17:55 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): Прочитал. Исходя из прочитанного, и не понял, зачем это все было делать, если можно и без них класть данные в код?
значит невнимательно прочитал.
есть такое выражение "в образовательных целях", то есть показано как можно делать контейнеры данных в коде Причем пример не совсем бесполезный, так как внутри BOX{ }BOX можно не только резервировать пространство, но и инициализировать данные, что в случае других рассмотренных вариантов не работает.
[quote="Хищник"]Прочитал. Исходя из прочитанного, и не понял, зачем это все было делать, если можно и без них класть данные в код?[/quote]
значит невнимательно прочитал.
есть такое выражение "в образовательных целях", то есть показано как можно делать контейнеры данных в коде :) Причем пример не совсем бесполезный, так как внутри BOX{ }BOX можно не только резервировать пространство, но и инициализировать данные, что в случае других рассмотренных вариантов не работает.
|
|
|
|
Добавлено: Пт фев 06, 2009 17:45 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Прочитал. Исходя из прочитанного, и не понял, зачем это все было делать, если можно и без них класть данные в код?
Прочитал. Исходя из прочитанного, и не понял, зачем это все было делать, если можно и без них класть данные в код?
|
|
|
|
Добавлено: Пт фев 06, 2009 17:40 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник, читай внимательно первый пост в теме
Хищник, читай внимательно первый пост в теме :)
|
|
|
|
Добавлено: Пт фев 06, 2009 17:29 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Ну это после того как BOX{ }BOX описаны. А зачем их описывать, если выделить память в пространстве кода можно и так?
Ну это после того как BOX{ }BOX описаны. А зачем их описывать, если выделить память в пространстве кода можно и так?
|
|
|
|
Добавлено: Пт фев 06, 2009 17:25 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
собственно, ведь я не утверждаю, что нельзя использовать другие методы, можно ведь делать так:
: sample s" space for data" ( --> addr # ) ;
то есть обычные литеральные строки использовать для хранения данных, можно еще кучу вариантов придумать.
Речь идео об иллюстрации использования стека возвратов для управления логикой работы программы, и возможности использования пространства кода в целях хранения данных (без создания дополнительных, в том числе порождающих, слов).
собственно, ведь я не утверждаю, что нельзя использовать другие методы, можно ведь делать так:
: sample s" space for data" ( --> addr # ) ;
то есть обычные литеральные строки использовать для хранения данных, можно еще кучу вариантов придумать.
Речь идео об иллюстрации использования стека возвратов для управления логикой работы программы, и возможности использования пространства кода в целях хранения данных (без создания дополнительных, в том числе порождающих, слов).
|
|
|
|
Добавлено: Пт фев 06, 2009 17:24 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Хищник писал(а): : CONTAINER CREATE [C]HERE , DOES> @ ; CONTAINER КУЧАДАННЫХВКОДЕ 10 [C]ALLOT : samlpe BOX{ 10 ALLOT }BOX ." адрес первого ящика: " . CR BOX{ 20 ALLOT }BOX ." адрес второго ящика: " . CR ;
[quote="Хищник"]: CONTAINER CREATE [C]HERE , DOES> @ ; CONTAINER КУЧАДАННЫХВКОДЕ 10 [C]ALLOT[/quote] [pre]: samlpe BOX{ 10 ALLOT }BOX ." адрес первого ящика: " . CR BOX{ 20 ALLOT }BOX ." адрес второго ящика: " . CR ;[/pre]
|
|
|
|
Добавлено: Пт фев 06, 2009 16:53 |
|
|
|
|