Книга: Язык программирования Euphoria. Справочное руководство
от H до O
от H до O
instance
Платформа:
WIN32
Синтаксис:
include misc.e
i = instance()
Описание:
Выдаёт идентификатор текущей программы.
Комментарии:
Этот идентификатор представляет собой число, вырабатываемое операционной системой, и может быть подан в различные функции Windows, выдающие сведения о текущей исполняемой программе, т.е. о вашей программе. Каждый раз, когда пользователь запускает вашу программу, будет вырабатываться другой идентификатор экземпляра (образца) программы.
В языке Си это первый аргумент при вызове функции WinMain().
На платформах DOS32 и Linux/FreeBSD instance() всегда выдаёт 0.
См. также:
platform.doc
int_to_bits
Синтаксис:
include machine.e
s = int_to_bits(a, i)
Описание:
Выдаёт i младших битов атома a как ряд единиц и нулей. В этом ряде младшие значащие биты идут первыми. Для отрицательных чисел выдаётся двоичное дополнение.
Комментарии:
, , and/or/xor/not
Вы можете использовать индексирование, сечение, операторы and/or/xor/not для обработки выходного ряда, т.е. манипулировать рядами битов по своему усмотрению. При необходмости могут быть легко осуществлены обычные и циклические сдвиги битов, а также другие преобразования.
Пример:
s = int_to_bits(177, 8)
-- s будет равно {1,0,0,0,1,1,0,1} -- "обратный" порядок
См. также:
bits_to_int, and_bits, or_bits, xor_bits, not_bits, операции на рядах
int_to_bytes
Синтаксис:
include machine.e
s = int_to_bytes(a)
Описание:
Преобразует целое в ряд, состоящий из 4 байтов. Эти байты идут в порядке, предусмотренном на машинах 386+, т.е. младший значащий байт идет первым.
Комментарии:
Вы можете воспользоваться этой процедурой перед засылкой 4 байтов в память при работе с программой на машинном языке.
Целое может быть отрицательным. При этом будут выданы отрицательные значения для величин байтов, но после засылки их в память вы получите правильное представление (двоичное дополнение), принятое на машинах 386+.
Эта функция будет правильно преобразовывать целочисленные величины, включая 32-битные и менее. Для больших величин преобразуются только младшие 32 бита. Тип целых в Euphoria может иметь величину не более 31 бита, так что объявляйте ваши переменные как атом, если вам нужны более широкие пределы величин.
Пример 1:
s = int_to_bytes(999)
-- s будет равно {231, 3, 0, 0}
Пример 2:
s = int_to_bytes(-999)
-- s будет равно {-231, -4, -1, -1}
См. также:
bytes_to_int, int_to_bits, bits_to_int, peek, poke, poke4
integer
Синтаксис:
i = integer(x)
Описание:
Выдаёт 1, если x является целым в пределах от -1073741824 до +1073741823. В противном случае выдаёт 0.
Комментарии:
Данная команда служит для объявления переменной типа integer. Вы можете также использовать её и как функцию для проверки, какого типа объект перед вами, не целое ли это число.
Пример 1:
integer z
z = -1
Пример 2:
if integer(y/x) then
puts(SCREEN, "y кратно x")
end if
См. также:
atom, sequence, floor
length
Синтаксис:
i = length(s)
Описание:
Выдаёт длину ряда s. Переменная s должна быть именно типа ряд. В случае, если s является атомом, возникает ошибка времени исполнения с остановкой программы и выводом сообщения.
Комментарии:
Значение текущей длины каждого ряда сохраняется интерпретатором во внутреннем формате для осуществления быстрого доступа.
Пример 1:
length({{1,2}, {3,4}, {5,6}}) -- 3
Пример 2:
length("") -- 0
Пример 3:
length({}) -- 0
См. также:
sequence
lock_file
Синтаксис:
include file.e
i1 = lock_file(fn, i2, s)
Описание:
Когда одновременный доступ к файлу разрешён многим процессам, может понадобиться некий запирающий механизм, чтобы не допустить порчи содержимого в файле или избежать чтения ошибочных данных.
lock_file() как раз и запирает открытый файл, fn, чтобы предотвратить параллельный доступ других процессов к файлу в то время, когда ваша программа читает файл или пишет в него. Под Linux/FreeBSD имеется два типа замков, которые вы можете выбрать, используя параметр i2. (Под DOS32 и WIN32 параметр i2 игнорируется, но должен быть типа integer.) Выбирайте shared (общий) замок, когда вам необходимо читать из файла и вы хотите временно заблокировать другие процессы от записи в этот файл. Выбирайте exclusive (исключительный) замок, когда вам необходима запись в файл и требуется временная блокировка других процессов и от записи, и от чтения вашего файла. Один и тот же файл может иметь общие замки от многих процессов, но только один процесс может ставить исключительный замок, и это может быть только в том случае, когда ни один другой процесс не имеет никакого замка для этого файла. Библиотечный файл file.e содержит следующее объявление:
global constant LOCK_SHARED = 1,
LOCK_EXCLUSIVE = 2
Под DOS32 и WIN32 вы можете запирать назначенную часть файла, используя аргумент s. Переменная s должна быть типа ряд и иметь форму: {первый_байт, последний_байт}. Ряд обозначает первый и последний байты участка в файле, к которому применен замок. Задавайте пустой ряд {}, если вы хотите запереть весь файл. В данном выпуске для Linux/FreeBSD может быть заперт только весь файл, поэтому в качестве аргумента s вы должны задавать {}.
Если функция выполнена успешно, lock_file() выдаёт 1. Если запирание не удалось, выдаётся 0. lock_file() не ожидает, пока другие процессы снимут свои замки. Вам могут понадобиться повторные вызовы данной функции, прежде чем запрос замка будет удовлетворен.
Комментарии:
Под Linux/FreeBSD эти замки называются "консультативными", податливыми замками, это означает, что они осуществляются не операционной системой. Они указывают, как процессы могут использовать отдельные особые файлы во взаимодействии со всеми другими процессами. Процесс может получить доступ к файлу без предварительного его запирания для других процессов. Под WIN32 и DOS32 запирание файлов осуществляется операционной системой.
Под DOS32 lock_file() более полезна, когда доступ к файлам общий. Вне Windows, под чистой MS-DOS, функция обычно выдаёт 0 (неуспешно).
Пример:
include misc.e
include file.e
integer v
atom t
v = open("visitor_log", "a") -- открыт для дополнения
t = time()
while not lock_file(v, LOCK_EXCLUSIVE, {}) do
if time() t + 60 then
puts(1, "Уже прошла целая минута ... Я не могу ждать вечно!n")
abort(1)
end if
sleep(5) -- позволим идти другим процессам
end while
puts(v, "Ещё один посетительn")
unlock_file(v, {})
close(v)
См. также:
unlock_file, flush, sleep
lock_memory
Платформа:
DOS32
Синтаксис:
include machine.e
lock_memory(a, i)
Описание:
Предохраняет участок виртуальной памяти, начинающийся по адресу a, имеющий длину i, от перекачки на диск.
Комментарии:
Используйте данную процедуру, чтобы быть уверенным, что весь код и данные, необходимые для обработки прерываний, хранятся в памяти во всё время исполнения вашей программы. lock_memory() может потребоваться только в крайне специальной ситуации, когда вы установили свой собственный обработчик машинного прерывания DOS, использующий машинный код. Когда машинное прерывание срабатывает, у операционной системы теряется всякая возможность обратиться к коду или данным, которые были выгружены на диск, поэтому вам нужна защита всех участков памяти с машинным кодом или данными, которые будут необходимыми при обслуживании прерывания.
Пример программы:
demodos32hardint.ex
См. также:
get_vector, set_vector
log
Синтаксис:
x2 = log(x1)
Описание:
Выдаёт натуральный логарифм x1.
Комментарии:
Эта функция может быть применена к атому или ко всем элементам ряда. Заметьте, что логарифм определён только для положительных чисел. Ваша программа будет прервана с сообщением об ошибке, если вы попытаетесь взять логарифм отрицательного числа или нуля.
Пример:
a = log(100)
-- a будет равно 4.60517
См. также:
sin, cos, tan, sqrt
lower
Синтаксис:
include wildcard.e
x2 = lower(x1)
Описание:
Преобразует атом или ряд на латинском алфавите к нижнему регистру.
Пример:
s = lower("Euphoria")
-- s будет равно "euphoria"
a = lower('B')
-- a будет равно 'b'
s = lower({"Euphoria", "Programming"})
-- s будет равно {"euphoria", "programming"}
См. также:
upper
machine_func
Синтаксис:
x1 = machine_func(a, x)
Описание:
См. machine_proc() ниже
machine_proc
Синтаксис:
machine_proc(a, x)
Описание:
Выполняет специфические машинные операции, такие как графика или звуковые эффекты. Эти процедуры обычно вызываются косвенно через одну из соответствующих библиотечных процедур, имеющихся во включаемых файлах пакета Euphoria. Прямой вызов может повлечь за собой зависание машины или другие тяжелые последствия, если выполнен некорректно.
См. также:
machine_func
match
Синтаксис:
i = match(s1, s2)
Описание:
Пытается найти совпадение s1 и последовательных отрезков s2. Если удалось, выдаёт номер элемента s2, которым начинается (первый) совпадающий отрезок, иначе выдаёт 0.
Пример:
location = match("pho", "Euphoria")
-- location будет равно 3
См. также:
find, find_from, compare, match_from, wildcard_match
match_from
Синтаксис:
i1 = match_from(s1, s2, i2)
Описание:
Пытается найти совпадение s1 и последовательных отрезков s2, начиная с индекса i2. Если удалось, выдаёт номер элемента s2, которым начинается (первый) совпадающий отрезок, иначе выдаёт 0. i2 может иметь любую величину в пределах от 1 до длины s плюс 1. (Совершенно аналогично первому индексу при сечении s.)
Пример:
location = match_from("pho", "phoEuphoria", 4)
-- location будет равно 6
См. также:
find, find_from, match, compare, wildcard_match
mem_copy
Синтаксис:
mem_copy(a1, a2, i)
Описание:
Копирует участок в памяти, включающий i байтов, с адреса a2 по адресу a1.
Комментарии:
Байты в памяти будут скопированы правильно, даже если участок по адресу a2 частично перекрывает участок по адресу a1.
mem_copy(a1, a2, i) эквивалентно: poke(a1, peek({a2, i})), но выполняется значительно быстрее.
Пример:
dest = allocate(50)
src = allocate(100)
poke(src, {1,2,3,4,5,6,7,8,9})
mem_copy(dest, src, 9)
См. также:
mem_set, peek, poke, allocate, allocate_low
mem_set
Синтаксис:
mem_set(a1, i1, i2)
Описание:
Устанавливает i2 байтов в памяти, начиная с адреса a1, в значение i1.
Комментарии:
Младшие 8 битов i1 будут размещены в каждом байте.
mem_set(a1, i1, i2) эквивалентно: poke(a1, repeat(i1, i2)) но выполняется значительно быстрее.
Пример:
destination = allocate(1000)
mem_set(destination, ' ', 1000)
-- 1000 последовательных байтов в памяти будут установлены в 32
-- (ASCII-код для ' ')
См. также:
mem_copy, peek, poke, allocate, allocate_low
message_box
Платформа:
WIN32
Синтаксис:
include msgbox.e
i = message_box(s1, s2, x)
Описание:
Выводит окно с заголовком s2, содержащее строку сообщения s1. x определяет комбинацию кнопок, которые будут доступны для нажатия пользователем, и некоторые другие характеристики. x может быть атомом или рядом. Если функция выдаёт 0, это говорит об ошибке при попытке вывести окно.
Комментарии:
Просмотрите msgbox.e, где имеется полный перечень возможных величин для x и i.
Пример:
response = message_box("Желаете продолжить?",
"Моя программа",
MB_YESNOCANCEL)
if response = IDCANCEL or response = IDNO then
abort(1)
end if
Пример программы:
demowin32email.exw
mouse_events
Платформа:
DOS32
Синтаксис:
include mouse.e
mouse_events(i)
Описание:
Используйте эту процедуру, чтобы выбрать мышиные события, которые вам необходимо отслеживать с помощью get_mouse(). По умолчанию get_mouse() будет выдавать данные обо всех событиях. mouse_events() может быть вызвана на различных этапах исполнения вашей программы по мере необходимости изменения перечня событий.
Комментарии:
Хорошей практикой является игнорирование тех событий, которые вас не интересуют, кроме обычно очень частого события MOVE, чтобы снизить вероятность пропуска события, имеющего большое значение в вашей программе.
Первый вызов mouse_events(), который вы сделаете, включит курсор мыши или подсвеченный символ.
Пример:
mouse_events(LEFT_DOWN + LEFT_UP + RIGHT_DOWN)
-- ограничит данные get_mouse() информацией о нажатии
-- и отпускании левой кнопки и о нажатии правой кнопки.
-- Все остальные события будут игнорироваться.
См. также:
get_mouse, mouse_pointer
mouse_pointer
Платформа:
DOS32
Синтаксис:
include mouse.e
mouse_pointer(i)
Описание:
Если i равно 0, выключает курсор мыши, в противном случае включает его. Множественные выключения курсора требуют такого же числа включений. Первый вызов get_mouse() или mouse_events() также включит курсор (один раз).
Комментарии:
Временное выключение курсора мыши может быть необходимым, если на экран выводится новая информация.
После вызова text_rows() вам может понадобиться вызов mouse_pointer(1), чтобы курсор мыши стал снова видимым.
См. также:
get_mouse, mouse_events
not_bits
Синтаксис:
x2 = not_bits(x1)
Описание:
Выполняет логическую операцию NOT над каждым битом в x1. Бит в x2 будет равен 1, когда соответствующий бит в x1 равен 0, и будет равен 0, когда соответствующий бит в x1 равен 1.
Комментарии:
Аргументом для данной функции может быть атом или ряд. Применяются правила операций на рядах.
Аргумент должен быть представимым как 32-битное число, со знаком или без знака.
Если вы предполагаете манипулировать с полными 32-битными величинами, вы должны объявить ваши переменные как atom, а не как integer. Тип integer Euphoria ограничен 31-м битом.
Результаты трактуются как числа со знаком. Они будут отрицательными, если старший бит равен 1.
Пример:
a = not_bits(#000000F7)
-- a будет равно -248 (т.е. FFFFFF08 интерпретируется как отрицательное число)
См. также:
and_bits, or_bits, xor_bits, int_to_bits
object
Синтаксис:
i = object(x)
Описание:
Проверяет, является ли x объектом. Это всегда будет истиной, так что object() всегда выдаёт 1.
Комментарии:
Все предопределенные и пользовательские типы могут также быть использованы для проверки, принадлежит ли величина данному типу. Функция object() включена только для комплектности. Она всегда выдаёт 1.
Пример:
? object({1,2,3}) -- всегда печатает 1
См. также:
integer, atom, sequence
open
Синтаксис:
fn = open(st1, st2)
Описание:
Открывает файл или устройство, выдаёт номер файла, который служит аргументом для подпрограмм ввода/вывода. Если открытие не состоялось, выдаётся -1. Ряд st1 содержит путь к файлу или устройству. Ряд st2 задаёт режим, в котором файл должен быть открыт. Возможны следующие режимы:
"r" - открыть текстовый файл для чтения
"rb" - открыть двоичный файл для чтения
"w" - создать текстовый файл для записи
"wb" - создать двоичный файл для записи
"u" - открыть текстовый файл для обновления (чтение и запись)
"ub" - открыть двоичный файл для обновления
"a" - открыть текстовый файл для добавления
"ab" - открыть двоичный файл для добавления
Файлы, открываемые для чтения или обновления, должны уже существовать. Файлы, открытые для записи или добавления, будут созданы, если необходимо. Файл, открытый для записи, будет установлен на 0-ой (самый первый) байт. Вывод в файл, открытый для добавления, начнётся в конце существующего файла.
Вывод в текстовые файлы будет иметь символы возврата каретки, автоматически добавляемые перед символами перевода строки. На входе эти символы возврата каретки удаляются. Символ control-Z (ASCII 26) является сигналом немедленного окончания файла. Примечание: на некоторых версиях DOS ввод пользователем control-Z может вызывать сбой стандартного ввода, устраняемый только закрытием окна DOS.
Ввод/вывод в двоичных файлах никак не модифицируется. Любая величина байта от 0 до 255 может быть считана или записана.
Некоторые типовые устройства, которые вы можете открыть под DOS или Windows :
"CON" - консоль (экран)
"AUX" - вспомогательный последовательный порт
"COM1" - последовательный порт 1
"COM2" - последовательный порт 2
"PRN" - принтер, подключенный к параллельному порту
"NUL" - несуществующее устройство, поглощающее вывод
В настоящее время доступна работа с файлами размером до 2 Gb. За этой границей некоторые файловые операции могут выполняться некорректно. Данный лимит со временем может быть пересмотрен.
Комментарии:
DOS32: При исполнении программы под Windows 95 или более новой ОС этого семейства вы можете открыть любой существующий файл, который имеет длинное своё имя (т.е. длиннее, чем стандартный формат 8.3 DOS) или длинные имена каталогов в его пути, используя любой режим (чтение, запись и т.д.). Тем не менее, если вы попытаетесь создать новый файл с длинным именем (открыть в режиме "w" или "a" файл, который ещё не существует), это имя будет усечено до необходимого формата 8.3. Мы надеемся добавить возможность создания новых файлов с длинными именами в будущих версиях Euphoria.
WIN32, Linux and FreeBSD: Работа с длинными именами файлов полностью обеспечивается при чтении, записи и создании.
DOS32: Тщательно избегайте использования имён устройств в качестве имён файлов, даже если вы добавляете к ним расширение имени, т.е. CON.TXT, CON.DAT, CON.JPG и т.д. - все подобные имена относятся только к устройству CON, но не к файлам, существование которых невозможно.
Пример:
integer file_num, file_num95
sequence first_line
constant ERROR = 2
file_num = open("myfile", "r")
if file_num = -1 then
puts(ERROR, "не могу открыть myfilen")
else
first_line = gets(file_num)
end if
file_num = open("PRN", "w") -- открывает принтер для вывода
-- под Windows 95:
file_num95 = open("bigdirectorynameverylongfilename.abcdefg",
"r")
if file_num95 != -1 then
puts(1, "это работает!n")
end if
См. также:
close, lock_file
open_dll
Платформа:
WIN32, Linux, FreeBSD
Синтаксис:
include dll.e
a = open_dll(st)
Описание:
Открывает файл библиотеки динамического связывания Windows(.dll) или файл общей библиотеки Linux или FreeBSD(.so). Выдаёт 32-битный адрес или 0, если файл .dll не найден. В ряде st должно содержаться относительное или абсолютное имя файла. Windows будет использовать обычный системный путь поиска для доступа к файлам .dll.
Комментарии:
Значение адреса, выданное open_dll(), служит аргументом для подпрограмм define_c_proc(), define_c_func() и define_c_var().
Вы можете открыть один и тот же файл .dll или .so несколько раз. Для этого не потребуется лишней памяти и вы будете получать одно и то же значение адреса при каждом открытии.
Euphoria закрывает библиотеки .dll автоматически в конце исполнения программы.
Пример:
atom user32
user32 = open_dll("user32.dll")
if user32 = 0 then
puts(1, "Не могу открыть user32.dll!n")
end if
См. также:
define_c_func, define_c_proc, define_c_var, c_func, c_proc, platform.doc
or_bits
Синтаксис:
x3 = or_bits(x1, x2)
Описание:
Выполняет логическую операцию OR над соответствующими битами в x1 и x2. Бит в x3 будет равен 1, когда соответствующий бит или в x1, или в x2 равен 1.
Комментарии:
Аргументами данной функции могут быть атомы или ряды. Применяются правила операций на рядах.
Аргументы должны быть представимы как 32-битные числа, со знаком или без знака.
Если вы намерены манипулировать полными 32-битными величинами, вы должны объявить ваши переменные как atom, а не как integer. Тип integer в Euphoria ограничен 31-м битом.
Результаты трактуются как числа со знаком. Они будут отрицательными, когда старший бит равен 1.
Пример 1:
a = or_bits(#0F0F0000, #12345678)
-- a будет равно #1F3F5678
Пример 2:
a = or_bits(#FF, {#123456, #876543, #2211})
-- a будет равно {#1234FF, #8765FF, #22FF}
См. также:
and_bits, xor_bits, not_bits, int_to_bits
...
- Глава 2 Табличный редактор Microsoft Excel
- Build a Run-Time Image for an OS Design
- Клонирование по сетке ("Copy to Grid")
- random_sample
- 12.7. Класс CheckboxGroup
- 6.3.2. Процедура сбора качественных данных
- «Плиточные» структуры и квазикристаллы
- 16.13 Формат сообщений MIME
- Как уразуметь свою техническую роль и придерживаться ее
- Отправка запроса
- Как отвечать на письма, полученные вашей организацией
- 5.1.1. Создание трехмерной модели радиатора