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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Перенаправление выходного потока
Автор Сообщение
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Гость писал(а):
Есть строка: 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
Сообщение Добавлено: Пт сен 10, 2010 07:43
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
to chess - Последний пример как раз подходит под мою задачу. Пишу программу с графическим интерфейсом. Выходной поток от исполнения строки надо было перенаправить на экран в отдельный элемент интерфейса. Вот для этого мне и понадобилось все запихнуть в строку. Спасибо за помощь, все работает как надо.
Сообщение Добавлено: Чт сен 09, 2010 20:09
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Посмотрел библиотеку ~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    \ или так

пс. Зачем это вам?
К примеру, мне такое никогда не было нужно.
Сообщение Добавлено: Ср сен 08, 2010 12:01
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Гость писал(а):
Сам текст строки может быть разным. В нем могут быть слова типа EMIT или CR которые выводят на экран. Если действовать по методу переопределения как это было предложено то надо их все переопределять получается?

нет, не надо ничего переопределять, в СПФе EMIT определен через TYPE.
Однако, не надо путать строку и поток. В строке вам всегда будет возвращаться только один результат одного вызова TYPE.
Сообщение Добавлено: Ср сен 08, 2010 10:09
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Можно конечно все и переопределить( ибо немного слов выводит в консоль)
Код:
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,
которую организовать в хипе.
Сообщение Добавлено: Ср сен 08, 2010 10:01
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
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?
Сообщение Добавлено: Вт сен 07, 2010 22:30
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
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
Сообщение Добавлено: Вт сен 07, 2010 14:01
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Гость писал(а):
Есть строка: S" : DOB 2 2 + . ; DOB " . Вопрос: как выполнить ее содержимое и

S" ... " EVALUATE

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

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

CREATE string ...

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

' get-str TO TYPE
Сообщение Добавлено: Вт сен 07, 2010 07:23
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Есть строка: S" : DOB 2 2 + . ; DOB " . Вопрос: как выполнить ее содержимое и перенаправить выходной поток в другую строку? В поисках счастья нашел слово TYPE>STR из ~ygrek\lib\typestr.f которое перенаправляет вывод слова в строку, слово EVALUATE может выполнить строку. Но вот как не крутил не вертел не подставлял выполнить и вывести не получалось :( Вижу люди тут разбирающиеся, подскажите как это можно осуществить?
Сообщение Добавлено: Вт сен 07, 2010 00:36
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
тут да, понятно, но если открыть исходники оптимизатора :o
Сообщение Добавлено: Пт май 14, 2010 07:46
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Поиск "TO H-STDOUT"
и "TO TYPE" по devel
Сообщение Добавлено: Пт май 14, 2010 06:59
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
вопрос писал(а):
Как всегда у Михаила - ни единого комментария :(

А что тут комментировать?
Всё понятно, достаточно было даже написать одно слово "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
;
-----------------
где-то так ...
Сообщение Добавлено: Пт май 14, 2010 06:57
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Как всегда у Михаила - ни единого комментария :(
Сообщение Добавлено: Чт май 13, 2010 23:06
  Заголовок сообщения:  Re: Перенаправление выходного потока  Ответить с цитатой
Самое простое перенаправить при запуске СПФ
Код:
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
Сообщение Добавлено: Чт май 13, 2010 22:23
  Заголовок сообщения:  Перенаправление выходного потока  Ответить с цитатой
Есть ли что-то готовое для СПФ, позволяющее перенаправлять весь консольный вывод в файл и возвращать обратно на экран (EMIT, TYPE, "точки" всякие и т.п.) - ткните носом в нужное место pls если есть.
Сообщение Добавлено: Чт май 13, 2010 19:59

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


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