OberonCore https://forum.oberoncore.ru/ |
|
Охрана типа для нулевого указателя https://forum.oberoncore.ru/viewtopic.php?f=29&t=859 |
Страница 1 из 1 |
Автор: | Илья Ермаков [ Среда, 06 Февраль, 2008 23:22 ] |
Заголовок сообщения: | Охрана типа для нулевого указателя |
Известно, что охрана типа ptr(Type) даёт ошибку этапа выполнения, если ptr = NIL. Подумалось, что лучше было бы разрешить эту операцию. Значение NIL является совместимым со всеми типами, поэтому формально может быть приведено к любому типу. Если дальше будет идти обращение к полю-методу ptr(Type).something - дык при селекции и ловить ошибку "NIL dereference". Зато присваивание вида t := t.next(Type) было бы вполне корректным. Замотало писать в полном проходе IF t.next # NIL THEN t := t.next(Type) ELSE t := NIL END Можно, конечно, t сделать базового типа next, и приводить в теле цикла через WITH - но всё равно лишняя конструкция... По-моему, такое изменение семантики было бы даже полностью обратно совместимым. |
Автор: | AVC [ Четверг, 07 Февраль, 2008 01:01 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Тогда, вроде бы, логично распространить эту идею на операцию IS. Но мысль о том, что выражение Код: (ptr IS Subtype1) & (ptr IS Subtype2) (* Subtype1 и Subtype2 -- два несовместимых подтипа *) может оказаться "верным", мне что-то не нравится.
|
Автор: | Trurl [ Четверг, 07 Февраль, 2008 09:55 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
А почему не нравится? Это выражение верно если ptr=NIL. Но ведь NIL можно использовать там, где ожидается значение как типа Subtype1, так и типа Subtype2. |
Автор: | Евгений Темиргалеев [ Четверг, 07 Февраль, 2008 10:03 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Но это будет хитрый частный случай. Который не лучше ли обработать отдельным IF-ом? Тем более что для этого нововведения IF ptr # NIL THEN ... придется засовывать в реализацию охраны типа. А для всёх и всегда ли такая операция будет не лишней? |
Автор: | Сергей Губанов [ Четверг, 07 Февраль, 2008 12:23 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
В C# инструкция MyType a = (MyType)b; присваивает переменной a значение null если b = null. |
Автор: | AVC [ Четверг, 07 Февраль, 2008 12:44 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Trurl писал(а): А почему не нравится? Это выражение верно если ptr=NIL. Я бы поостерегся считать, что ptr(Type) истинно при ptr=NIL.Уж больно смахивает на упражнения вроде "король Франции -- лысый". ![]() Как бы нам не утонуть в старых спорах между Фреге и Расселом (и это всего лишь для того, чтобы немного сократить запись?)... см., например, Серл "Философия языка": http://www.urss.ru/cgi-bin/db.pl?cp=&pa ... u&list=321 Цитата: Работа [Russell 1905] открывается обсуждением проблемы предложений, содержащих определенные дескрипции, за которыми не стоит никакого объекта, то есть предложений типа The King of France is bald `Король Франции лысый'. Очевидно, что это осмысленное предложение, но в этом-то и загадка: как оно может быть осмысленным, если короля Франции не существует, и потому для выраженной в нем пропозиции нет объекта, о котором можно было бы что-то утверждать, а следовательно, в нем нет ничего, по отношению к чему предикат мог бы быть истинным или ложным? Как может иметь смысл такое предложение, если очевидно, что пропозиция, которую оно выражает, не является ни истинной, ни ложной? Ответ Фреге на этот вопрос был таким: предложение может быть осмысленным даже при том, что его субъектное выражение не имеет референции. По Фреге предложение может не иметь истинностного значения, но отсутствие истинностного значения не лишает предложения смысла и не превращает его в бессмыслицу. И если кто-то ошибочно считает, что предложение становится бессмысленным, то он просто путает смысл с референцией. Рассел, уже отвергнувший теорию Фреге о смысле и референции, дает, однако, совсем другой ответ на тот же вопрос: лишь на первый взгляд кажется, что данное предложение имеет субъектно-предикатную логическую форму, а на самом деле это не так. Грамматическая форма предложения здесь затушевывает его логическую форму, делая ее непрозрачной. В действительности же логическая форма этого предложения представляет собой конъюнкцию утверждений, одним из которых является утверждение существования. Иными словами, Рассел предлагает следующий анализ для предложения The King of France is bald `Король Франции лысый':
There is a King of France `Существует король Франции'. There is not more than one King of France `Существует не более одного короля Франции'. Whatever is King of France he is bald `Каков бы ни был король Франции, он лысый'. При такой интерпретации легко видеть, что анализируемое предложение является осмысленным, а выраженная в нем пропозиция ложна. Она ложна потому, что короля Франции не существует. |
Автор: | Trurl [ Четверг, 07 Февраль, 2008 13:18 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Как-то же надо обосновывать возможность присваивания Код: ptr := NIL Цитата: - У вас газировка есть?
- Да, с малиновым сиропом и с вишневым. - Мне, пожалуйста, без сиропа. - А Вам без какого, без малинового или без вишневого? |
Автор: | Wlad [ Четверг, 07 Февраль, 2008 21:59 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Trurl писал(а): Как-то же надо обосновывать возможность присваивания Код: ptr := NIL Надо подумать... С одной стороны, NIL принадлежит любому множеству любых типов указателей (на любые типы). С другой - как-либо его "проверять" на принадлежность типу мы не можем: никакой информации о статическом и о динамическом типе "пустого" элемента мы не можем в принципе получить... Наверное, первая "сторона" главенствует... |
Автор: | Valery Solovey [ Пятница, 08 Февраль, 2008 11:26 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Когда я учился в университете, то в те времена определения указателя давалось нам как сущность, указывающая либо на адрес в памяти, либо никуда не указывающая (указывающая в никуда). С указателями на объекты, как мне кажется, то же самое - либо указываем на адрес объекта либо никуда не указываем. NIL не объект, а адрес. И это становится существенным при объявлении объекта в динамической и статической памяти. |
Автор: | Юра [ Пятница, 08 Февраль, 2008 13:53 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Владимир Лось писал(а): С одной стороны, NIL принадлежит любому множеству любых типов указателей (на любые типы). Может быть это все-таки неправильно, что NIL неявно принадлежит всем типам? Не нарушает ли это строгую типизацию? |
Автор: | Wlad [ Пятница, 08 Февраль, 2008 23:52 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Юра писал(а): Владимир Лось писал(а): С одной стороны, NIL принадлежит любому множеству любых типов указателей (на любые типы). Может быть это все-таки неправильно, что NIL неявно принадлежит всем типам? Не нарушает ли это строгую типизацию? Не всем типам, а - множеству значений (любого рассматриваемого) указательного типа. Если хотите - множеству значений (адресов), которые могут принимать объекты этого указательного типа при "данном раскладе" в памяти системы. Но тут есть "моментик"... Про что собсна мы ведём речь? Про тестирование указателя на предмет равенства NIL и - про приведение типа. В шестой части своей статьи про расширение типов ("дополнительные программные конструкции", кажется) Вирт рассматривает плюсы и минусы "совмещения" обеих операций и даже рассматривает гипотетическую конструкцию WHEN p IS type DO ... END Но потом приходит к выводу, что это не слишком рационально и, в конце концов, приводит к усложнению архитектурных решений и запутанной логике (в масштабах проектируемой системы). Он останавливается на "разделении ролей": для проверки действенности указателя - проверять его на NIL в IF, а для приведения и охраны - WITH (с абортом)... (Кстати. за десяток лет до Оберона, в Эль-76, действовоал тот же принцип)... |
Автор: | Сергей Губанов [ Суббота, 09 Февраль, 2008 23:10 ] |
Заголовок сообщения: | Re: Охрана типа для нулевого указателя |
Владимир Лось писал(а): Он останавливается на "разделении ролей" Чтобы инструменты были "ортогональные"... |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |