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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 50 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 18:04 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
В процессе отладки кода и с целью контроля в ходе выполнения программы могла бы быть полезна возможность проверки, является ли некое слово созданным по CREATE. Как разновидность, это может включать и проверку QUAN/VALUE/VECT переменных (хотя бы с целью выяснения, корректна ли операция TO для них). При отладке можно, к примеру, собрать список всех переменных и вывести их текущие значения.
Варианты реализации
1) Проверка паттерна кода. Слова, созданные по CREATE, имеют какое-то определенное начало, которое можно "поймать". Недостаток в том, что такое же начало могут иметь и другие слова, или слова, сильно отличающиеся по действию от обычной переменной.
2) Флаг. Дешево и сердито.
3) Дописывание идентификаторов после Ret, но до следующей словарной статьи.
Вот этот последний вариант на первый взгляд выглядит достаточно интересным. Он обеспечивает более надежный контроль по сравнению с проверкой паттернов, поскольку такие слова, как CONSTANT и VARIABLE, могут самостоятельно установить необходимые идентификаторы, исключающие, например, возможность трактовки константы как переменной. Он не занимает флаг (фантазия на флаги и их значения может оказаться богатой). Наконец, он не мешает обычным механизмам поиска, поскольку LFA следующего слова располагается за ним и корректно указывает на LFA слова с идентификатором.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 19:07 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Я бы сделал несколько иначе:
Код:
0 VALUE DEBUG?
: VALUE
  VALUE
  DEBUG? IF LAST @ VALUE-LIST! THEN
;

Т.е. еще на этапе создания слова добавить его в соответствующий список(масив, дерево, словарь, любую другую удобную структуру данных). Такое решение позволяет "разграничить" разные списки слов, в отличии от идентификаторов после Ret. Т.к. в случае идентификаторов, например для вывода всех VALUE, придется пройтись по всему словарю. Конечно, при современных мощностях PC это не существенно.

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 19:11 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
VoidVolker писал(а):
Т.е. еще на этапе создания слова добавить его в соответствующий список(масив, дерево, словарь, любую другую удобную структуру данных). Такое решение позволяет "разграничить" разные списки слов, в отличии от идентификаторов после Ret. Т.к. в случае идентификаторов, например для вывода всех VALUE, придется пройтись по всему словарю. Конечно, при современных мощностях PC это не существенно.

Это, в принципе, на ту же тему, но по-другому реализовано.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 19:59 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Хищник писал(а):
хотя бы с целью выяснения, корректна ли операция TO для них

А не проще переопределить TO, чтобы операция была для них корректна.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 20:02 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Чтобы переопределить TO, надо знать, что искать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 20:13 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
флаг и только флаг :(


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 20:39 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
chess писал(а):
Чтобы переопределить TO, надо знать, что искать.

Переопределить TO, а соответсвено и те же QUAN/VALUE/VECT и все другие слова, с которыми можно работать через TO, создаваемые по CREATE или нет, с тем, чтобы уже на этапе компиляции шел контроль корректности присвоения по TO и на этапе исполнения отладки в этой части не было бы нужно в принципе.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 20:55 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
chess писал(а):
Переопределить TO, а соответсвено и те же QUAN/VALUE/VECT и все другие слова, с которыми можно работать через TO, создаваемые по CREATE или нет, с тем, чтобы уже на этапе компиляции шел контроль корректности присвоения по TO и на этапе исполнения отладки в этой части не было бы нужно в принципе.

При исполнении можно вводить строки вида 10 TO X. При этом X может оказаться VARIABLE, о чем забыл пользователь (не обязательно программист). А может оказаться просто словом, в результате чего эффект окажется непредсказуемым.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 22:23 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
: MY-CREATE-WORD CREATE ... тары-бары-растабары ... ;

MY-CREATE-WORD а-фигли?

Как считать такое слово? Созданным по CREATE или созданным другим создающим словом?

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 23:49 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Не знаю, что не так с SPF 4.20, но он генерирует исключение при попытке
сделать TO применительно к VARIABLE. Но если определить TO вот так :

: TO ' >BODY STATE @ IF LIT, ['] ! COMPILE, ELSE ! THEN ; IMMEDIATE

, то TO начинает прекрасно работать с VALUE VARIABLE CONSTANT VECT


Последний раз редактировалось Ethereal Сб авг 06, 2011 23:56, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Сб авг 06, 2011 23:51 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
Как считать такое слово? Созданным по CREATE или созданным другим создающим словом?


Если ловить паттерны, то оно тоже посчитается.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Вс авг 07, 2011 00:58 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Вот тебе для SP-Forth 4.20 тупое переопределение VALUE VECT TO такое, что
TO можно теперь лишь по отношению к VALUE VECT делать, в противном случае
будет THROW с выводом предупреждения. Фишка в том, что я перед VALUE и
VECT код процессора NOP добавил. Он и является признаком VALUE VECT.
А у других слов его быть не может ибо SP-Forth нигде не компилирует в коде
лишние и бессмысленные NOP-ы.
HEX
: VALUE VALUE
90 HERE E - 1 ALLOT DUP DUP 1+ -1 OVER +! -1 OVER 9 + +! E CMOVE> C!
;
: VECT VECT
90 HERE E - 1 ALLOT DUP DUP 1+ -1 OVER +! -1 OVER 9 + +! E CMOVE> C!
;
: TO
' DUP C@ 90 <> ABORT" Не вздумай сюда TO делать !!!"
A + STATE @ IF COMPILE, ELSE EXECUTE THEN
; IMMEDIATE

Самая фишка, что проверка на корректность TO срабатывает и в режиме интерпретации
и при компиляции новых слов. Попробуйте скомпилировать : TEST 0 TO DUP ;
У вас ничего не получится ;)


Последний раз редактировалось Ethereal Вс авг 07, 2011 04:11, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Вс авг 07, 2011 01:11 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Это получается процессорно-зависимое решение. Впрочем, это не так важно, важнее то, что это все равно паттерн :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Вс авг 07, 2011 03:09 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Вот тебе процессорно-независимое решение :

VOCABULARY VALUE-VECT
: VALUE
GET-CURRENT SWAP GET-ORDER VALUE-VECT DEFINITIONS SET-ORDER VALUE SET-CURRENT
;
: VECT
GET-CURRENT GET-ORDER VALUE-VECT DEFINITIONS SET-ORDER VECT SET-CURRENT
;
: TO
>R GET-ORDER ONLY VALUE-VECT
R> ['] TO CATCH DUP >R IF DROP THEN SET-ORDER R> THROW
; IMMEDIATE
ALSO VALUE-VECT

Попробуй записать по TO куда-нибудь, окромя VALUE и VECT ;)
У тебя просто не получится. Форт не найдет куда писать ;)

Единственный минус - когда работаешь с VALUE и VECT надо словарь
VALUE-VECT держать в порядке поиска, ибо все VALUE и VECT при их
определении концентрируются в нем.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Идентификация CREATEd слов
СообщениеДобавлено: Вс авг 07, 2011 03:33 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
А если добавить еще вот так :

: DEFINITIONS
GET-CURRENT
GET-ORDER VALUE-VECT DEFINITIONS GET-CURRENT >R SET-ORDER
R> DEFINITIONS GET-CURRENT = IF SET-CURRENT ELSE DROP THEN
;

то решение становится законченным. В словарь VALUE-VECT теперь нельзя
определить ничего, кроме VALUE и VECT (а VALUE и VECT всегда автоматически
определяются в этот словарь), а значит и TO нельзя в принципе применить ни к
чему кроме VALUE и VECT.

И никаких тебе флагов, паттернов ... и прочей фигни ...


Последний раз редактировалось Ethereal Вс авг 07, 2011 03:48, всего редактировалось 1 раз.

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

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


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

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


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

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