В настоящее время открытое программное обеспечение играет огромную роль в высшей школе. Особенно активно используется свободный софт в обучении программированию. Существует множество открытых и бесплатных систем разработки программ, таких как GNU C/C++, free-pascal, common-lisp, Refal...
В данной статье (?) описывается одна из таких систем.
Рефал-юникод это реализация расширения популярного нетрадиционного языка программирования Рефал-5, которая позволяет легко работать с текстовыми данными, представленными символами различных кодировок (включая unicode), использовать в одной программе сразу несколько кодировок, работать с юникод-файлами, а так же запускать программы, написанные в юникоде.
Распространенная реализация языка Рефал-5, созданная профессором Турчиным и доработанная разработчиками Москвы и Переяславля-Зарецкого предоставляет эффективный и удобный инструмент обработки текстовой информации, позволяет решать сложные арифметические и логические задачи, а так же задачи метапрограммирования. Однако в исходном коде присутствует ошибка, которая не позволяет работать с файлами, содержащими нулевые байты, что препятствует работе с юникод-текстом.
Система Рефал-юникод является результатом исправления этой ошибки, добавления некоторых встроенных функций для работы с кодировками текстов, и написания нескольких утилит.
В данной реализации языка добавлен новый тип данных юникод-символ, который является s-выражением и может быть считан из юникод-файла или записан в него. Для явного задания такого символа в программе нужно использовать атомарное слово вида
_xxxx ,где хххх его шестнадцатеричный код. Например, слово Refal будет представлено выражением _052 _0x65 _66 _61 _6с .
Задавать юникод-символы явно необходимо только тогда, когда Ваша программа написана в простом текстовом файле. Если же программа сохранена в юникод-файле, то для ее выполнения необходимо воспользоваться утилитой uni2ref.rsl, которая вместе с исходным кодом входит в состав дистрибутива. Эта утилита преобразует юникод-программу в простой текстовый файл, заменяя все явно указанные в ней символы на их юникод-представление это значит, что все символы этих программ воспринимаются как юникод-символы.
Команда запуска:
Refgo uni2ref utf16-файл-программа.ref преобразованная-программа.ref.
Далее необходимо компилировать уже файл 'преобразованная-программа.ref'. (!) Внимание! Полученная программа может оказаться неудобной для чтения и редактирования ошибок. (!)
Функция <Type> для юникод-символа возвращает выражение l_.
Для обработки юникод-файлов необходимо указывать в функции <Open> режим открытия вместе с символом 'u', например:
<Open 'ru' 1 'utf16_file_to_read.txt'>
Функция Get будет считывать из простых файлов простые символы, из юникод-файлов (utf-16) юникод-символы. Функции Put и Putout будут преобразовывать символы к нужному виду автоматически - в соответствии с типом файла и загруженной таблицей перекодировки(см. ниже). Функции Print и Prout так же будут конвертировать все юникод-символы в однобайтные. Функция Card, как и в стандартном Рефале, считывает только однобайтные символы.
Еще одним нововведением стала таблица перекодировки. Таблица представляет собой глобальный массив из 128 ячеек, которые являются образами простых символов с кодами от 128 до 255 (расширение ASCII).
Чтобы загрузить таблицу перекодировки для работы с юникодом, нужно воспользоваться функцией <LoadTable e.e>, где e.e 128 юникод-символов.
Поскольку для работы с юникодом программист обычно использует небольшой набор кодировок (как правило для своего языка), разумно описать функцию, загружающую нужное расширение ASCII по названию кодировки. Для этого была написана Рефал-библиотека unitable.ref, содержащая функцию <Setlocale e.e>. Изначально она хранит две таблицы для русского языка: e.e может быть одним из следующих выражений:
koi8r - для работы с кодировкой KOI8 русского языка (Linux) cp866 - для DOS и Windows
Вы можете описать свои таблицы в этой функции - в том числе для других языков.
Обратите внимание на то, что таблицы перекодировки загружается в программу динамически, что позволяет использовать сразу несколько кодировок в одной программе. Для явного конвертирования (согласно таблице, загруженной функцией <Setlocale>) в этой реализации Рефала-5 были описаны две новые build-in функции: <ToUnicode e.e> и <ToAscii e.e>. Первая конвертирует все простые символы выражения e.e в юникод, вторая - наоборот.
Как было указано ранее, область применения Рефала-5 очень велика. Поддержка юникода делает Рефал более мощным инструментом обработки текстовых файлов. Интернациональная кодировка (UTF-16) сегодня используется повсеместно: текстовые документы (*.doc), базы данных, коды программ современных языков (Java), тексты сайтов и т.д., - поэтому для Рефала открывается новый мир серьезных и актуальных задач, в котором он может занять почетное место одного из мощнейших инструментальных средств.
В качестве учебной задачи предлагается описать еще две функции (пользовательские или build-in): <UTF8to16 e.utf8line> и <UTF16to8 e.utf16line> для поддержки кодировки utf-8. Теперь, когда возможна нормальная обработка Рефалом 0-байтов, описать эти функции на языке Рефал не представляет особого труда.
Данная система была создана в рамках курсовой работы студентом Удмуртского Государственного Университета, Математического факультета, кафедры Математического Обеспечения ЭВМ - Исламовым Маратом (e-mail: slam@idz.ru) под научным руководством доктора физико-математических наук, профессора факультета ФиТИВТ УдГУ - Непейводы Николая Николаевича (сайт: http://ulm.uni.udm.ru/~nnn).