Сохранение текста программы в spForth4

 

x000

втянувшийся

Всем привет! Наконец-то появилась возможность плотно занятся Фортом. Сам по себе Форт как таковой вполне понятен (после ДССП ::))), а вот некоторые элементарные вещи непонятно как делать. Из книг у меня - Баранов, прочитал практически полностью, теоретически как обращаться к внешней памяти вроде бы ясно - через стандартную переменную BUFFER и т. д. , но на spForth это реализовано как-то по другому (или нет ?), по крайней мере с Барановым не совпадает, хотя в стандарте 94 года всё это вроде бы есть. Тексты программ увеличиваются с каждым днём, что радует, а вот как их сохранять и загружать - непонятно. Приходится переколачивать каждую программу заново.
Подскажите пожалуйста, как это делается, или как это реализовать самому.
З.Ы. Ещё вот маленький вопросец: почему на стек spForth 4 я не могу положить четырехбайтное значение, хотя он 32-разрадный?
IMPERIUM!  
+
-
edit
 

Balancer

администратор
★★★★☆
В SP-Forth реализована привычная работа с внешними файлами. Блочные файлы по умолчанию не поддерживаются. Текст программы - это простой текст.

про 32-разрядность - это непонятно :)
code text
  1. SP-FORTH - ANS FORTH 94 for Win95/98/ME/NT/2000
  2. Open source project at http://spf.sf.net
  3. Russian FIG at http://www.forth.org.ru; Started by A.Cherezov
  4. Version 4.00 Build 009 at 10.Nov.2002
  5.  
  6. -1 U.
  7. 4294967295  Ok
 
Это сообщение редактировалось 21.07.2004 в 15:56

x000

втянувшийся

Большое спасибо за проявленное внимание к моим проблемам, но фраза "привычная работа с файлами" ко мне не подходит, потому как с Фортом я стал работать лишь месяц назад (вдали от цивилизации, в наличии был клавиатурник Jornada 720 + распечатка книги Баранова ::))), поэтому нельзя ли немного поподробнее? Поскольку в ответ на подобные вопросы Черезов отсылает всех начинающих читать книжки, книжки мы читаем, но хотелось бы понять хотя бы в общем виде эту самую работу с файлами применительно к spf4, т.е. как эти файлы создаются, как в них загоняется текст и т. д. , или хотя бы где всё это смотреть ( в файле помощи из дистрибутива этого нет).
IMPERIUM!  
+
-
edit
 

Balancer

администратор
★★★★☆
Если просто, то так. Сперва строчки из исходников (считай, что они сами по себе - документация :D )

src\win\spf_win_io.f:
: OPEN-FILE ( c-addr u fam — fileid ior ) \ 94 FILE
\ Открыть файл с именем, заданным строкой c-addr u, с методом доступа fam.
\ Смысл значения fam определен реализацией.
\ Если файл успешно открыт, ior ноль, fileid его идентификатор, и файл
\ позиционирован на начало.
\ Иначе ior - определенный реализацией код результата ввода/вывода,
\ и fileid неопределен.

: READ-FILE ( c-addr u1 fileid — u2 ior ) \ 94 FILE
\ Прочесть u1 символов в c-addr из текущей позиции файла,
\ идентифицируемого fileid.
\ Если u1 символов прочитано без исключений, ior ноль и u2 равен u1.
\ Если конец файла достигнут до прочтения u1 символов, ior ноль
\ и u2 - количество реально прочитанных символов.
\ Если операция производится когда значение, возвращаемое
\ FILE-POSITION равно значению, возвращаемому FILE-SIZE для файла
\ идентифицируемого fileid, ior и u2 нули.
\ Если возникла исключительная ситуация, то ior - определенный реализацией
\ код результата ввода/вывода, и u2 - количество нормально переданных в
\ c-addr символов.
\ Неопределенная ситуация возникает, если операция выполняется, когда
\ значение, возвращаемое FILE-POSITION больше чем значение, возвращаемое
\ FILE-SIZE для файла, идентифицируемого fileid, или требуемая операция
\ пытается прочесть незаписанную часть файла.
\ После завершения операции FILE-POSITION возвратит следующую позицию
\ в файле после последнего прочитанного символа.


: READ-LINE ( c-addr u1 fileid — u2 flag ior ) \ 94 FILE
\ Прочесть следующую строку из файла, заданного fileid, в память
\ по адресу c-addr. Читается не больше u1 символов. До двух
\ определенных реализацией символов "конец строки" могут быть
\ прочитаны в память за концом строки, но не включены в счетчик u2.
\ Буфер строки c-addr должен иметь размер как минимум u1+2 символа.
\ Если операция успешна, flag "истина" и ior ноль. Если конец строки
\ получен до того как прочитаны u1 символов, то u2 - число реально
\ прочитанных символов (0<=u2<=u1), не считая символов "конец строки".
\ Когда u1=u2 конец строки уже получен.
\ Если операция производится, когда значение, возвращаемое
\ FILE-POSITION равно значению, возвращаемому FILE-SIZE для файла,
\ идентифицируемого fileid, flag "ложь", ior ноль, и u2 ноль.
\ Если ior не ноль, то произошла исключительная ситуация и ior -
\ определенный реализацией код результата ввода-вывода.
\ Неопределенная ситуация возникает, если операция выполняется, когда
\ значение, возвращаемое FILE-POSITION больше чем значение, возвращаемое
\ FILE-SIZE для файла, идентифицируемого fileid, или требуемая операция
\ пытается прочесть незаписанную часть файла.
\ После завершения операции FILE-POSITION возвратит следующую позицию
\ в файле после последнего прочитанного символа.

и т.д. В общем, детально всё расписано :)

Примеры:
code forth
  1. : TEST ( -- )
  2.     S" test.txt" \ имя файла. В переменную не заношу, будем работать через стек
  3.     2DUP R/W CREATE-FILE THROW
  4.     \ создали файл, в стеке - хендл. Для простоты все ненудевые коды возврата выбарсываем исключением
  5.     DUP S" 123456" ROT WRITE-FILE THROW
  6.     CLOSE-FILE THROW
  7.  
  8.     \ Теперь тот же файл прочитаем и распечатаем. Напомню, что в стеке до сих пор - имя файла
  9.     R/O OPEN-FILE THROW
  10.     \ читаем по адресу HERE не более 1кБ
  11.     DUP HERE 1024 ROT \ преобразовали из ( fid ) в ( fid addr-here 1024 fid )
  12.     READ-FILE THROW \ получили число реально считанныйх байт
  13.     HERE SWAP TYPE \ распечатаем их с адреса HERE
  14.     CLOSE-FILE THROW \ всё, закончили
  15. ;
  16.  
  17. TEST BYE


Если же надо сделать include внешнего файла, то по стандарту, это делается так:
S" test.f" INCLUDED
Или же по FILE-ID:
S" test.f" R/O OPEN-FILE THROW INCLUDE-FILE

В SP-Forth есть упрощение. Если введённое слово не опознаётся как словарное слово, как число и т.п., то в пследнюю очередь тренслятор пытается его рассмотреть как имя включаемого файла. Т.е., если имя файла не содержит пробелов, то достаточно просто набрать его в своей программе - файл будет подключён. Кстати, именно так и выполняется запуск программ SP-Forth через командную строку. SP-Forth принимает во входных параметрах не имя программы, а саму программу - см.
code text
  1. spf4.exe 2 2 * . BYE
  2. -> 4

Но если указать в параметрах имя файла, не похожее на число или команду - то этот файл будет выполнен:
spf4.exe myfile.f
на самом деле соответствует
spf4.exe S" myfile.f" INCLUDED
(с поправкой на то, конечно, что кавычки в DOS-строке так просто не передать :D
 
Это сообщение редактировалось 21.07.2004 в 15:57

x000

втянувшийся

Спасибо!
::)))
IMPERIUM!  

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru