. Обратил внимание? Сразу запихиваем содержимое очередного элемента массива в EAX, и смотрим, есть ли оно в множестве. А теперь вышеприведенный мной код:
type tset = set of 'a' .. 'z'; const myset: tset = ['a' .. 'z']; s: string = 'the test';
// for i := 1 to length(s) do if s[ i ] in myset then inc(count); writeln(count);
То есть, сначала из выдирается очередной символ, от него отнимается 97 (ну, это понятно - приводим к началу отсчета, 'a' считается нулевым элементом множества - значит ото всего будем отнимать 97, начинался бы интервал при описании tset с 'b' - отнимали бы 98), потом проверяем результат на попадание в допустимый интервал (26 символов, начиная с 0 - если значение больше 25, то RCE). А потом опять выдираем значение из строки и его уже проверяем на наличие во множестве...
Если так все-таки было задумано, то чего бы не сделать то же самое действие для целочисленных базовых типов - непонятно. Для перечислимых тоже есть такая проверка:
type t = (_1, _2, _3, _4); st = set of _2 .. _4;
const ssv: st = [_2 .. _4]; one: t = _1; begin if one in ssv then writeln('wrong'); end.
точно так же, как и при работе с Char-ами вылетает при отладке.
Неоднозначность какая-то получается. Учитывая то, что есть Generic-и - это ОЧЕНЬ нехорошая неоднозначность.