Comdiv писал(а):
Цитата:
По поводу бессмысленных проверок с заранее известным результатом - можно ли вот такой пример считать примером бессмысленных проверок:
Нельзя. Компилятор использует лишь простые проверки осмысленности, и закладывать в
языке общего назначения большее - это глупость, потому что приведёт к более сложной минимальной реализации. В совокупности с другими схожими требованиями это может осложнить задачу на один-два порядка в зависимости от аппетита. Это уже задача для опционального анализатора. И это то, как
реализация влияет на дизайн.
Цитата:
Я скорее думаю, что реализация оператора IS (и оператора WITH) не подразумевает прямое использование разыменованного указателя (динамического типа) как статического типа записи, поэтому требуется отдельная процедура, где разыменованный указатель (с помощью идентификатора VAR или IN) приводится к статическому типу записи
Вы изначально спросили о причине ограничения, а здесь уже сами в качестве причины указали само ограничение. Технически здесь нет никаких сложностей, так как наличие процедуры ничего не упрощает, и здесь как раз дизайн влияет на реализацию.
Я заранее извиняюсь, поскольку не программист по образованию, поэтому могу некорректно употреблять термины. И мы, видимо, не совсем понимаем друг друга. Вот код:
Код:
MODULE TestExt;
IMPORT Log;
TYPE
pbas=POINTER TO bas;
bas=EXTENSIBLE RECORD
a:INTEGER;
END;
pras=POINTER TO ras;
ras=RECORD (bas)
b:REAL;
END;
VAR
c:pbas;
d:pras;
PROCEDURE Test(VAR x:bas);
BEGIN
IF x IS ras THEN
Log.String('Расширенный тип');
Log.Ln;
ELSE
Log.String('Базовый тип');
Log.Ln;
END;
END Test;
BEGIN
NEW(c);
NEW(d);
Test(c^);
Test(d^);
END TestExt.
Он корректно работает. Мой вопрос такой - почему через процедуру сравнить разыменованный указатель с типом записи можно, а напрямую, в теле модуля, нельзя?