Часть II - Библиотека подпрограмм
1. Введение
В этом документе вы найдёте описание множества подпрограмм. Некоторые из них
встроены непосредственно в интерпретаторы ex.exe,
exw.exe и
exu.
Другие написаны на Euphoria и, чтобы воспользоваться ими, вы должны
будете включать в свою программу стандартные библиотечные .e-файлы,
расположенные в каталоге
euphoria\include.
В этих случаях необходимый библиотечный файла указывается в графе
"Синтаксис" описания подпрограммы. Конечно, библиотечный файл требует
только однократного включения в вашу программу. Встроенные подпрограммы,
не требующие библиотечных файлов, отображаются редактором в малиновом
цвете. Вы можете переопределять эти встроенные подпрограммы, создавая
свои собственные подпрограммы под теми же самыми именами. Интерпретатор
предупредит вас о переопределении сообщением, вывод которого может быть
вами отменён.
Чтобы показать, какой тип объекта должен
быть подан в подпрограмму или выдаётся ею, в описаниях используются следующие
обозначения, непосредственно к синтаксису не относящиеся:
Некоторые подпрограммы доступны только на одной или двух из четырёх
платформ. В описаниях такие подпрограммы обозначены как
"Платформа: DOS32" или
"Платформа: WIN32" или
"Платформа: Linux".
В некоторых других местах вы можете встретить пометки
(DOS32) или
(WIN32) или
(Linux).
Подпрограммы, работающие на Linux, в общем случае работают и на
FreeBSD. Единственное исключение относится к управлению мышью.
Если в подпрограмму будет подан аргумент с недопустимой величиной,
работа вашей программы прервётся с сообщением об ошибке.
2. Предназначение подпрограмм
2.1 Стандартные типы
Предопределённые стандартные типы служат не только для объявления
с ними переменных, но вы можете также вызывать их подобно обычным
функциям, чтобы проверить, что переменная принадлежит к данному
типу.
2.2 Манипулирование рядами
2.3 Сравнение, поиск и сортировка
2.4 Преобразование и сопоставление образцов
2.5 Математика
Эти подпрограммы работают с отдельными атомами или рядами величин.
См. Часть I - Ядро языка -
Операции на рядах.
2.6 Битовые логические операции
Данные подпрограммы трактуют числа как наборы битов
и выполняют логические операции над соответствующими
битами двоичного представления чисел. Мы не предлагаем
подпрограмм для сдвигов битов влево или вправо, так
как вы можете получить такой же эффект, выполняя
умножение или деление на необходимые степени двойки.
2.7 Ввод/вывод для файлов и устройств
Чтобы произвести операции ввода/вывода в файл или на устройство, вы должны
сначала открыть файл или устройство для этих операций, а уже затем
применять подпрограммы, описываемые ниже, для ввода и вывода (записи и
чтения). По окончании операций чтения или записи вы должны закрыть файл или
устройство. Подпрограмма open() выдаст
вам номер файла, который вы должны использовать как первый аргумент
в других подпрограммах ввода/вывода.
Ряд вполне определенных файлов/устройств открыт для вас автоматически
(на манер текстовых файлов):
-
0 - стандартный ввод
-
1 - стандартный вывод
-
2 - стандартная ошибка
Если вы не переопределили направление в
командной строке, стандартный
ввод производится с клавиатуры, стандартный вывод и стандартная ошибка
поступают на экран. Когда вы пишете что-либо на экране, запись выполняется
немедленно без какой бы то ни было буферизации. Если же вы пишете в файл,
символы сначала поступают в буфер, сформированный в оперативной памяти,
пока не накопится пакет, который затем весь быстро выводится в файл.
Когда вы применяете к файлу или устройству процедуры
close() или
flush(), все находящиеся в буфере
символы, даже если пакет не накопился, немедленно выводятся. Ввод
из файлов также производится через буфер. Когда ваша программа
завершается, все файлы, остававшиеся к этому моменту открытыми,
закрываются автоматически.
-
Примечание:
-
Если при исполнении программы (написанной на Euphoria или любом
другом языке) имелись файлы, открытые на запись, а вы, не выходя
из программы, произвели сброс и перезагрузку компьютера (или это
произошло по любой другой причине, например, при исчезновении
питания в силовой сети), необходимо немедленно по окончании
загрузки запустить программу scandisk для исправления
возможных в таких ситуациях повреждений файловой системы на тех
дисках, куда выполнялась запись в момент сброса вашей машины.
Современные операционные системы в таких случаях могут
автоматически запускать scandisk или аналогичное средство.
Никогда не отказывайтесь, если операционная система предлагает
проверить ваши диски.
open (открыть) |
|
- открывает файл или устройство |
close (закрыть) |
|
- закрывает файл или устройство |
flush (вытолкнуть_буфер_в_) |
|
- выталкивает остаток данных из буфера в файл или на устройство |
lock_file (запереть_файл) |
|
- запирает файл или устройство (для других программ) |
unlock_file (отпереть_файл) |
|
- отпирает файл или устройство (для других программ) |
print (печатать) |
|
-
печатает объект Euphoria вместе со скобками и запятыми, {,,},
чтобы показать его структуру |
pretty_print (печатать_столбцом) |
|
-
печатает объект Euphoria в удобной для просмотра форме, располагая
элементы в несколько строк столбцом с соответствующими отступами
|
? x |
|
- короткий вариант для pretty_print(1, x, {}) |
sprint (печатать_в_строковый_ряд) |
|
- выдаёт отпечатанный объект Euphoria в виде символьного ряда |
printf (печатать_в_формате) |
|
- выполняет форматированную печать в файл или на устройство |
sprintf (печатать_в_ряд_в_формате) |
|
- выдаёт отформатированный отпечатанный объект Euphoria в виде символьного ряда |
puts (вывести) |
|
- выводит символьный ряд (ряд байтов) в файл или на устройство |
getc (получить_байт) |
|
- читает следующий очередной символ (байт) из файла или с устройства |
gets (получить_строку) |
|
- читает следующую очередную строку из файла или с устройства |
get_bytes (получить_байты) |
|
- читает следующие очередные n байтов из файла или с устройства |
prompt_string (ввести_строку) |
|
- приглашает пользователя к вводу строки символов (текста) с клавиатуры |
get_key (получить_клавишу) |
|
- проверяет, какая клавиша была нажата на клавиатуре, не ждет нажатия |
wait_key (ждать_клавишу) |
|
- ждет нажатия на клавишу |
get (получить) |
|
- читает следующий очередной объект Euphoria из файла |
prompt_number (ввести_число) |
|
- приглашает пользователя к вводу числа с клавиатуры |
value (величина) |
|
- читает строковое представление объекта Euphoria, преобразует в величину |
seek (перейти) |
|
- переходит на заданную байтовую позицию в открытом файле |
where (где) |
|
- выдаёт текущую байтовую позицию в открытом файле |
current_dir (текущий_каталог) |
|
- выдаёт имя текущего каталога (директории, фолдера, папки) |
chdir (изменить_каталог) |
|
- делает заданный каталог текущим |
dir (каталог) |
|
- выдаёт полную информацию по всем файлам в каталоге |
walk_dir (пройти_каталог) |
|
- рекурсивно проходит все файлы в каталоге, обрабатывая их |
allow_break (разрешить_стоп) |
|
- разрешает остановку вашей программы по нажатию клавиш
control-c / control-Break или запрещает её |
check_break (проверить_стоп) |
|
- проверяет, нажимались ли клавиши control-c или control-Break |
2.8 Управление мышью (DOS32)
Примечание:
На платформе Windows XP, если вы хотите, чтобы мышь DOS
работала в окне (не-полный-экран), вы должны выключить режим QuickEdit,
воспользовавшись опцией Properties для окна DOS.
2.9 Взаимодействие с операционной системой
2.10 Специальные низкоуровневые подпрограммы
2.11 Отладка
2.12 Графика и звук
Подпрограммы этой группы позволяют вам отображать информацию на экране.
Под DOS экран может быть включен в разнообразные графические режимы.
Все доступные графические режимы распадаются на два основных типа.
В текстовых режимах экран делится на строки, в каждой из которых может
быть размещено определённое число символов. В текстовых режимах вы можете
отображать текстовую и цифровую информацию и пользоваться символами
псевдографики для формирования таблиц, выбирая цвета фона и переднего плана.
В пиксельных режимах экран делится на множество точек, вплотную прилегающих
одна к другой, так называемых "пикселов". Пикселам можно назначать различные
цвета. В пиксельных режимах вы можете отображать линии, окружности, точки,
но одновременно и текст, и псевдографику. Те пикселы, координаты которых
лежали бы за пределами экрана в заданном режиме, автоматически исключаются
из изображения, не вызывая аварийной остановки программы. Но попытка
напечатать символ за пределами числа строк и столбцов, допускаемых заданным
текстовым или пиксельным режимом, приводит к аварийной остановке программы.
Текстовые режимы работают многократно быстрее пиксельных, но не обеспечивают
доступ к каждому отдельному пикселу, а только к целым символам.
Для DOS32 имеется подпрограмма, которая может генерировать звуки
на встроенном громкоговорителе вашего компьютера. Чтобы извлекать из
машины практически любые необходимые вам звуки, получите библиотеку Sound
Blaster, разработанную Жаком Дешеном.
Она доступна на Web-узле RDS.
Нижеследующие подпрограммы работают во всех
текстовых и пиксельных режимах:
Нижеследующие подпрограммы работают
только в текстовых режимах:
Нижеследующие подпрограммы работают только
в пиксельных режимах (DOS32):
2.13 Интерфейс уровня машины
Здесь сгруппированы подпрограммы, которые пригодятся вам, если вы
решите поработать со своей машиной на уровне машинных кодов.
Предлагаемый интерфейс низкого уровня позволяет вам читать и записывать
данные и код непосредственно в оперативной памяти. Это значит, что вы
можете разрабатывать свои собственные подпрограммы в кодах машин
386+ и вызывать их на исполнение.
Некоторые из подпрограмм, перечисленных ниже, не являются безопасными
в том смысле, что Euphoria не сможет подстраховать вас при некорректном
их использовании. Вы рискуете "подвесить" свою программу, операционную
систему или даже машину, если сделаете что-то не так, как следовало бы.
Если под DOS32 вы обратитесь к негодным адресам в памяти, то в дело
вступит расширитель DOS CauseWay, и вы получите от него на экране сообщение
об ошибке плюс распечатку информации на машинной тарабарщине в файле
cw.err.
Под WIN32 операционная система выдаст вам обычную свою табличку о прерывании
прогона вашей программы со скупым диагностическим сообщением плюс информацию
из регистров процессора. Под Linux в типовом случае вы получите аварийную
остановку программы и сообщение о нарушении сегментации.
-
Примечание:
-
Чтобы помочь программистам в этих рискованных занятиях, мы поставляем
библиотечный файл safe.e, как
отладочную замену файла machine.e.
Если вы скопируете safe.e из каталога euphoria\include\
в каталог, содержащий вашу программу, и переименуете safe.e
как machine.e в этом вашем рабочем каталоге,
ваша программа будет исполняться с использованием более безопасного, но и более
медленного, варианта обычных подпрограмм низкого уровня.
Этот safe.e может отловить многие ошибки,
в том числе и такие, как запись в память по негодным адресам. Просмотрите
комментарии в начале файла safe.e, чтобы получить полную инструкцию по его
применению и оптимальному его конфигурированию под вашу программу.
Подпрограммы интерфейса уровня машины очень важны для
продвинутого программирования, так как они позволяют
Euphoria-программистам получить доступ ко всем ресурсам, заложенным на
низком уровне в ваше оборудование и вашу операционную систему. В некоторых
особо ответственных случаях данная возможность может иметь решающее
значение.
Подпрограммы в машинных кодах могут быть написаны вручную или же получены
путем дизассемблирования выходных файлов компиляторов Си или некоторых
других языков. Пит Эберлейн написал "мини-ассемблер" для использования
с Euphoria. Просмотрите
Архив файлов. Не забывайте, что ваш машинный код будет исполняться
в 32-разрядном защищённом режиме. Просмотрите файл
demo\dos32\callmach.ex, чтобы получить
более конкретное представление о деталях этого дела.
peek (читать_из_памяти) |
|
- выдаёт один или более байтов из памяти с заданного адреса |
peek4s (читать_из_памяти_4_байта_и_знак) |
|
- выдаёт 4-х байтовую величину со знаком из памяти с заданного адреса |
peek4u (читать_из_памяти_4_байта_без_знака) |
|
- выдаёт 4-х байтовую величину без знака из памяти с заданного адреса |
poke (записать_в_память) |
|
- записывает один или более байтов в память, начиная с заданного адреса |
poke4 (записать_в_память_4_байта) |
|
- записывает 4-х байтовую величину в память по заданному адресу |
mem_copy (копировать_память) |
|
- копирует в памяти последовательность байтов с одного заданного адреса по другому |
mem_set (заполнить_память) |
|
- устанавливает все байты заданного участка памяти в заданное значение |
call (вызвать) |
|
- вызывает на исполнение подпрограмму, написанную в машинных кодах |
dos_interrupt (прерывание_dos) |
|
- вызывает подпрограмму обработки прерывания DOS (DOS32) |
allocate (выделить_память) |
|
- выдаёт адрес свободного участка памяти заданного объёма |
free (освободить_память) |
|
- освобождает участок памяти, ранее выделенный по команде allocate |
allocate_low (выделить_память_внизу) |
|
- выдаёт адрес свободного участка нижней памяти (адреса менее 1Mb) (DOS32) |
free_low (освободить_память_внизу) |
|
- освобождает участок памяти, ранее выделенный по команде allocate_low (DOS32) |
allocate_string (поместить_строку_в_память) |
|
- размещает в памяти заданную строку с нуль-терминатором и выдаёт её адрес |
register_block (учесть_блок) |
|
- регистрирует в списке безопасных блоков участок памяти, ранее
уже выделенный какой-либо подпрограммой |
unregister_block (вычеркнуть_блок) |
|
- вычёркивает из списка безопасных ранее зарегистрированный блок памяти (см. выше) |
get_vector (получить_адрес_вектора) |
|
- выдаёт адрес обработчика прерывания (DOS32) |
set_vector (установить_адрес_вектора) |
|
- устанавливает адрес обработчика прерывания (DOS32) |
lock_memory (запереть_память) |
|
- предохраняет заданный блок памяти от перенесения на диск
при работе виртуальной памяти (DOS32) |
int_to_bytes (байты_из_целого) |
|
- выдаёт 4 байта, соответствующие заданному целому |
bytes_to_int (целое_из_байтов) |
|
- выдаёт целое, соответствующее заданным 4 байтам |
int_to_bits (биты_из_целого) |
|
- выдаёт ряд битов, соответствующий заданному целому |
bits_to_int (целое_из_битов) |
|
- выдаёт целое, соответствующее заданному ряду битов |
atom_to_float64 (атом_в_плавающее_64_бит) |
|
- выдаёт ряд из 8 байтов, соответствующий заданному атому, в 64-битном формате IEEE
для чисел с плавающей точкой |
atom_to_float32 (атом_в_плавающее_32_бит) |
|
- выдаёт ряд из 8 байтов, соответствующий заданному атому, в 32-битном формате IEEE
для чисел с плавающей точкой |
float64_to_atom (плавающее_64_бит_в_атом) |
|
- выдаёт атом, соответствующий ряду из 8 байтов в 64-битном формате IEEE
для чисел с плавающей точкой |
float32_to_atom (плавающее_32_бит_в_атом) |
|
- выдаёт атом, соответствующий ряду из 4 байтов в 32-битном формате IEEE
для чисел с плавающей точкой |
set_rand (установить_датчик_случайных_чисел) |
|
- устанавливает датчик случайных чисел в режим выдачи
помеченной серии чисел с восстанавливаемым порядком |
use_vesa (использовать_vesa) |
|
- переключает интерпретатор Euphoria в режим выполнения
рекомендаций видеостандарта VESA (DOS32) |
crash_file (файл_отчета_об_авосте) |
|
- определяет файл для записи диагностической информации, если Euphoria
обнаруживает ошибку в вашей программе |
crash_message (сообщение_об_авосте) |
|
- определяет сообщение об ошибке, которое будет выводиться,
если Euphoria обнаруживает ошибку в вашей программе
|
crash_routine (подпрограмма_по_авосту) |
|
- определяет подпрограмму, которая должна быть вызвана перед аварийной
остановкой, если Euphoria обнаруживает ошибку в вашей программе
|
2.14 Динамические вызовы
Данные подпрограммы позволяют вам вызывать процедуры и функции Euphoria
с использованием вместо обычного имени уникального целого числа, известного
как идентификационный номер подпрограммы.
2.15 Вызов функций Си (WIN32 и Linux)
Просмотрите файл
platform_r.htm,
где подробно описано программирование на Euphoria для операционных
систем WIN32 и Linux.
2.16 Многозадачность
Набор подпрограмм данного раздела позволяет вам организовывать
в своей программе множественные независимые задачи, решаемые
в режиме разделения времени. Каждая задача имеет свою собственную
текущую исполняемую команду, свой собственный стек вызовов и своё
собственное множество частных переменных. Локальные (местные) и
глобальные переменные программы являются общими для всех задач.
Когда в задаче вызывается подпрограмма task_yield(), выполнение
задачи приостанавливается, управление передаётся диспетчеру задач
Euphoria, и он решает, какую задачу из общей очереди следует
поставить на дальнейшее исполнение.
Демонстрационная игра The Language War, lw.ex, широко использует
механизм многозадачности для создания модели боя, в котором участвуют
многочисленные независимо движущиеся корабли, торпеды, фазоры и т.д.
Просмотрите также демо-программу taskwire.exw для Windows,
и демо-программу news.exu для Linux и FreeBSD.
... продолжение
3. Алфавитный справочник по всем подпрограммам, от A до B
|