Forth http://fforum.winglion.ru/ |
|
Критика ANS-94 http://fforum.winglion.ru/viewtopic.php?f=9&t=30 |
Страница 1 из 3 |
Автор: | Hishnik [ Сб май 13, 2006 23:48 ] |
Заголовок сообщения: | Критика ANS-94 |
Итак, вытаскиваю из запасников давно лежащую там бочку дегтя. Сначала небольшая, зато с самого верха, ложка. В подавляющем большинстве языков программирования числа с плавающей точкой распознаются (кто бы мог подумать?) по наличию точки в записи числа. В Форте точка использовалась для обозначения чисел двойной длины... то есть таких как 0000:B800. Соответственно, пришлось придумывать, как бы выделить эти самые плавающеточечные числа, и придумано было ориентироваться на символ E. То есть 3.1415 - это число двойной длины, а вот 3.1415E0 - правильная запись. И несмотря на наступление 90-х годов, данная несуразица не была поправлена. Замечаем, что 32 и даже 64 разряда в качестве ширины числа одинарной длины уже ничего сложного не представляют, остается только удивляться. Итак, что хотелось бы видеть? Точку в прдставлении числа как признак формата с плавающей точкой. И, если уж так хочется, двоеточия для обозначения чисел двойной длины. Далее, Форт имеет в активе мощнейшую концепцию контекстных словарей. Наличие словарей делает практически ненужной реализацию объекто-ориентированного программирования, поскольку все свойства объектов (инкапсуляция, наследование, полиформизм) словари обеспечивают. В сочетании с векторными переменными они обеспечат еще и динамическое связывание (а статическое обеспечивается самим механизмом их работы). Что получилось в '94? Словарей стало "как минимум 8". Появилась необходимость (а не возможность!) регулировать порядок поиска (ONLY, ALSO). Итак, форт-система, поддерживающая только восемь словарей, имеет полное право считаться ANS-совместимой (то есть будьте любезны ограничиваться 8 объектами), и при попытке переключиться на другой словарь следует явным образом выписать порядок поиска (читай: иерархию). Кто-нибудь может представить, что в OWL каждый раз при обращении к объекту надо писать TObject->TVisible->TWIndow->TWinControl->TButton? Нет, можно, конечно, наслоить еще десять разновидностей ООП-библиотек. Устаревающая технология, кстати... Можно добавить, что блоки CATCH/THROW копируют несколько чуждую Форту технологию обработки исключений. Почему чуждую? А можно ставить THROW после каждой строки? Можно? А тогда почему транслятор не хочет делать это сам, а заставляет программиста заниматься подобными вещами? К тому же Форт-система с ее консолью весьма терпимо относится к исключениям. Откомпилированную программу при делении на ноль придется перезапустить. В консоли же достаточно повторно набрать необходимое слово, устранив предварительно причину исключения. Вывод: THROW должно выполняться автоматически, без необходимости его набора в тексте. Пока вот так. |
Автор: | forther [ Вс май 14, 2006 00:28 ] |
Заголовок сообщения: | Re: Критика ANS-94 |
Хищник писал(а): Можно добавить, что блоки CATCH/THROW копируют несколько чуждую Форту технологию обработки исключений. Почему чуждую? А можно ставить THROW после каждой строки? Можно? А тогда почему транслятор не хочет делать это сам, а заставляет программиста заниматься подобными вещами? К тому же Форт-система с ее консолью весьма терпимо относится к исключениям. Откомпилированную программу при делении на ноль придется перезапустить. В консоли же достаточно повторно набрать необходимое слово, устранив предварительно причину исключения. Вывод: THROW должно выполняться автоматически, без необходимости его набора в тексте.
Я не совсем понял про THROW после каждой строки ... С таким же успехом можно спросить про "long_jump" (C -шный) после каждой строки. |
Автор: | Hishnik [ Вс май 14, 2006 01:08 ] |
Заголовок сообщения: | |
Сейчас THROW следует писать после каждой операции, оставляющей на стеке код ошибки. Не слишком ли однообразным и предсказуемым получается текст? Код: OPEN-FILE THROW
WRITE-FILE THROW CLOSE-FILE THROW Не кажется, что "в этой сказке что-то не так"? |
Автор: | Гость [ Вс май 14, 2006 05:32 ] |
Заголовок сообщения: | |
Хищник писал(а): Сейчас THROW следует писать после каждой операции, оставляющей на стеке код ошибки. Не слишком ли однообразным и предсказуемым получается текст?
Код: OPEN-FILE THROW WRITE-FILE THROW CLOSE-FILE THROW Не кажется, что "в этой сказке что-то не так"? Нет. Этих операций совсем мало. А в без-осных системах совсем нет. Кроме того можно и без THROW ошибку обработать или просто похерить. |
Автор: | ygrek [ Вс май 14, 2006 12:06 ] |
Заголовок сообщения: | |
ну во-первых, никто ведь не мешает Код: : AUTOTHROW >IN @ ' SWAP >IN ! CREATE , DOES> @ EXECUTE THROW ;
AUTOTHROW OPEN-FILE AUTOTHROW CLOSE-FILE во-вторых - если сделать автоматом THROW, то как обрабатывать не критичные исключения? Хотя бы пользователю сообщить?.. Получается CATCH уже нафиг не нужен.. Например тот же файл не открылся - я не хочу отваливаться с маловразумительным -2003 WORD OR FILE NOT FOUND, а хочу красивое окошко например юзверю вывести с именем файла, или в лог записать... ИМХО с THROW/CATCH всё в порядке. |
Автор: | Hishnik [ Вс май 14, 2006 14:19 ] |
Заголовок сообщения: | |
Гость писал(а): Нет. Этих операций совсем мало. А в без-осных системах совсем нет. Кроме того можно и без
THROW ошибку обработать или просто похерить. Код ошибки все равно лежит на стеке и с ним надо сделать хотя бы DROP. |
Автор: | Hishnik [ Вс май 14, 2006 14:24 ] |
Заголовок сообщения: | |
yGREK писал(а): ну во-первых, никто ведь не мешает Теперь приходится постоянно писать AUTOTHROW? Вопрос как раз в том, чтобы ограничить объем текста и упростить структуру операций с очевидным поведением. yGREK писал(а): а хочу красивое окошко например юзверю вывести с именем файла, или в лог записать...
Это легко сделать собственным обработчиком исключений. Который будет вызываться всегда, а не только тогда, когда он будет явно указан. |
Автор: | WingLion [ Вс май 14, 2006 14:33 ] |
Заголовок сообщения: | |
Хищник писал(а): Теперь приходится постоянно писать AUTOTHROW? Вопрос как раз в том, чтобы ограничить объем текста и упростить структуру операций с очевидным поведением.
А там (у yGREK), вроде код, который переопределяет слово, а не... |
Автор: | Hishnik [ Вс май 14, 2006 14:44 ] |
Заголовок сообщения: | |
Аа, точно, не заметил Но тогда зачем надо делать не-AUTOTHROW версии? А придется сделать сначала с THROW (потому что в стандарте), а только потом переопределить на AUTOTHROW. При этом софт, который ориентируется на простановку THROW после OPEN-FILE, уже не заработает. |
Автор: | ygrek [ Вс май 14, 2006 17:21 ] |
Заголовок сообщения: | |
В общем случае, если автоматически кидать THROW, теряется возможность самому отловить ошибку и в месте ошибки произвести контекстные действия по её исправлению. Остаётся только один глобальный CATCH. Во многих случаях такое поведение неприемлимо. То есть у нас есть два варианта - кому-то хочется Цитата: ограничить объем текста и упростить структуру операций с очевидным поведением. , а кому-то надо иметь возможность оперативно реагировать на ошибки не вываливая всю программу. Текущий стандарт позволяет реализовать оба поведения (первое например с помощью AUTOTHROW, второе в стандарте). Цитата: При этом софт, который ориентируется на простановку THROW после OPEN-FILE, уже не заработает.
А вот не надо включать такие переопределния перед чужим кодом. Для частного пользования only. |
Автор: | Hishnik [ Вс май 14, 2006 19:26 ] |
Заголовок сообщения: | |
yGREK писал(а): В общем случае, если автоматически кидать THROW, теряется возможность самому отловить ошибку и в месте ошибки произвести контекстные действия по её исправлению. Остаётся только один глобальный CATCH. Можно менять адрес обработчика исключений. Я исхожу из того факта, что в минимальном объеме программа рассчитывает, что все файлы откроются и все запишется как надо. Поэтому никакой CATCH просто не пишется, и встает вопрос: что же делать с результатом операции, который так и лежит на стеке? А вот уже на основе векторизованного обработчика можно организовать CATCH/THROW. yGREK писал(а): А вот не надо включать такие переопределния перед чужим кодом. Для частного пользования only.
Мы рассматриваем стандарт. И я хочу сказать, что в стандарт включен неуниверсальный механизм обработки исключений. |
Автор: | in4 [ Пн май 15, 2006 14:12 ] |
Заголовок сообщения: | |
yGREK писал(а): Цитата:
При этом софт, который ориентируется на простановку THROW после OPEN-FILE, уже не заработает. А вот не надо включать такие переопределния перед чужим кодом. Для частного пользования only. По-фортовски нужно придумать новые названия для AUTOTHROW-слов. OPEN-FILE-AT , например. А вот плодить кучи похожих названий тоже нехорошо. |
Автор: | ygrek [ Вт май 16, 2006 09:20 ] |
Заголовок сообщения: | |
Хищник писал(а): Можно менять адрес обработчика исключений. Я исхожу из того факта, что в минимальном объеме программа рассчитывает, что все файлы откроются и все запишется как надо. Поэтому никакой CATCH просто не пишется, и встает вопрос: что же делать с результатом операции, который так и лежит на стеке? А вот уже на основе векторизованного обработчика можно организовать CATCH/THROW. Мне идея с векторизированным CATCH наверное не сильно нравится... Вектор придётся не только устанавливать при входе в слово где может произойти исключение, а и восстанавливать при выходе... При глобальном векторном CATCH'е где точка возврата из обработчика? Да, кстати.... Почему я решил что остаётся только глобальный CATCH... Никто ведь не мешает и самому CATCH локально использовать... Хищник писал(а): Мы рассматриваем стандарт. И я хочу сказать, что в стандарт включен неуниверсальный механизм обработки исключений.
Вообщем по-моему текущий стандарт не мешает ввести предлагаемое тобой поведение (в качестве подключаемой либы и может немного в компиляторе..). А вот вносить такое поведение в стандарт - ИМХО не стоит. |
Автор: | Hishnik [ Вт май 16, 2006 22:11 ] |
Заголовок сообщения: | |
yGREK писал(а): Мне идея с векторизированным CATCH наверное не сильно нравится... Вектор придётся не только устанавливать при входе в слово где может произойти исключение, а и восстанавливать при выходе... А зачем? Есть поведение "по умолчанию" - выдать сообщение и перейти в консоль со сбросом стеков. Если надо нечто иное, можно написать обработку конкретного исключения (ввести retry/abort/ignore, к примеру) и поступить так, как нужно в конкретном случае. В этом случае все файловые операции в пределах проекта будут обработаны единообразно. yGREK писал(а): При глобальном векторном CATCH'е где точка возврата из обработчика? QUIT yGREK писал(а): Вообщем по-моему текущий стандарт не мешает ввести предлагаемое тобой поведение
(в качестве подключаемой либы и может немного в компиляторе..). А вот вносить такое поведение в стандарт - ИМХО не стоит. Так вот и CATCH надо было вводить не стандартом, а подключаемой либой. Я же не про механизм обработки говорю (они в целом сопоставимы), а именно про то, что в стандарт ввели неочевидное решение, которое имеет альтернативы. |
Автор: | ygrek [ Чт май 18, 2006 21:24 ] |
Заголовок сообщения: | |
Перечитал ещё раз тред - я написал кучу глупостей И с чем собственно спорил - уже сам не понимаю. Попытаюсь подвести итог. Альтернатива имеет место быть. Ничего кардинально плохого в текущей реализации нет. |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |