Руководство разработчика

Ключевое слово ЛЮБОЙ


1. Ослабление проверки типа во время компиляции.

Ключевое слово ЛЮБОЙ используется для подавления проверки компилятором деталей неопределенного типа. На поведение во время выполнения ключевое слово ЛЮБОЙ не оказывает никакого влияния.

Синтаксис:

ЛЮБОЙ(<выражение>)

или

ЛЮБОЙ!(<выражение>)

Первый вариант "стирает" детали типа контролируемого выражения так, что это выражение может использоваться для присваивания, при передаче параметра и т.п. без дополнительных проверок типа.

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

Детали неопределенного типа могут помочь обнаружить ошибки в программе на этапе компиляции. Но в некоторых случаях программисту может захотеться обойти эти специально заданные ограничения (например, заданные в модулях). В этом случае программист с помощью ключевого слова ЛЮБОЙ заявляет компилятору: "Уймись, я знаю, что я делаю."

Пример:

ВЫЧИСЛИТЬ
  ПЕРЕМ *<СТРОКА, ЧИСЛО>: значение // переменная может принимать строки или числа
  
  значение = "привет"   // проверка типа позволяет
  значение = ДА         // ошибка - логика не допускается деталями типа переменной
  значение = ЛЮБОЙ(ДА)  // проверка подавлена, переменная принимает логическое значение
КОНЕЦ

Ключевое слово ЛЮБОЙ применяется в ситуациях, когда компилятор знает слишком много о типе выражения. В обратной ситуации, когда компилятор знает слошком мало о типе выражения, применяется уточнение типа.


2. Проверка возможности изменения типа переменной.

Ключевое слово ЛЮБОЙ в паре с ключевым словом ТИП проверяет, что переменная позволяет изменять тип, т.е. содержит в объявлении один из видов неопределенного типа. Проверка осуществляется во время выполнения. Результатом проверки является значение логического типа: ДА – тип переменной может быть изменен, НЕТ – при попытке изменения типа возникнет ошибка времени выполнения.

Синтаксис:

ЛЮБОЙ ТИП(<переменная>)

Пара ключевых слов ЛЮБОЙ ТИП может использоваться в выражениях, но не может применяться к переменной, стоящей слева в операторе присваивания.

Пример 1:

ВЫЧИСЛИТЬ
  ПЕРЕМ СТРОКА: стр = "Привет"
  ПЕРЕМ *: вариант = "Привет"
  
  ОТЛАДКА(ЛЮБОЙ ТИП(стр))     // НЕТ
  ОТЛАДКА(ЛЮБОЙ ТИП(вариант)) // ДА
  
  ПЕРЕМ *: эл[] = (1: "Альфа", 2: 42)

  ОТЛАДКА(ЛЮБОЙ ТИП(эл))    // НЕТ, т.к. "эл" имеет фикс. контейнерный тип, a не *   
  ОТЛАДКА(ЛЮБОЙ ТИП(эл[1])) // ДА, тип элементов * (текущий тип СТРОКА)
  ОТЛАДКА(ЛЮБОЙ ТИП(эл[2])) // ДА, тип элементов * (текущий тип ЦЕЛОЕ)
  ОТЛАДКА(ЛЮБОЙ ТИП(эл[3])) // ДА, тип элементов * (добавляет новый элемент, текущий тип ПУСТО)

  // новое имя не меняет возможность смены типа:
  ПЕРЕМ& п = вариант
  ПЕРЕМ& п1 = эл[1]

  ОТЛАДКА(ЛЮБОЙ ТИП(п))  // ДА
  ОТЛАДКА(ЛЮБОЙ ТИП(п1)) // ДА
КОНЕЦ

Пример 2:

ФУНКЦИЯ ЛОГИКА: ТестИзмененияТипа(ПЕРЕМ *: парам)
  РЕЗУЛЬТАТ = ЛЮБОЙ ТИП(парам) // здесь компилятор не может знать,
                               // возможно ли изменение типа "парам"
КОНЕЦ  

ВЫЧИСЛИТЬ
  ПЕРЕМ СТРОКА: стр = "Привет"
  ПЕРЕМ *: вариант = "Привет"
  
  ОТЛАДКА(ТестИзмененияТипа(стр))     // НЕТ
  ОТЛАДКА(ТестИзмененияТипа(вариант)) // ДА
КОНЕЦ

См. также: