Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вс июл 22, 2018 11:10

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Перенаправление выходного потока
СообщениеДобавлено: Чт май 13, 2010 19:59 
Не в сети

Зарегистрирован: Пн окт 15, 2007 17:24
Сообщения: 164
Откуда: Бийск
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Есть ли что-то готовое для СПФ, позволяющее перенаправлять весь консольный вывод в файл и возвращать обратно на экран (EMIT, TYPE, "точки" всякие и т.п.) - ткните носом в нужное место pls если есть.

_________________
And so forth ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Чт май 13, 2010 22:23 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Самое простое перенаправить при запуске СПФ
Код:
spf4.exe WORDS BYE >WW.TST

Можно написать программу:
source file: TT.F

: FL>
H-STDOUT >R
2DUP FILE-EXIST
IF R/W OPEN-FILE
ELSE W/O CREATE-FILE
THEN THROW TO H-STDOUT
H-STDOUT FILE-SIZE THROW
H-STDOUT REPOSITION-FILE THROW

['] INTERPRET CATCH
H-STDOUT CLOSE-FILE DROP
R> TO H-STDOUT
THROW
;
\ TST
S" XX.TXT" FL> .( HI) 1234 . CR
S" XX.TXT" FL> WORDS


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Чт май 13, 2010 23:06 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Как всегда у Михаила - ни единого комментария :(


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Пт май 14, 2010 06:57 
Не в сети

Зарегистрирован: Пн окт 15, 2007 17:24
Сообщения: 164
Откуда: Бийск
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
вопрос писал(а):
Как всегда у Михаила - ни единого комментария :(

А что тут комментировать?
Всё понятно, достаточно было даже написать одно слово "H-STDOUT" - я про него не знал, или забыл. А уж о наличии H-STDIN теперь и сам догадался :)

Спасибо, Михаил!

Могу и я попробовать прокомментировать (очевидно, слова стандарнтного ввода-вывод уже векторизованы):
------------------------------------
: FL>
H-STDOUT >R -- сохраняет текущий хэндл выходного потока на стеке возвратов
2DUP FILE-EXIST -- проверятется существует ли файл с именем, хранящемся в строке, адрес и длина которой лежат на стеке данных
IF R/W OPEN-FILE -- если существует, то он ткрывается на чтение/запись
ELSE W/O CREATE-FILE -- если нет, то он создается и окрывается на запись
THEN THROW TO H-STDOUT -- id этого файла пишется сохраняется как новый хэндл выходного потока (после этого весь консольный вывод будет идти в файл)
H-STDOUT FILE-SIZE THROW H-STDOUT REPOSITION-FILE THROW -- указатель чтения-записи устанавливается на конец файла

['] INTERPRET CATCH -- интерпретируется текст стоящий послде FL> до конца строки
H-STDOUT CLOSE-FILE DROP -- файл закрывается
R> TO H-STDOUT -- возращается сохраненный хэндл выходного потока, т.е. после завершения работы FL> (завершения интерпретации строки за ним следующей) консольный вывод пойдет туда же куда он шел до вызова FL>
THROW
;
-----------------
где-то так ...

_________________
And so forth ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Пт май 14, 2010 06:59 
Поиск "TO H-STDOUT"
и "TO TYPE" по devel


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Пт май 14, 2010 07:46 
Не в сети

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Вт сен 07, 2010 00:36 
Есть строка: S" : DOB 2 2 + . ; DOB " . Вопрос: как выполнить ее содержимое и перенаправить выходной поток в другую строку? В поисках счастья нашел слово TYPE>STR из ~ygrek\lib\typestr.f которое перенаправляет вывод слова в строку, слово EVALUATE может выполнить строку. Но вот как не крутил не вертел не подставлял выполнить и вывести не получалось :( Вижу люди тут разбирающиеся, подскажите как это можно осуществить?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Вт сен 07, 2010 07:23 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
Гость писал(а):
Есть строка: S" : DOB 2 2 + . ; DOB " . Вопрос: как выполнить ее содержимое и

S" ... " EVALUATE

Гость писал(а):
и перенаправить выходной поток в другую строку?

так как TYPE - это вектор, можно сделать просто:

CREATE string ...

: get-str ( asc # --> ) string SWAP CMOVE ;

' get-str TO TYPE

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Вт сен 07, 2010 14:01 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2109
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 36 раз.
mOleg писал(а):
так как TYPE - это вектор, можно сделать просто:

CREATE string ...

: get-str ( asc # --> ) string SWAP CMOVE ;

' get-str TO TYPE

Это порушит работу в консоли, лучше переопределить выводящие на печать слова, чтобы они делали вывод не только
в консоль, но и в строку:
Код:
CREATE string 1000 ALLOT string 1000 ERASE
0 VALUE dstr

: >str ( a u --> )
DUP >R string dstr + SWAP MOVE R> dstr + TO dstr ;

: >s  DUP . S>D (D.) 1+ >str  ; \ переопределение  "."
S" : DOB 2 2 + >s 2 2 2 + + >s ; DOB " EVALUATE

CR
string dstr DUMP CR CR
string dstr TYPE

лог.
Код:
4 6

5AF874   34 00 36 00  00 00 00 00  00 00 00 00  00 00 00 00 4.6.............

4 6

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Вт сен 07, 2010 22:30 
mOleg, chess Благодарю, код очень похож на тот что мне нужно но уточню немного. Сам текст строки может быть разным. В нем могут быть слова типа EMIT или CR которые выводят на экран. Если действовать по методу переопределения как это было предложено то надо их все переопределять получается?
Сделал начальный набросок:
Код:
REQUIRE STR@ ~ac/lib/str5.f

"" VALUE S-IN
"" VALUE S-OUT
\ Записываем в входную строку текст
S" : SUM 2 2 + .  32 EMIT ; SUM" S-IN STR!
 
Как весь вывод от исполнения текста внутри строки S-IN сохранить в строку S-OUT?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Ср сен 08, 2010 10:01 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2109
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 36 раз.
Можно конечно все и переопределить( ибо немного слов выводит в консоль)
Код:
1000 VALUE L-SOUT
CREATE SOUT L-SOUT ALLOT
0 VALUE D-SOUT

: >s ( a u --)
DUP >R SOUT D-SOUT + SWAP MOVE R> D-SOUT + TO D-SOUT  ;

0 WARNING !
: . ( x -- )  DUP . S>D (D.) 1+ >s  ; \ тут еще D. и U. переопределить
: EMIT ( b --) >R RP@ 1 TYPE RP@ 1 >s RDROP ;
: CR ( --) LT LTL @ 2DUP TYPE >s ;
: SPACE ( --) BL EMIT ; \ еще SPACES надо
1 WARNING !

STARTLOG
S" : DOB 2 2 + . 2 2 2 + + . 64 EMIT SPACE 64 EMIT CR 33 EMIT CR 3 . ; DOB " EVALUATE

CR
SOUT D-SOUT DUMP CR CR
SOUT D-SOUT TYPE
лог
Код:
4 6 @ @
!
3

5AF808   34 00 36 00  40 20 40 0D  0A 21 0D 0A  33 00 0D 0A 4.6.@ @..!..3...

4 6 @ @
!
3



Ok
ПС. но проще вставить в STARTLOG впихивание содержимого файла spf.log в строку S-OUT,
которую организовать в хипе.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Ср сен 08, 2010 10:09 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4920
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
Гость писал(а):
Сам текст строки может быть разным. В нем могут быть слова типа EMIT или CR которые выводят на экран. Если действовать по методу переопределения как это было предложено то надо их все переопределять получается?

нет, не надо ничего переопределять, в СПФе EMIT определен через TYPE.
Однако, не надо путать строку и поток. В строке вам всегда будет возвращаться только один результат одного вызова TYPE.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Ср сен 08, 2010 12:01 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2109
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 36 раз.
Посмотрел библиотеку ~ac/lib/str5.f.
Наиболее просто можно сделать так:

Код:
REQUIRE STR@ ~ac/lib/str5.f

"" VALUE S-IN
"" VALUE S-OUT

\ Записываем в входную строку текст
S" : SUM 2 2 + .  49 EMIT SPACE 64 EMIT SPACE 234. . . 3 SPACES S' 21111' TYPE  ; SUM" S-IN STR!

\ переопределить TYPE как ввод в выходную дин. строку
:NONAME ( A U -- ) S-OUT STR+ ; TO TYPE

\ исполнить строку-исходник
S-IN STR@ EVALUATE

\ переоределить TYPE на стандартный
' TYPE1 TO TYPE

\ посмотреть дин.строку вывода
S-OUT STR@ DUMP CR \ или так
S-OUT STR@ TYPE    \ или так

пс. Зачем это вам?
К примеру, мне такое никогда не было нужно.

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Чт сен 09, 2010 20:09 
to chess - Последний пример как раз подходит под мою задачу. Пишу программу с графическим интерфейсом. Выходной поток от исполнения строки надо было перенаправить на экран в отдельный элемент интерфейса. Вот для этого мне и понадобилось все запихнуть в строку. Спасибо за помощь, все работает как надо.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Перенаправление выходного потока
СообщениеДобавлено: Пт сен 10, 2010 07:43 
Гость писал(а):
Есть строка: S" : DOB 2 2 + . ; DOB " . Вопрос: как выполнить ее содержимое и перенаправить выходной поток в другую строку? В поисках счастья нашел слово TYPE>STR из ~ygrek\lib\typestr.f которое перенаправляет вывод слова в строку, слово EVALUATE может выполнить строку. Но вот как не крутил не вертел не подставлял выполнить и вывести не получалось

S" -1 U. " ' EVALUATE TYPE>STR STR@ TYPE
: test S" -1 U. " ['] EVALUATE TYPE>STR STR@ TYPE ;
test


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

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


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

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


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

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