Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб апр 20, 2024 00:26

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Как сделать контроль парностей IF-THEN и остальных структур?
СообщениеДобавлено: Пн авг 04, 2008 08:03 
Не в сети

Зарегистрирован: Пт авг 01, 2008 02:20
Сообщения: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Как сделать контроль парностей IF-THEN и остальных структур?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сделать контроль парностей IF-THEN и остальных струк
СообщениеДобавлено: Пн авг 04, 2008 09:21 
victor79 писал(а):
Как сделать контроль парностей IF-THEN и остальных структур?


Обычно, вместе с ссылкой еще сохраняется уникальный код-флаг для контроля
допустимости завершающего терминатора текущей структуры управляющей конструкции.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 09:43 
Не в сети

Зарегистрирован: Пт авг 01, 2008 02:20
Сообщения: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
ну то что сохранять признак нужно это и так понятно, тока вся проблема в том, что когда я взглянул в определение IF мне как-то стало нехорошо. Куча вложенностей, определение через самого себя, и прочие непонятности. Хотелось бы примерчик, если не сложно.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 12:13 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
victor79 писал(а):
когда я взглянул в определение IF мне как-то стало нехорошо. Куча вложенностей, определение через самого себя, и прочие непонятности. Хотелось бы примерчик, если не сложно.


Какое определение IF ты смотрел.
В src\compiler\spf_immed_control.f
Код:
: IF  \ 94
\ Интерпретация: семантика неопределена.
\ Компиляция: ( C: -- orig )
\ Положить на управляющий стек позицию новой неразрешенной ссылки вперед orig.
\ Добавить семантику времени выполнения, данную ниже, к текущему определению.
\ Семантика незавершена, пока orig не разрешится, например, по THEN или ELSE.
\ Время выполнения: ( x -- )
\ Если все биты x нулевые, продолжать выполнение с позиции, заданной
\ разрешением orig.
  ?COMP 0 ?BRANCH, >MARK 1
; IMMEDIATE


Куда проще? Где тут определение через самого себя?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 12:47 
Не в сети

Зарегистрирован: Пт авг 01, 2008 02:20
Сообщения: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
очередной раз посмотрел, с каждым разом чуть яснее становится, но все же
в ?COMP и в ?BRANCH используется IF, откуда он его берет? если этот же, то получится зацикливание - что бы определить ?COMP нужно запросить IF, который в свую очередь снова запрашивает ?COMP
далее, >MARK записывает адрес ячейки куда нужно будет сохранить адрес перехода в переменную :-SET но дальше я не понимаю, переменная одна, а вложенных IF может быть много, как тогда поступается?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 12:52 
Не в сети

Зарегистрирован: Пт авг 01, 2008 02:20
Сообщения: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
при использовании вложенных IF никаких дополнительных управляющих слов я не заметил, отсюда предполагаю, что они должны взять определение текуще-определяемое, хотя может я просто неправильно понимаю про режимы компиляции-выполнения...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 12:58 
Не в сети

Зарегистрирован: Сб июл 26, 2008 06:22
Сообщения: 21
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Как сделать в "стандартных" фортах - не знаю. В моей реализации он автоматом при компиляции сделан. Причём контроль как парности, так и корректности вложенности.
Минус - нельзя переопределять слова if-then-begin-while и проч.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 13:22 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
victor79 писал(а):
очередной раз посмотрел, с каждым разом чуть яснее становится, но все же
в ?COMP и в ?BRANCH используется IF, откуда он его берет? если этот же, то получится зацикливание - что бы определить ?COMP нужно запросить IF, который в свую очередь снова запрашивает ?COMP
далее, >MARK записывает адрес ячейки куда нужно будет сохранить адрес перехода в переменную :-SET но дальше я не понимаю, переменная одна, а вложенных IF может быть много, как тогда поступается?


Есть книга по Форту Баранова, Ноздрунова "Язык Форт и его реализации"
c нее лучше начать изучение возможных технических решений в Форт языке.:) берется с forth.org.ru
если еще её не читали. Или опишите Ваши текущие задачи сопряженные с
Форт. т.к. механизмы реализации тех или иных возможностей могут
быть разные,
( Форт системы, часто создаются и расширяются из уже существующих)
А более приземленно в Форте нет ничего кроме цикла интерпритации
входного потока с незамысловатой семантикой его обработки.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 14:36 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
victor79 писал(а):
в ?COMP и в ?BRANCH используется IF, откуда он его берет? если этот же, то получится зацикливание


В ?COMP и в ?BRANCH IF не компилируется, а отрабатывается. Т.к. имеет признак немедленного исполнения.
Отработка его заключается в компиляции условного перехода. Т.е. в нотивном коде ?COMP и ?BRANCH никакого
IF нет. Для вызова IF из программы перед ним следует поставить [COMPILE] ( POSTPONE в данной версии целевого
компилятора не реализовано). На пример: определение WHILE выражено через IF .

вызови
spf4.exe devel\~mak\LIB\disasm.f SEE ?COMP

ЗЫ:
в http://fpauk.narod.ru/dbgwc11.rar src\spf.f
К
S" src\compiler\spf_translate.f" INCLUDED
добавь суффикс _L
S" src\compiler\spf_translate.f" INCLUDED_L

после сборки появится листинг

src\compiler\spf_translate.f_l


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 15:12 
Не в сети

Зарегистрирован: Пт авг 01, 2008 02:20
Сообщения: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
разбираясь дальше в >ORESOLVE заметил сообщение об ошибке при несоответствие пары иф-тогда. Получается все же есть контроль. Но все равно не понятно как работает переменная :-SET. В этой теме пока вопросов больше нет, спасибо.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 16:29 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
victor79 писал(а):
Но все равно не понятно как работает переменная :-SET.


Эта переменная пипа VALUE. :-SET сразу кладет на стек свое содержимое. Присвоение с помощью TO .
Значение :-SET задает ограничение оптимизатору. В ней отмечается точка передачи управления.
DP @ ( HERE ) возвращает вершину кодофайла - адрес между занятой и свободной областями.
Т.е. место куда будет компилироваться следующая команда.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 16:50 
Не в сети

Зарегистрирован: Пт авг 01, 2008 02:20
Сообщения: 33
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
: IF ?COMP 0 ?BRANCH, >MARK 1 ;
: >MARK DP @ DUP TO :-SET 4 - ;

т.е. конструкция типа
1 IF <ДЕЛАЕМЧТОНИБУДЬ>
1 IF <ДЕЛАЕМЕЩЕЧТОНИБУДЬ>
THEN
THEN

будет компилить оба перехода в одну и туже ячейку. Но насамом деле, если ковырять дальше там обнаруживаются более сложные манипуляции с этой переменной... настолько путанные, что я пока туда не полез.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 04, 2008 20:59 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
есть два момента, о которых вы забыли.
1) стек! А именно данные могут сколько угодно времени храниться на стеке данных, в том числе и информация для корректной отработки вложений.
2) вы не смотрели в код слов ?COMP ?BRANCH, >MARK

Если хотите понять как оно должно работать, то лучше взять SPF 3.75 - там нет оптимизатора, который сильно запутывает понимание кода.

Гораздо более понятно, как производится контроль вложенности компилирующих структур видно на примере конструкции:
BEGIN WHILE WHILE REPEAT THEN

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 05, 2008 11:59 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
victor79 писал(а):
Но насамом деле, если ковырять дальше там обнаруживаются более сложные манипуляции с этой переменной... настолько путанные, что я пока туда не полез.


THEN не смотрит содержимое переменной :-SET это только для оптимизатора.
Обрати внимание на слово DUP в >MARK.
Без оптимизатора было-бы так:
: >MARK DP @ 4 - ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


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

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


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

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