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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Неявная рекурсия
СообщениеДобавлено: Вс авг 16, 2009 13:19 
Не в сети

Зарегистрирован: Вс авг 16, 2009 13:05
Сообщения: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Как решить на форте такую проблему, например:
Код:
: AA ( n -- ) 1 - DUP IF BB ELSE DROP THEN ;
: BB ( n -- ) AA ;
5 BB

В принципе я знаю, как ее решить:
Код:
: AA ( a n -- ) 1 - DUP IF OVER EXECUTE ELSE 2DROP THEN ;
: BB ( a n -- ) AA ;
' BB 5 BB

Но по моему такое решение не очень красивое.
Можно ли по другому решить? Если да, то как?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 16, 2009 13:32 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
а проблема то в чем?
В том, что по первой строчке форт-система ошибку выдает с ненайденым словом BB?
Так она его и не найдет, потому что оно не определено до следующей строчки.

А, вообще, для организации рекурсии в Форте есть слово RECURSE

ANSI стандарт 94г писал(а):
6.1.2120 RECURSE
CORE
Интерпретация: Семантика интерпретации для этого слова не определена.

Компиляция: ( -- )
Добавляет семантику выполнения текущего определения в текущее
определение. Неопределенная ситуация существует, если RECURSE
появляется в определении после DOES>.

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


Последний раз редактировалось WingLion Вс авг 16, 2009 13:43, всего редактировалось 1 раз.

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

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

во-вторых, рекурсивный алгоритм можно представить циклом

будет
"столько-то раз повторить часть функции до рекурсивного вызова (меняя параметры и т.д.)"
"столько же раз повторить часть функции после рекурсивного вызова самой себя"

вроде
: A b c d A e f ;
тут b c d - часть до вызова e f - после

цикл будет таким, что сначала повторяется b c d , при этом с переменными и структурами данных происходит то же, что было бы. если бы вызывалась рекурсивно А, т.к. каждый вызов приводил бы как-раз к выполнению очередного b c d

затем нужно определённое количество раз повторить e f
иммитируя действия после возврата из рекурсивного вызова самой себя


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 16, 2009 13:46 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
вопрос писал(а):
затем нужно определённое количество раз повторить e f
иммитируя действия после возврата из рекурсивного вызова самой себя


А отматывать измененные переменные назад кто будет?

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


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

Зарегистрирован: Вс авг 16, 2009 13:05
Сообщения: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Вы бы хоть название темы прочитали. Меня интересует именно НЕЯВНАЯ рекурсия, а как обычную рекурсию написать я знаю.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Цитата:
вопрос писал(а):
затем нужно определённое количество раз повторить e f
иммитируя действия после возврата из рекурсивного вызова самой себя


А отматывать измененные переменные назад кто будет?
это подразумевается. Каждая e f в любом случае что-то делает с переменными - хоть после рекурсии, хоть после цикла.

САм рекурсивынй вызов (call) ничего ведь с переменными не делает


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
hardreset писал(а):
Вы бы хоть название темы прочитали. Меня интересует именно НЕЯВНАЯ рекурсия, а как обычную рекурсию написать я знаю.

Хм...
ну, метод на самом деле тот же.
и кстати в первом сообщении правильный.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 16, 2009 13:57 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
hardreset писал(а):
Вы бы хоть название темы прочитали. Меня интересует именно НЕЯВНАЯ рекурсия, а как обычную рекурсию написать я знаю.


Вы бы тоже написали, что именно хотите получить? а то... гадать как-то неправильно.

И чем не нравится явная рекурсия?

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 16, 2009 14:00 
Не в сети
Administrator
Administrator
Аватара пользователя

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


правда? А если у меня в процессе вычислений память выделяется (формально, появляется пространство с новыми переменными)? И вычисления прямо завязаны на объем занятой памяти? Что получится?

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


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

Зарегистрирован: Вс авг 16, 2009 13:05
Сообщения: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
У меня есть два слова, первое вызывает второе, а второе вызывает первое. И мне надо это все реализовать.
Вообще, есть в форте какие-нибудь механизмы использования слов, которые еще не определены?

P.S. Извините, если я не точно выразился в своем первом посте.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
hardreset писал(а):
У меня есть два слова, первое вызывает второе, а второе вызывает первое. И мне надо это все реализовать.
Вообще, есть в форте какие-нибудь механизмы использования слов, которые еще не определены?

P.S. Извините, если я не точно выразился в своем первом посте.

я привык, что это называется перекрёстная рекурсия

другого способа вызвать функцмю, кроме перехода по адресу, по которому она располагается - нет

как оформить вызов - то же самое - как передать адрес для перехода - зависит от языка и вкуса
поэтому, проблема сводится к тому "как использовать в функции адрес перехода, ещё неизвестный на момент её определения"


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

Зарегистрирован: Вс авг 16, 2009 13:05
Сообщения: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Значит, мое решение вполне нормальное и ничего другого уже не придумаешь (чтобы оставалось два слова, т.е. RECURSE не катит)?


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

Зарегистрирован: Вс авг 16, 2009 13:05
Сообщения: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Цитата:
И чем не нравится явная рекурсия?

Я пишу интерпретатор лиспа на форте и неявная (перекрестная) рекурсия мне необходима.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 16, 2009 15:44 
Не в сети
Administrator
Administrator
Аватара пользователя

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

Код:
VECT dummy

: AA dummy ;
: BB AA ;
' BB TO dummy


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
hardreset писал(а):
Я пишу интерпретатор лиспа на форте и неявная (перекрестная) рекурсия мне необходима.


Тогда действительно векторные слова, как сказал Хищник, использовать можно.
Или наворачивать многопроходную компиляцию.

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


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

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


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

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


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

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