Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт мар 19, 2024 07:16

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: ANS в SPF
СообщениеДобавлено: Вт фев 19, 2008 23:33 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
http://fforum.winglion.ru/viewtopic.php?p=12969#12969
Forthware писал(а):
Ну вот, в SPF заявлена тоже, а с блоками он не работает.

Разве BLOCK и BLOCK-EXT обязательны?

ANS'94 писал(а):
The optional Block word set


Цитата:
3. Usage requirements

A system shall provide all of the words defined in 6.1 Core Words. It may also provide
any words defined in the optional word sets and extensions word sets.
[...]
A system need not provide all words in executable form. The implementation may provide
definitions, including definitions of words in the Core word set, in source form only. If
so, the mechanism for adding the definitions to the dictionary is implementation defined.

_________________
http://forth.org.ru/~ygrek


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
ygrek писал(а):
Разве BLOCK и BLOCK-EXT обязательны?
Обязательны если присутствует File-access word set. Это упоминается многократно в стандарте. Например в 11.3.2:
Цитата:
11.3.2 Blocks in files
If the File-Access word set is implemented, the Block word set shall be implemented.

На самом деле, в SPF Block word set присутствует, причем в комменариях указано что автор знает про необходимость его включения. Однако, реально, слова из этого расширения ничего не делают, всегда возвращая ошибку про неверный номер блока. Грубая такая заглушка. ;)
Я понимаю, что блоки никому нафиг ненадо, но так как они реализованы сейчас в ансификации СПФ - не соответствует стандарту.

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Значит нужно исправление. Есть желающие нарисовать BLOCK wordset?

_________________
http://forth.org.ru/~ygrek


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
ygrek писал(а):
Значит нужно исправление. Есть желающие нарисовать BLOCK wordset?
Я могу, он у меня есть полностью на АНСИ написанный, значит и к СПФ приклетися должен. Хотя надо потестить, конечно. :)

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Я с СПФ не разработчик, поэтому могу выложить исходники прямо тут, а кто более опытный можете вставить куда лучше в СПФ. Так пойдет?

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Конечно. Можете как вам удобнее постить или сюда или в spf-dev или в багтрекер.

_________________
http://forth.org.ru/~ygrek


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Вот, приблизительно так. Если есть вопросы, спрашивайте.

Код:
\ EVALUATE - должно ложить 0 в BLK перед своим выполнением, и восстанавливать в конце
\ REFILL - будет иметь вид:
\ : REFILL BLK @ IF 1 BLK +! 0 >IN ! TRUE ELSE ( старый  REFILL ) THEN ;
\ SOURCE - будет иметь вид:
\ : SOURCE BLK @ IF BLK @ BLOCK 1024 ELSE ( старый SOURCE ) THEN ;
\ бэкслеш "\" будет иметь вид:
\ : \ BLK @ IF >IN @ 63 + -64 AND >IN ! ELSE ( старый \ ) THEN ; IMMEDIATE

CREATE $BUFFERS 2500 ALLOT \ можно выделять память и по другому, главное, чтобы $buffers возвращал ее адресс
$BUFFERS 2500 ERASE $BUFFERS DUP 100 + DUP 1100 + ROT 2!
CREATE BLK 0 ,

CREATE $STORAGE 0 ,
: STORAGE-NAME S" storage1.blk" ;
: OPEN-STORAGE ( -- )
STORAGE-NAME R/W OPEN-FILE
IF DROP STORAGE-NAME R/W CREATE-FILE THROW THEN
$STORAGE !
;
: CLOSE-STORAGE ( -- ) $STORAGE @ CLOSE-FILE THROW ;
: SAVE-BUFFER ( addr -- )
  DUP 2 CELLS - @
  IF
   OPEN-STORAGE
   DUP 1 CELLS - @ 1- 1024 M* $STORAGE @ REPOSITION-FILE IF CLOSE-STORAGE -35 THROW THEN
   DUP 1024 $STORAGE @ WRITE-FILE IF CLOSE-STORAGE -34 THROW THEN
   CLOSE-STORAGE
   2 CELLS - 0 SWAP !
  ELSE
   DROP
  THEN
;
: FREE-BUFFER ( u -- addr )
$BUFFERS >R
R@ @ 1 CELLS - @ OVER = IF DROP R> @ EXIT THEN
R@ 2@ SWAP R@ 2!
R@ @ 1 CELLS - @ OVER = IF DROP R> @ EXIT THEN
DROP R> @ DUP SAVE-BUFFER
;
: BUFFER ( u -- addr ) DUP FREE-BUFFER SWAP OVER 1 CELLS - ! ;
: BLOCK ( u -- addr )
DUP FREE-BUFFER 2DUP 1 CELLS - @ =
IF
  NIP
ELSE
  2DUP 1 CELLS - !
  OPEN-STORAGE
  SWAP 1- 1024 M* $STORAGE @ REPOSITION-FILE IF CLOSE-STORAGE -35 THROW THEN
  DUP 1024 $STORAGE @ READ-FILE IF CLOSE-STORAGE -33 THROW THEN DROP
  CLOSE-STORAGE
THEN
;
: SAVE-BUFFERS ( -- ) $BUFFERS 2@ SAVE-BUFFER SAVE-BUFFER ;
: FLUSH ( -- ) SAVE-BUFFERS $BUFFERS 2@ 2 CELLS - 2 CELLS ERASE 2 CELLS - 2 CELLS ERASE ;
: UPDATE ( -- ) TRUE $BUFFERS @ 2 CELLS - ! ;
: EMPTY-BUFFERS ( -- ) $BUFFERS 2@ 2 CELLS - 1032 ERASE 2 CELLS - 1032 ERASE ;
VARIABLE SCR
: LIST ( u -- )
DUP SCR ! BLOCK 17 1
DO
  CR I 0 <# # # #> TYPE SPACE 64 0 DO DUP C@ BL MAX EMIT CHAR+ LOOP ." \"
LOOP DROP
;

: LOAD ( i*x u — j*x )
\ ВНИМАНИЕ!!! это пример кода, я не знаю как будет в SPF, но код слова простой,
\ думаю будет не сложно разобраться, главное тут реализация INTERPRET
BLK @ >R >IN @ >R \ сохраняем старый источник (только то что перепишем)
DUP BLK ! 0 >IN ! \ устанавливаем новый источник
IF
  ['] INTERPRET CATCH \ в данном случае, INTERPRET читает входной поток через SOURCE которе описано выше
  ?DUP
  IF \ дальше идет вывод сообщения об ошибке
   CR ." BLOCK " BLK @ . ." , LINE " >IN @ 1- 64 / DUP 1+ . ." :" CR
   SOURCE DROP SWAP 64 * + >IN @ 1- 64 MOD OVER + SWAP
   ?DO I C@ BL MAX EMIT LOOP SPACE ." ERROR #" . ABORT
  THEN
ELSE
  -35 ( invalid block number ) THROW \ нулевого блока не существует
THEN
R> >IN ! R> BLK ! \ восстанавливаем то что переписали
;

: THRU ( i*x u1 u2 -- j*x ) 1+ SWAP ?DO I LOAD LOOP ;


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Спасибо. Прикрутил самым "в лоб" способом. Вроде работает.
http://spf.cvs.sourceforge.net/spf/lib/ ... f?view=log

_________________
http://forth.org.ru/~ygrek


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

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


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

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


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

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