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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 07, 2007 15:27 
Вот еще интересней.
Две, правильные реализации выдают разный результат.
( второй, вроде правильно считает)

: FIB ( n -- n' )
DUP 1 > IF
DUP 1- RECURSE SWAP 2- RECURSE +
THEN ;

: FIB ( n -- n' )
DUP 2 <
IF
DROP 1
ELSE
DUP
2 - RECURSE
SWAP
1 - RECURSE
+
THEN
;
35 FIB

P.S. Где грабли :<


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 07, 2007 23:19 
Так, а теперь в методических целях можно дать и описание моей отладки этих примеров...

Начнём с чуть более простого, с фибоначчиевых функций. Я написал тестовый код (функции, соответсвенно я переименовал в FIB1 и FIB2):

Код:
: r 10 0 DO CR I FIB1 .  I FIB2 . LOOP ; r


Собственно, вывод сразу даёт понять где косяк:

Код:
0 1
1 1
1 2
2 3
3 5
5 8
8 13
13 21
21 34
34 55


Т.е. краевой случай fib(0)=1 в первой функции обрабатывается неправильно, и даёт не единицу, а ноль. Решение:

Код:
: FIB1 ( n -- fib*n ) DUP 1 >     IF
DUP 1- RECURSE SWAP 2 - RECURSE + ELSE
DROP 1                            THEN ;


Приступаем ко второму (точнее, первому примеру) -- Аккерману.

Но сперва слегка похимичим с оформлением кода:

Код:
: ACK ( x y -- ack*x*y )
OVER 0=                       IF
NIP 1+                        ELSE   \ f(0,y)=y+1             (1)
DUP 0=               IF
DROP 1- 1 RECURSE    ELSE            \ f(x,0)=f(x-1,1)        (2)
1- OVER SWAP RECURSE                 \ f(x,y)=f(x-1,f(x,y-1)) (3)
SWAP 1- SWAP RECURSE THEN     THEN ;


Так-то лучше...

Проверяем краевые случаи (как оно и полагается всегда при отладке рекурсивных функций):

Код:
0 0 ACK . \ (1)
4 0 ACK . \ (2)


А вот если попробовать

Код:
5 0 ACK . \ (2)


То тогда и вылетает. В принципе уже тогда возникает понимание, но давайте перепроверим, добавив в конец ACK:

Код:
: ACK ( x y -- ack*x*y )
...
SWAP 1- SWAP RECURSE THEN     THEN
CR DUP .
;


На 4 0 мы получим около ста строчек (т. е. около ста рекурсивных вызовов). В случае 5 0 я успеваю заметить что строчек больше чем несколько сотен перед вылетом SPF. Т. е. причина вроде бы в том что просто стека возвратов элементарно не хватает. Переполнение стека.

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

А для расширения обычного стека ничего особенного делать не надо:

Код:
CREATE ss 10000 ALLOT
HERE DUP S0 ! SP!

3 7 ACK .


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 13:42 
В файле

1. Подключаю INCLUDED_L
2. Подключаю S" файл" INCLUDED_L
3. BYE

то в этом случае файл с листингом не формируется.
а если BYE убрать и остаться в spf, то все нормально.

Вопрос: такое поведение INCLUDED_L допустио?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 14:09 
Не в сети

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

1. Подключаю INCLUDED_L
2. Подключаю S" файл" INCLUDED_L
3. BYE

то в этом случае файл с листингом не формируется.


Может у тебя BYE в самом файле для которого ты собираешься
формировать листинг? Тегда естественно. Листинг формируется
после завершения интерпретации файла.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 14:57 
Mihail писал(а):
Anonymous писал(а):
В файле

1. Подключаю INCLUDED_L
2. Подключаю S" файл" INCLUDED_L
3. BYE

то в этом случае файл с листингом не формируется.


Может у тебя BYE в самом файле для которого ты собираешься
формировать листинг? Тегда естественно. Листинг формируется
после завершения интерпретации файла.


Так и есть, теперь понятна причина.
Но думаю, что по BYE он тоже мог формироваться:)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 02, 2007 10:08 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Вот некоторый код для SPF4.18 вызывает у меня недопонимание
причин некоторой неработоспособности:)

Код:
: inter
  ." interpret"
\ EXIT \ еще интересней
  BEGIN
     BEGIN
       >IN @ #TIB @ + >IN !     \ возможно не требуется
       REFILL  0= IF EXIT THEN  \ REFILL-FILE
       0 SOURCE + C!
       #TIB @ 0= IF CR THEN
     #TIB @
     UNTIL
   TIB #TIB @   TYPE CR
  AGAIN
;
: init ['] inter &INTERPRET !  \ раньше это работало вместо tst
\       ['] REFILL-FILE TO REFILL
\     QUIT
   INTERPRET
;
: tst
  SAVE-SOURCE
\  N>R 
  -1 TO SOURCE-ID \ звRЎл REFILL -_ ¤_< < ( Є Є ЇR EVALUATE ), в.Є. Ўгд_а -_ ATIB.
  GetCommandLineA ASCIIZ> 
  SOURCE!
  PeekChar [CHAR] " = IF [CHAR] " ELSE BL THEN 
  PARSE 2DROP  \ Ё┐п ЇаR_а ┐┐л
  1 PARSE ?DUP IF

  &INTERPRET @ >R
  ['] inter &INTERPRET !
  ['] INCLUDED CATCH
  R> &INTERPRET !
                        THROW

  ELSE DROP ." ???" THEN
\  NR>
  RESTORE-SOURCE
  BYE
;

\  FALSE TO SPF-INIT?  \ если раскоментировать то ошибка в начале не возникает
' NOOP MAINX !
' tst TO <MAIN>
S" interpret.exe" SAVE
BYE

\ использую >interpret.exe файл >>12345
\ при этом стабильно исчезает первая строка. и в начале пишется об ошибке.


P.S. Что делается неправильно?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 02, 2007 17:22 
---


Последний раз редактировалось profiT Сб мар 01, 2008 00:22, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 06, 2007 08:12 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
profiT писал(а):
Kopa писал(а):
Вот некоторый код для SPF4.18 вызывает у меня недопонимание

А у меня просто непонимание этого кода. Обрисуйте примерно что он должен делать когда станет правильным.


В приведенном варианте - это получение входных данных из файла и
вывод их в поток вывода без преобразования ( так как есть).
В реальном коде слово, подменяющее INTERPRET имеет функциональное наполнение.


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

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
Есть такой код
Код:
CREATE :sss S" asd" S,
:sss COUNT TYPE

Печатается только sd

P.S. это правильно или что то еще необходимо:) сделать


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 06, 2007 11:01 
--


Последний раз редактировалось profiT Сб мар 01, 2008 00:20, всего редактировалось 2 раз(а).

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 06, 2007 11:21 
Не в сети

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

Вместо S, нужно S",
Код:
CREATE :sss S" asd" S",
:sss COUNT TYPE


Смотри src\compiler\spf_compile.f


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 18, 2008 08:46 
Скачал релиз SPF4.19
и скомпилировал spf4wc
При запуске spf4wc приложение не видно на экране, но в запушенных
задачах оно существует.

P.S. Подозрение на некорректную компиляцию в spf4.exe.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 18, 2008 09:56 
Файл spf.log создался? Оно хочет запускаться от корня форт-системы, чтобы найти подгружаемые файлы.


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

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
rvm писал(а):
Файл spf.log создался? Оно хочет запускаться от корня форт-системы, чтобы найти подгружаемые файлы.


Скопировал в корень и отловил при запуске такое сообщение.
" Приложение не было запущено, поскольку оно некорректно настроено.
Повторная установка приложения может решить данную проблему."

P.S. Это уже веселее:)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт янв 18, 2008 11:04 
У меня тако было на сборке по Вистой — см. Bug#1828051. Под XP все работает.


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

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


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

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


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

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