Прошу вашей помощи в понимании следующего вопроса. Есть вот такой пример:
## Код:
```
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
       a:pbas;
       b:pras;
    BEGIN
       NEW(a);
       NEW(b);
       a:=b;
       IF a^ IS ras THEN
                          Log.String("Проверка по типу");
       ELSE
       END;
    END TestExt.
```


При компиляции выдаётся ошибка Guarded or tested variable is neither a pointer nor a VAR- or IN-parameter record.
Проверка по указателю ошибок компиляции не вызывает:
## Код:
```
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
   a:pbas;
   b:pras;
BEGIN
   NEW(a);
   NEW(b);
   a:=b;
   IF a IS pras THEN
                      Log.String("Проверка по указателю");
   ELSE
   END;
END TestExt.
```


Почему для проверки по типу записи необходимо делать процедуру с параметрами VAR или IN ?