Основные элементы языка программирования Icon. Чанышев О.Г. - 14 стр.

UptoLike

Составители: 

27
5.5. Более мощные варианты функций сканирования
Функции any, many, match, find не слишком удобны, по-
скольку требуют сохранять позицию в строке, а также имя строч-
ной переменной.
Улучшить ситуацию позволяет оператор сканирования стро-
ки ‘?’, используемый в виде s ? e, где s – строка, а e – некоторое
выражение.
Вычисляя выражение e, Icon использует специальные пере-
менные &subject и &pos.
При этом Icon делает следующее:
Устанавливает конкретное
значение s.
Сохраняет предшествующие значения &subject и &pos.
&subject присваивает значение s, а &pos устанавливает на 1.
Вычисляет e.
Восстанавливает сохраненные на шаге 2 значения &subject и
&pos.
Возвращает значение e.
В случае использования оператора ‘?’ наилучший способ
изменения &pos – это использование функций tab(i) и move(j).
Первая присваивает &pos некоторое абсолютное значение i, а вто-
рая «перемещает» позицию на &pos+j. Обе функции возвращают
подстроку между начальной и новой позициями
.
Примеры:
procedure main()
s:="aaabbbccc"
s ? write(tab(4))
end
Выход: aaa
procedure main()
s:="aaabbbccc"
s ? write(move(4))
end
Выход: aaab
procedure main()
s:="aaabbbccc"
28
s ? {writes(tab(4));writes(move(4))}
end
Выход: aaa bbbc
Теперь с использованием оператора сканирования строки
подпрограмма выделения идентификаторов будет выглядеть так
[3, с. 78]:
#generate identifiers in string
procedure idents(s)
local i, j, initIdChars, idChars
initIdChars := &letters++’_’
idChars := initIdChars++&digits
s ? suspend tab(upto(initIdChars)) &
pos(1) | (move(-1),tab(any(~idChars))) &
tab(many(idChars))
end
     5.5. Более мощные варианты функций сканирования                      s ? {writes(tab(4));writes(move(4))}
                                                                          end
      Функции any, many, match, find не слишком удобны, по-
                                                                          Выход: aaa bbbc
скольку требуют сохранять позицию в строке, а также имя строч-
ной переменной.
                                                                             Теперь с использованием оператора сканирования строки
      Улучшить ситуацию позволяет оператор сканирования стро-
                                                                     подпрограмма выделения идентификаторов будет выглядеть так
ки ‘?’, используемый в виде s ? e, где s – строка, а e – некоторое
                                                                     [3, с. 78]:
выражение.
                                                                             #generate identifiers in string
      Вычисляя выражение e, Icon использует специальные пере-
                                                                             procedure idents(s)
менные &subject и &pos.
                                                                             local i, j, initIdChars, idChars
      При этом Icon делает следующее:
                                                                             initIdChars := &letters++’_’
      Устанавливает конкретное значение s.
                                                                             idChars := initIdChars++&digits
      Сохраняет предшествующие значения &subject и &pos.
                                                                             s ? suspend tab(upto(initIdChars)) &
      &subject присваивает значение s, а &pos устанавливает на 1.
                                                                             pos(1) | (move(-1),tab(any(~idChars))) &
      Вычисляет e.
                                                                             tab(many(idChars))
      Восстанавливает сохраненные на шаге 2 значения &subject и
                                                                             end
&pos.
      Возвращает значение e.
      В случае использования оператора ‘?’ наилучший способ
изменения &pos – это использование функций tab(i) и move(j).
Первая присваивает &pos некоторое абсолютное значение i, а вто-
рая «перемещает» позицию на &pos+j. Обе функции возвращают
подстроку между начальной и новой позициями.
      Примеры:
      procedure main()
      s:="aaabbbccc"
      s ? write(tab(4))
      end
       Выход: aaa

     procedure main()
     s:="aaabbbccc"
     s ? write(move(4))
     end
     Выход: aaab

     procedure main()
     s:="aaabbbccc"

                               27                                                                     28