Rationale for Ada 2005: Predefined library
RUSTOPBACKNEXT
ENG |
5. Characters and strings
@ An important improvement in Ada 2005 is the ability to deal with 16- and 32-bit characters both in the program text and in the executing program. @ The fine detail of the changes to the program text are perhaps for the language lawyer. The purpose is to permit the use of all relevant characters of the entire ISO/IEC 10646:2003 repertoire. The most important effect is that we can write programs using Cyrillic, Greek and other character sets. @ A good example is provided by the addition of the constant
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale for Ada 2005: Predefined library
@ENGRUSTOPBACKNEXT5. Символы и строки
@ Одним из важных усовершенствований в Аде 2005 является появившаяся возможность работать с 16-и 32-разрядными наборами символов как в тексте программы так и в самой выполняющейся программе.
@ Это прекрасное дополнение к правилам языка. Его цель состоит в том, чтобы разрешить использование всех символов набора ISO/IEC 10646:2003. Т.о. мы теперь можем писать программы используя Кириллицу, греческий язык и другие наборы символов.
@ В качестве примера рассмотрим добавление константы:
|
@ к пакету Ada.Numerics. И теперь мы имеем возможность писать математические программы в более естественном виде:
|
@ Другой пример, мы можем описать полярные координаты таким образом:
|
@ и конечно во Франции мы можем теперь объявить приличный набор компонентов на завтрак:
|
@ Любопытно, хотя символ 'й' находится в наборе Latin-1 и, таким образом, доступен в идентификаторах ada, а символ 'њ' - нет (по причине выхода за диапазон ???). Однако, в Аде 95 'њ' - символ типа Wide_Character, и поэтому даже в Аде 95 можно заказать завтрак таким образом:
|
@ Для манипуляции с 32-разрядными символами в Аде 2005 в пакет Standard включены типы Wide_Wide_Character и Wide_Wide_String, а также соответствующие операции для их обработки в пакетах:
@ Появились также новые атрибуты Wide_Wide_Image, Wide_Wide_Value и Wide_Wide_Width и так далее.
@ Добавление общешироких символов и строк вводит много дополнительных возможностей для преобразований. Но простое добавление их непосредственно в существующий пакет Ada.Characters.Handling могло вызвать двусмысленности в существующих программах символьной обработки. В итоге был добавлен отдельный пакет Ada.Characters.Conversions.
@ Были добавлены преобразования в различных комбинациях между Character, Wide_Character и Wide_Wide_Character и так же для строк. Существующие функции от Is_Character до To_Wide_String в Ada.Characters.Handling были перенесены в Приложение J.
@ Появление более сложных устройств записи делает определение нечувствительности между верхним и нижним регистром символов в идентификаторах намного более сложной задачей.
@ В некоторых системах, таких как иерографическая система используемая китайским, японским и корейским языками имеется только один вариант написания, и таким образом, нет никаких проблем. Но в других системах, таких как латинский, греческий алфавиты и Кириллица нужно рассматривать символы верхнего и нижнего регистра. Их эквивалентность является обычно прямой, но есть некоторые интересные исключения. Например, у греческого языка есть две формы для нижнего регитра сигмы (нормальная форма s и конечная форма ? которая используется в конце слова). Они оба преобразовываются в один символ верхнего регистра S. В немецком языке есть строчный символ Я, форма верхнего регистра которого образуется из двух символов SS. Словенский язык имеет графему LJ которую считают одной буквой и она имеет три формы: LJ, Lj и lj.
@ Греческая ситуация имела обыкновение применяться на английском языке, где длинный s использовался в середине слова (где это было похоже на f, но без перекрестного штриха), и знакомое короткое s только в конце. В современном прочтении это делает поэтические строки: "Где пчела сосет, там высосите меня" несколько сомнительными. (Это песня Ariel в V акте I сцене из Бури Уильямом Shakespeare). Определение, выбранное для Ады 2005 близко следует за ISO/IEC 10646:2003 и Unicode Consortium; это, как мы надеемся, означает, что для всех пользователей нечувствительность к верхнему и нижнему регистрам символов в идентификаторах будет работать как ожидается на их собственных языках.
@ Представляет интерес для всех пользователей безотносительно их языка - добавление еще нескольких подпрограмм в пакеты для обработки строк. Как было объяснено во Введении, Ада 95 требует слишком много преобразований между ограниченными и неограниченными строками и базовым типом String и, кроме того, множественный поиск был неудобен.
@ Дополнительные подпрограммы в пакетах следующие.
@ В пакете Ada.Strings.Fixed (предполагаем спецификатор use Maps; для краткости)
|
@ Различие между этими и существующими функциями состоит в том, что у них есть дополнительный параметр From. Что намного упрощает поиск всех вхождений некоторого шаблона в строке.
@ Подобные функции также добавлены в пакет Ada.Strings.Bounded и Ada.Strings.Unbounded.
@ Предположим, что мы хотим найти все вхождения "bar" в строке "barbara barnes" в переменной BS типа Bounded_String. (Я написал имя своей жены строчными буквами для удобства). Этих вхождений 3 конечно. Существующая функция Count может использоваться, чтобы определить этот факт весьма просто:
|
@ Но мы хотим знать на каких позициях они находятся. Первую легко найти на Аде 95:
|
@ Но для того чтобы найти следующую мы должны удалить первые три символа и затем выполнить поиск снова. Это разрушило бы оригинальную строку, поэтому мы сначала должны сделать копию по крайней мере части её таким образом:
|
@ и так далее. (Есть и другие пути, например создать сначала полную копию строки, это можно сделать в другой ограниченной строке (Unbounded_String), или возможно, что является самым простым ,только скопировать её в обычную String; но независимо от того, что мы делаем это весьма топорно). На Аде 2005, найдя индекс первого вхождения, мы легко можем найти индекс второго таким образом:
|
@ и так далее. И это уже гораздо проще.
@ Следующее также добавлено в пакет Ada.Strings.Bounded:
|
@ Процедура Set_Bounded_String подобна существующей функции To_Bounded_String. Таким образом
|
@ эквивалентно:
|
@ Подпрограммы вырезки избегают преобразования и из типа String. Таким образом, чтобы извлечь символы c 3 по 9 мы можем написать:
|
@ тогда как в Аде 95 мы должны были сделать это так:
|
@ Аналогичные подпрограммы добавлены в пакет Ada.Strings.Unbounded. Они еще более ценны, потому что неограниченные строки обычно осуществляются с управляемыми (controlled) типами, и использование процедур, таких как Set_Unbounded_String намного более эффективно чем функции To_Unbounded_String, потому что это избегает присваивания, и таким образом вызова Adjust.
@ Ввод и вывод ограниченных и неограниченных строк в Аде 95 может быть сделан только преобразованием в или из типа String. Это является и медленным и неопрятным. Эта проблема является особенно острой с неограниченными строками. Для решения этой проблемы Ада 2005 обеспечивает следующий дополнительный пакет (мы добавили выражение использования для краткости как обычно)
|
@ Поведение как ожидается.
@ Есть подобный пакет и для ограниченных строк, но он является настраиваемым. Он должен быть настраиваемым потому что пакет Generic_Bounded_Length в пределах Stings.Bounded является самостоятельно настраиваемым и должен иллюстрироваться с максимальным строковым размером. Его спецификация:
|
@ Эти пакеты включают функции Get_Line так же как и процедуры Put_Line и Get_Line соответствующие имеющимся в пакете Text_IO. Причина этого состоит в том, что процедуры Get_Line не являются полностью удовлетворительными.
@ Если мы делаем последовательные вызовы процедуры Text_IO.Get_Line, используя строку длинной 80 серии строк длиной 80 (мы читаем хороший старый набор перфорированных плат), то это не работает как ожидается. Дополнительные вызовы возвращают и строки символов и пустые строки (хронология этого поведения возвращает нас к ранней Аде 83 и ??? лучше всего оставлена бездействующей ???).
@ Ада 2005 соответственно добавляет соответствующие функции Get_Line в пакет Ada.Text_IO непосредственно таким образом:
|
@ Последовательные вызовы функции Get_Line тогда аккуратно возвращают текст на перфокартах одну за другой без беспокойства.
2010-10-24 00:26:58
. .