Forth
http://fforum.winglion.ru/

Глюк SPF?
http://fforum.winglion.ru/viewtopic.php?f=18&t=1533
Страница 1 из 7

Автор:  seu [ Ср окт 01, 2008 06:02 ]
Заголовок сообщения:  Глюк SPF?

При попытке выполнить
Код:
SOME_ADDR -1 +!
SPF вылетает. Вроде, в документации ничего не было сказано о запрете прибавления отрицательных чисел.

Автор:  mOleg [ Ср окт 01, 2008 06:05 ]
Заголовок сообщения: 

seu писал(а):
SPF вылетает. Вроде, в документации ничего не было сказано о запрете прибавления отрицательных чисел.

вылетать действительно не должен, а должен выдвать исключение.
вы поменяли параметры местами, надо было так:
-1 SOME_ADDR +!

Автор:  seu [ Ср окт 01, 2008 06:24 ]
Заголовок сообщения: 

Спасибо. А я как раз уже хотел попросить удалить тему... :D

Вывод: век живи, век учись, дураком помрёшь.

Автор:  seu [ Ср окт 01, 2008 07:08 ]
Заголовок сообщения: 

Опять какая-то фигня получается. Пишу программку, рассчитывающую ходы фигуры на поле с третьей координатой. Выглядит это так:
Изображение
Фигура может ходить в восьми направлениях. Вот исходник:
Код:
REQUIRE { lib/ext/locals.f
REQUIRE STRUCT:   lib/ext/struct.f

2 CONSTANT OrigCoordX
2 CONSTANT OrigCoordY
0 CONSTANT OrigCoordZ

2 CONSTANT Steps

STRUCT: Coord
  CELL -- X
  CELL -- Y
  CELL -- Z
;STRUCT

STRUCT: Way
  Coord::/SIZE -- Up
  Coord::/SIZE -- Down
  Coord::/SIZE -- Left
  Coord::/SIZE -- Right
  Coord::/SIZE -- UpLeft
  Coord::/SIZE -- UpRight
  Coord::/SIZE -- DownLeft
  Coord::/SIZE -- DownRight
;STRUCT

CREATE Ways Way::/SIZE ALLOT

: BadCoord? ( X Y Z -- flag )
    { tX tY tZ -- }
    tX tY MIN 0< tX tY MAX 4 > OR
    tZ 1 RSHIFT 0<> OR ;

: X+1 ( addr -- ) Coord::X 1+! ;
: X-1 ( addr -- ) Coord::X -1 SWAP +! ;
: Y+1 ( addr -- ) Coord::Y 1+! ;
: Y-1 ( addr -- ) Coord::Y -1 SWAP +! ;
: Z=0 ( addr -- ) Coord::Z 0! ;
: Z=1 ( addr -- ) Coord::Z 1 ! ;

: SetUpCoords ( -- )
  8 0 DO
    Ways I Coord::/SIZE * +
    DUP Coord::X OrigCoordX SWAP !
    DUP Coord::Y OrigCoordY SWAP !
    Coord::Z OrigCoordZ SWAP !
  LOOP ;

: Print ( -- )
  8 0 DO
    Ways I Coord::/SIZE * +
    DUP Coord::X @ .
    DUP Coord::Y @ .
    Coord::Z @ . CR
  LOOP ;

: KING ( -- )
  SetUpCoords
  Steps 0 DO
    Ways Way::Up Y-1
    Ways Way::Down Y+1
    Ways Way::Left X-1
    Ways Way::Right X+1
\    Ways Way::UpLeft DUP Coord::Z @ 0= IF DUP DUP X-1 Y-1 Z=1 ELSE Z=0 THEN
\    Ways Way::UpRight DUP Coord::Z @ 0= IF DUP Y-1 Z=1 ELSE DUP X+1 Z=0 THEN
\    Ways Way::DownLeft DUP Coord::Z @ 0= IF DUP X-1 Z=1 ELSE DUP Y+1 Z=0 THEN
\    Ways Way::DownRight DUP Coord::Z @ 0= IF Z=1 ELSE DUP DUP X+1 Y+1 Z=0 THEN

    Print
  LOOP ;

\ KING
Строки, перед которыми стоят комментарии, вызывают exception. Это пропадает, если из строк удалить слово @ (после чего, естественно, вся конструкция теряет смысл). Это -- глюк SPF или мой?

Автор:  mOleg [ Ср окт 01, 2008 07:55 ]
Заголовок сообщения: 

seu писал(а):
Это -- глюк SPF или мой?

СПФ достаточно стабильная система, поэтому наверняка ваш, или библиотеки, которую вы используете.
Выглядит вроде нормально текст, но попытка получить необходимое смещение прямо в консоли выдает какую-то чушь.

Автор:  mOleg [ Ср окт 01, 2008 08:04 ]
Заголовок сообщения: 

вобщем, глянул я в struct.f . Я бы не назвал приведенную либу нормально рабочей :(
попробуйте использовать мою .\devel\~moleg\lib\struct\struct.f
Она посложнее, но зато там все есть. Вроде ошибок не находил (найдете скажу спасибо)

Автор:  Pretorian [ Ср окт 01, 2008 08:25 ]
Заголовок сообщения: 

Попробуйте прочитать доку по struct.f
http://spf.cvs.sourceforge.net/viewvc/s ... struct.pdf
Незабывайте что данная структура хранит все данные в куче, а не в кодофайле, а значит нужна будет инициализация структур при сохранении наработанного образа системы.
P.S. Покрайней мере с данной либой у меня проблем не было.

Автор:  Mihail [ Ср окт 01, 2008 10:58 ]
Заголовок сообщения: 

seu писал(а):
: Z=1 ( addr -- ) Coord::Z 1 ! ;


Опять перепутал парадок
: Z=1 ( addr -- ) Coord::Z 1 SWAP ! ;

Автор:  seu [ Ср окт 01, 2008 19:01 ]
Заголовок сообщения: 

Mihail
Точно. Спасибо. Всё моя невнимательность.

Автор:  Mihail [ Ср окт 01, 2008 20:03 ]
Заголовок сообщения: 

mOleg писал(а):
Она посложнее, но зато там все есть

И этой ненужно
Код:
REQUIRE { lib/ext/locals.f

2 CONSTANT OrigCoordX
2 CONSTANT OrigCoordY
0 CONSTANT OrigCoordZ

2 CONSTANT Steps

0

  CELL -- Coord_X
  CELL -- Coord_Y
  CELL -- Coord_Z
CONSTANT  /Coord

0
  /Coord -- Way_Up
  /Coord -- Way_Down
  /Coord -- Way_Left
  /Coord -- Way_Right
  /Coord -- Way_UpLeft
  /Coord -- Way_UpRight
  /Coord -- Way_DownLeft
  /Coord -- Way_DownRight
CONSTANT /Way


CREATE Ways /Way ALLOT

: BadCoord? ( X Y Z -- flag )
    { tX tY tZ -- }
    tX tY MIN 0< tX tY MAX 4 > OR
    tZ 1 RSHIFT 0<> OR ;

: X+1 ( addr -- ) Coord_X 1+! ;
: X-1 ( addr -- ) Coord_X -1 SWAP +! ;
: Y+1 ( addr -- ) Coord_Y 1+! ;
: Y-1 ( addr -- ) Coord_Y -1 SWAP +! ;
: Z=0 ( addr -- ) Coord_Z 0! ;
: Z=1 ( addr -- ) Coord_Z 1 SWAP ! ;

: SetUpCoords ( -- )
  8 0 DO
    Ways I /Coord * +
    DUP Coord_X OrigCoordX SWAP !
    DUP Coord_Y OrigCoordY SWAP !
    Coord_Z OrigCoordZ SWAP !
  LOOP ;

: Print ( -- )
  8 0 DO
    Ways I /Coord * +
    DUP Coord_X @ .
    DUP Coord_Y @ .
    Coord_Z @ . CR
  LOOP ;

: KING ( -- )
  SetUpCoords
  Steps 0 DO
    Ways Way_Up Y-1
    Ways Way_Down Y+1
    Ways Way_Left X-1
    Ways Way_Right X+1
    Ways Way_UpLeft DUP Coord_Z @ 0= IF DUP DUP  X-1  Y-1 Z=1 ELSE Z=0 THEN
    Ways Way_UpRight DUP Coord_Z @ 0= IF DUP Y-1 Z=1 ELSE DUP X+1 Z=0 THEN
    Ways Way_DownLeft DUP Coord_Z @ 0= IF DUP X-1 Z=1 ELSE DUP Y+1 Z=0 THEN
    Ways Way_DownRight DUP Coord_Z @ 0= IF Z=1 ELSE DUP DUP X+1 Y+1 Z=0 THEN

    Print
  LOOP ;

Автор:  Гость [ Ср май 13, 2009 14:56 ]
Заголовок сообщения: 

Код:
: NOTFOUND 
           OVER C@ [CHAR] * = IF TYPE CR       
                               ELSE NOTFOUND
                               THEN
;
*****
***
**
*


Терминальный вывод
Код:
****
***
**
Exception #-4 ....
*
^  -4 Исчерпание стека


P.S. Ошибка?
или недопонимание использования NOTFOUND?


[/code]

Автор:  garbler [ Ср май 13, 2009 17:47 ]
Заголовок сообщения: 

NOTFOUND вызывается после поиска слова, а не до. поскольку * уже есть в словаре, то она и выполняется (на пустом стеке). определи любое из указанных тобой слов и оно станет находиться и, как следствие - выполняться/компилироваться.

Код:
: INTERPRET_ ( -> ) \ интерпретировать входной поток
  BEGIN
    PARSE-NAME DUP
  WHILE
    SFIND ?DUP
    IF
         STATE @ =
         IF COMPILE, ELSE EXECUTE THEN
    ELSE
         S" NOTFOUND" SFIND
         IF EXECUTE
         ELSE 2DROP ?SLITERAL THEN
    THEN
    ?STACK
  REPEAT 2DROP
;


всё это видно из исходника, приведённого выше, как следствие:

Код:
: NOTFOUND 
           OVER C@ [CHAR] * = IF TYPE CR       
                               ELSE NOTFOUND
                               THEN
;

: ** ." I'm twostar" CR ;
*****
***
**
*

BYE

    SP-FORTH - ANS FORTH 94 for Win95/98/ME/NT/2000/XP
    Open source project at http://spf.sf.net
    Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov
    Version 4.19 Build 001 at 14.Jan.2008

    NOTFOUND isn't unique
    Ok
    Ok
    Ok
    *****
    Ok
    ***
    Ok
    I'm twostar
    Ok
    *
    ^ -4 Stack underflow
    Ok


p.s. или я "капитан очевидность" ?

Автор:  Гость [ Чт май 14, 2009 07:21 ]
Заголовок сообщения: 

garbler писал(а):
p.s. или я "капитан очевидность" ?


Точно. Мозги тоже могут глючить:)

P.S. Фантомные сообщения можно удалять.

Автор:  Kopa [ Вт май 19, 2009 15:01 ]
Заголовок сообщения: 

Появился небольшой вопрос.

Подозрение на различие в интерпритации файла
с 0x0D 0x0A разделителем строк
и содержащий в качестве разделителя только 0x0A
( возможно в слове REFILL )

P.S. Это нормально? ( сборка 4.20 )

Автор:  Mihail [ Вт май 19, 2009 17:56 ]
Заголовок сообщения: 

Kopa писал(а):
Подозрение на различие в интерпритации файла
с 0x0D 0x0A разделителем строк
и содержащий в качестве разделителя только 0x0A
( возможно в слове REFILL )


Была у меня какая-то проблема из-за этого различия.
Подозрение проверяется:

SOURCE DUP U. DUMP

Kopa писал(а):
Это нормально?


Различие надо-бы ликведировать.

Страница 1 из 7 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/