Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 05:39

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: хорошее слово \EOF
СообщениеДобавлено: Вт май 01, 2007 13:03 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
В спф есть хорошее слово с именем \EOF но работает оно глупо и медленно 8(
Вот мой вариант:
Код:
\ Заканчивает трансляцию текущего потока √
: \EOF  ( --> )
        SOURCE-ID DUP IFNOT BYE THEN \ вызов слова в консоли приводит к BYE
        >R 2 SP@ -2 CELLS + 0 R> SetFilePointer DROP
        [COMPILE] \ ;


Так по-моему логичнее будет


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 01, 2007 13:22 
??

Код:
: \EOF  ( -- )
\ Заканчивает трансляцию текущего потока
  BEGIN REFILL 0= UNTIL
  POSTPONE \
;


Хотя мне глубоко всё равно. Никаких причин (не из разряда "а хочется так, и всё") изменять там что-то не вижу.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 01, 2007 13:26 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
Хотя мне глубоко всё равно. Никаких причин (не из разряда "а хочется так, и всё") изменять там что-то не вижу.


а я вижу. Во-первых, REFILL - очень тормозное слово, за счет READ-LINE.
Гораздо правильнее сразу завершить поток 8) - это раз
Второе, при упоминании этого слова в консоли система зависает в цикле REFILL из которого нельзя выйти


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 01, 2007 13:44 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
mOleg писал(а):
SOURCE-ID DUP IFNOT BYE THEN \ вызов слова в консоли приводит к BYE

Тут есть еще один вопрос. Что лучше делать при встрече слова \EOF при SOURCEID = 0 то есть работе с консолью: BYE или TERMINATE ? Второй вариант логичнее 8) Или нет?


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
SetFilePointer это очень плохо потому что input source не обязан быть файлом (блочным девайсом), а может быть потоком! Читаем стандарт!
На случай консоли - можно и поставить "защиту от дурака", с другой стороны слова должны быть "тупыми" - "dumb" и это правильно. Напоминает анекдот - юзверь закрывает Ворд, всплывает окошко - "Вы уверены что хотите выйти?" - "Да" - "А зачем?!". Таким образом можно далеко зайти - делать проверку адреса в ! и @ итд. Для отладочных целей - да - но необязательно делать в ядре, а опциональным расширением.

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


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
По стандарту единственный способ получения текста - REFILL, соответственно единственный способ проигнирировать весь текст - это прогнать REFILL до тех пор пока _он_ (REFILL) не скажет что текста больше нет!

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
yGREK писал(а):
По стандарту единственный способ получения текста - REFILL, соответственно единственный способ проигнирировать весь текст - это прогнать REFILL до тех пор пока _он_ (REFILL) не скажет что текста больше нет!


это плохо, так как тогда нет никакой возможности прервать трансляцию потока естественным путем.
Или есть?


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
естественным путем.

Что это значит?
Каким будет естественный способ прервать транслцию в случае pipe'а? а в случае файла? А в случае ввода с консоли? Наверное в каждом случае разный. И вообще нафига прерывать процесс трансляции? Слова сами управляют процессом трансляции.

ЗЫ А выполнение скобочных комментариев кстати тоже можно "соптимизировать" :lol: - искать закрывающую скобочку в файле и делать на неё setfilepointer. :))

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт май 01, 2007 15:50 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
yGREK писал(а):
Что это значит?
Каким будет естественный способ прервать транслцию в случае pipe'а? а в случае файла? А в случае ввода с консоли? Наверное в каждом случае разный. И вообще нафига прерывать процесс трансляции?

Это значит, что интерпретатор дальнейшее содержимое потока не интересно.
То, что случай разный - я согласен. Но вопрос остается - как корректно завершить трансляцию потока до его окончания?
Прерывать должно слово \EOF

yGREK писал(а):
ЗЫ А выполнение скобочных комментариев кстати тоже можно "соптимизировать" - искать закрывающую скобочку в файле и делать на неё setfilepointer.

вообще так оно и делается. Ищется завершающая скобка.

Вариант с REFILL очень плох тем, что очень медленный. К тому же действительно, поток может браться с очень медленного источника, и тогда можно получить не просто тормоза, А тормозищщи!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт май 03, 2007 21:21 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
И все-таки, что лучше выполнять по \EOF в консоли?: BYE или TERMINATE ?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт май 04, 2007 16:10 
Вопрос: если что есть дури ударить монтировкой по радиатору: то левое или правое крыло помнётся?..

Правильный ответ: не дури и не ломай машину.

Возможно моя фантазия недостаточно богата и изощрённа, но я в голову уложить не могу: зачем кому бы то ни было выполнять \EOF в консоли?..

Варианты ответов вроде: "а вот такой я оригинальный зверушка" (с) встречаются, как и раньше, с полным ответным непониманием.

Претензиев к предположительной тормознутости REFILL в том случае, когда Луна оказывается во влиянии Альдебарана, а также когда в четвёртый день недели сразу после выпадения осадков лангусты и омары выстраиваются на вершине близлежащего холма для исполнения концерта художественного свиста -- тоже не понимаю.

Да даже если и и -- это ж копейки по сравнению с уже бесполезно-зряшно потраченным временем на написание, отладку, размышления вокруг этого мало того что непонятного, так ещё и небесконфликтного "решения" (см. выше).

Не говоря уже о том, что сам вопрос -- мелюзговый. Сделать спец. обработку работы в консоли -- вот и весь сказ.


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

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


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

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


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

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