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

...
Google Search
Forth-FAQ Spy Grafic

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




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

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

Обзор темы - контейнеры с данными внутри кода
Автор Сообщение
  Заголовок сообщения:   Ответить с цитатой
вот, давно хотел сделать блокирование повторного входа в секцию.
(можно посмотреть на использование (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
Сообщение Добавлено: Пт апр 17, 2009 00:32
  Заголовок сообщения:   Ответить с цитатой
кстати, штука полезная оказалась.
покрутилось в голове и сошлось, что SLITERAL конструкция <: .... ;> и этот самый (BOX) выполняют одно и то же, поэтому
сейчас (BOX) внесен в ядро, через него определены строки, и все остальные подобные штуки. Вот.
Сообщение Добавлено: Ср апр 15, 2009 20:51
  Заголовок сообщения:   Ответить с цитатой
_Harry писал(а):
Кстати хотелось бы примерчик конкретно илюстрирующий полезность данного способа.

а вот, пожалуйста смотрите в пример ;)

_Harry писал(а):
Это я к тому что раз уж разговор об образовании пошел надо объяснять лучче

а это поправимо :)
Сообщение Добавлено: Пт мар 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.

       ." Адреса " ;

Это я к тому что раз уж разговор об образовании пошел надо объяснять лучче :)
Кстати хотелось бы примерчик конкретно илюстрирующий полезность данного способа.
Сообщение Добавлено: Пт мар 27, 2009 13:17
  Заголовок сообщения:   Ответить с цитатой
WingLion писал(а):
п.с. про "учебные цели" тут лучше не говорить, а то получается обучение "непойми-чему и нафига-оно-надо-зачем"

тот, кому надо на "учебные цели" не будет смотреть.

WingLion писал(а):
Чего мне непонятно, так это вопрос - неужели программист настолько ленивое животное, что не способен оторваться от кодирования очередного слова и не может вставить перед ним строчку: CREATE нужные-мне-данные 100 ALLOT и после этого вернуться к кодированию этого слова?

может, но оно не всегда надо. Не всегда хочется создавать себе проблемы.
Объявляя глобальное имя, всегда думаешь, что найдется умелец, который решит использовать удобное место для хранения своих данных.
То есть иногда нужно иметь приватные данные внутри слова, которые никто не сможет использовать без особого изврата.
А написать в коде BOX{ ... }BOX проще, чем писать: CREATE нужные-мне-данные 100 ALLOT
Сообщение Добавлено: Пт фев 06, 2009 19:01
  Заголовок сообщения:   Ответить с цитатой
Чего мне непонятно, так это вопрос - неужели программист настолько ленивое животное, что не способен оторваться от кодирования очередного слова и не может вставить перед ним строчку: CREATE нужные-мне-данные 100 ALLOT и после этого вернуться к кодированию этого слова?

п.с. про "учебные цели" тут лучше не говорить, а то получается обучение "непойми-чему и нафига-оно-надо-зачем"
Сообщение Добавлено: Пт фев 06, 2009 18:56
  Заголовок сообщения:   Ответить с цитатой
mOleg писал(а):
минусы:
1) создается лишнее имя
2) всего один массив (когда в случае с BOX{ можно делать столько, сколько душе угодно )

Код:
1 [C], 2 [C], 3 [C],
Сообщение Добавлено: Пт фев 06, 2009 18:29
  Заголовок сообщения:   Ответить с цитатой
Хищник писал(а):
Код:CONTAINER кучаинициализированногокода 1 [C], 2 [C], 3 [C],

минусы:
1) создается лишнее имя
2) всего один массив (когда в случае с BOX{ можно делать столько, сколько душе угодно )
Сообщение Добавлено: Пт фев 06, 2009 18:03
  Заголовок сообщения:   Ответить с цитатой
Код:
CONTAINER кучаинициализированногокода 1 [C], 2 [C], 3 [C],
Сообщение Добавлено: Пт фев 06, 2009 17:55
  Заголовок сообщения:   Ответить с цитатой
Хищник писал(а):
Прочитал. Исходя из прочитанного, и не понял, зачем это все было делать, если можно и без них класть данные в код?

значит невнимательно прочитал.
есть такое выражение "в образовательных целях", то есть показано как можно делать контейнеры данных в коде :) Причем пример не совсем бесполезный, так как внутри BOX{ }BOX можно не только резервировать пространство, но и инициализировать данные, что в случае других рассмотренных вариантов не работает.
Сообщение Добавлено: Пт фев 06, 2009 17:45
  Заголовок сообщения:   Ответить с цитатой
Прочитал. Исходя из прочитанного, и не понял, зачем это все было делать, если можно и без них класть данные в код?
Сообщение Добавлено: Пт фев 06, 2009 17:40
  Заголовок сообщения:   Ответить с цитатой
Хищник, читай внимательно первый пост в теме :)
Сообщение Добавлено: Пт фев 06, 2009 17:29
  Заголовок сообщения:   Ответить с цитатой
Ну это после того как BOX{ }BOX описаны. А зачем их описывать, если выделить память в пространстве кода можно и так?
Сообщение Добавлено: Пт фев 06, 2009 17:25
  Заголовок сообщения:   Ответить с цитатой
собственно, ведь я не утверждаю, что нельзя использовать другие методы, можно ведь делать так:

: 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
;
Сообщение Добавлено: Пт фев 06, 2009 16:53

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


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