Платформа: | WIN32 |
Синтаксис: | include misc.e i = instance() |
Описание: | Выдает идентификатор текущей программы. |
Комментарии: | Этот идентификатор может быть подан в различные процедуры Windows,
чтобы получить сведения о текущей исполняемой программе, т.е. о вашей
программе. Каждый раз, когда пользователь запускает вашу программу,
будет создаваться другой идентификатор экземпляра (образца) программы.
В языке C это первый параметр для входа в WinMain(). На платформах DOS32 и Linux instance() всегда выдает 0. |
См. также: | platform.doc |
Синтаксис: | include machine.e s = int_to_bits(a, i) |
Описание: | Выдает младшие i битов атома a как ряд единиц и нулей. В этом ряде младшие значащие биты также идут первыми. Для отрицательных чисел выдается двоичное дополнение. |
Комментарии: | Вы можете использовать индексирование, сечение, операторы 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, операции на рядах |
Синтаксис: | 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 |
Синтаксис: | i = integer(x) |
Описание: | Выдает 1, если x является целым в пределах от -1073741824 до +1073741823. В противном случае выдает 0. |
Комментарии: | Данный оператор служит для объявления типа integer. Вы можете также использовать его и как обычную функцию для проверки, какого типа объект перед вами, не целое ли число. |
Пример 1: | |
integer z z = -1 | |
Пример 2: | |
if integer(y/x) then puts(SCREEN, "y is an exact multiple of x") end if | |
См. также: | atom, sequence, floor |
Синтаксис: | i = length(s) |
Описание: | Выдает длину s. Переменная s должна быть рядом. В случае, если s является атомом, возникает ошибка времени прогона. |
Комментарии: | Длина каждого ряда сохраняется интерпретатором во внутреннем формате для быстрого доступа. (В других языках эта операция требует поиска в памяти соответствующего конечного маркера.) |
Пример 1: | |
length({{1,2}, {3,4}, {5,6}}) -- 3 | |
Пример 2: | |
length("") -- 0 | |
Пример 3: | |
length({}) -- 0 | |
См. также: | sequence |
Синтаксис: | include file.e i1 = lock_file(fn, i2, s) |
Описание: | Когда многим процессам разрешен одновременный доступ к файлу,
может понадобиться некий запирающий механизм, чтобы избежать порчи
содержимого в файле или чтения ошибочных данных.
lock_file() запирает открытый файл, fn, чтобы предотвратить доступ других процессов к файлу в то время, когда ваша программа читает файл или пишет в него. Под Linux имеется два типа замков, которые вы можете выбрать, используя параметр i2. (Под DOS32 и WIN32 параметр i2 игнорируется, но должен быть типа integer.) Выбирайте shared (общий) замок, когда вам необходимо читать из файла и вы хотите временно заблокировать другие процессы от записи в этот файл. Выбирайте exclusive (исключительный) замок, когда вам требуется временная блокировка других процессов и от записи, и от чтения вашего файла. Один и тот же файл может иметь общий замок для многих процессов, но только один процесс может иметь исключительный замок, и это может быть только в том случае, когда ни один другой процесс не имеет никакого замка для этого файла. Библиотечный файл file.e содержит следующее объявление: |
global constant LOCK_SHARED = 1, LOCK_EXCLUSIVE = 2 | |
Под DOS32 и WIN32 вы можете запирать часть файла, используя
параметр s. Переменная s должна быть рядом, имеющим форму:
{первый_байт, последний_байт}. Ряд обозначает первый и последний байты
участка в файле, к которому применен замок. Задавайте пустой ряд {},
если вы хотите запереть весь файл. В данном выпуске для Linux пока может
быть заперт только весь файл, поэтому в качестве параметра s вы должны
задавать {}.
Если функция выполнена успешно, lock_file() выдает 1. Если запирание не удалось, выдается 0. lock_file() не ожидает, пока другие процессы снимут свои замки. Вам могут понадобиться повторные вызовы данной функции, прежде чем запрос замка будет удовлетворен. | |
Комментарии: | Под Linux эти замки называются "консультативными", податливыми, замками, это означает, что они осуществляются не операционной системой. Они указывают, как процессы могут использовать отдельные особые файлы во взаимодействии со всеми другими. Процесс может получить доступ к файлу без предварительного его запирания для других процессов. Под 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 |
Платформа: | DOS32 |
Синтаксис: | include machine.e lock_memory(a, i) |
Описание: | Предохраняет блок виртуальной памяти, начинающийся по адресу a, имеющий длину i, от перекачки на диск. |
Комментарии: | Используйте данную процедуру, чтобы быть уверенным, что весь код и данные, необходимые для обработки прерываний, хранятся в памяти во все время прогона вашей программы. |
Пример программы: | demo\dos32\hardint.ex |
См. также: | get_vector, set_vector |
Синтаксис: | x2 = log(x1) |
Описание: | Выдает натуральный логарифм x1. |
Комментарии: | Эта функция может быть применена к атому или ко всем элементам ряда. Заметьте, что логарифм определен только для положительных чисел. Ваша программа будет прервана с сообщением об ошибке, если вы попытаетесь взять логарифм отрицательного числа или нуля. |
Пример: | |
a = log(100) -- a равно 4.60517 | |
См. также: | sin, cos, tan, sqrt |
Синтаксис: | include wildcard.e x2 = lower(x1) |
Описание: | Преобразует атом или ряд к нижнему регистру. |
Пример: | |
s = lower("Euphoria") -- s равно "euphoria" a = lower('B') -- a равно 'b' s = lower({"Euphoria", "Programming"}) -- s равно {"euphoria", "programming"} | |
См. также: | upper |
Синтаксис: | x1 = machine_func(a, x) |
Описание: | См. machine_proc() ниже |
Синтаксис: | machine_proc(a, x) |
Описание: | Выполняет специфические машинные операции, такие как графика или звуковые эффекты. Эти процедуры обычно вызываются косвенно через одну из соответствующих библиотечных процедур, имеющихся во включаемых файлах пакета Euphoria. Прямой вызов может повлечь за собой зависание машины или другие тяжелые последствия, если выполнен некорректно. |
См. также: | machine_func |
Синтаксис: | i = match(s1, s2) |
Описание: | Пытается найти совпадение s1 и последовательных отрезков s2. Если удачно, выдает номер элемента s2, которым начинается (первый) совпадающий отрезок, иначе выдает 0. |
Пример: | |
location = match("pho", "Euphoria") -- location будет равно 3 | |
См. также: | find, compare, wildcard_match |
Синтаксис: | 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(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 |
Платформа: | WIN32 |
Синтаксис: | include msgbox.e i = message_box(s1, s2, x) |
Описание: | Выводит окно с заголовком s2, содержащее строку сообщения s1. x определяет комбинацию кнопок, которые будут доступны для нажатия пользователем, и некоторые другие характеристики. x может быть атомом или рядом. Если функция выдает 0, это говорит об ошибке при попытке установить окно. |
Комментарии: | Просмотрите msgbox.e, где имеется полный перечень возможных величин для x и i. |
Пример: | |
response = message_box("Do you wish to proceed?", "My Application", MB_YESNOCANCEL) if response = IDCANCEL or response = IDNO then abort(1) end if | |
Пример программы: | demo\win32\email.exw |
Платформа: | DOS32, Linux |
Синтаксис: | include mouse.e mouse_events(i) |
Описание: | Используйте эту процедуру, чтобы выбрать мышиные события, которые вам необходимо отслеживать с помощью get_mouse(). По умолчанию get_mouse() будет выдавать данные обо всех событиях. mouse_events() может быть вызвана на различных этапах прогона вашей программы по мере необходимости изменения перечня событий. Под Linux mouse_events() пока не функционирует. |
Комментарии: | Хорошей практикой является игнорирование тех событий, которые вас
не интересуют, кроме обычно очень частого события MOVE, чтобы снизить
вероятность пропуска события, имеющего большое значение в вашей
программе.
Первый вызов mouse_events(), который вы сделаете, включит курсор мыши или подсвеченный символ. |
Пример: | |
mouse_events(LEFT_DOWN + LEFT_UP + RIGHT_DOWN) -- ограничит данные get_mouse() информацией о нажатии -- и отпускании левой кнопки и о нажатии правой кнопки. -- Все остальные события будут игнорироваться. | |
См. также: | get_mouse, mouse_pointer |
Платформа: | DOS32, Linux |
Синтаксис: | include mouse.e mouse_pointer(i) |
Описание: | Если i равно 0, выключает курсор мыши, в противном случае включает его. Множественные выключения курсора требуют такого же числа включений. Первый вызов get_mouse() или mouse_events() также включит курсор (один раз). Под Linux mouse_pointer() пока не функционирует. |
Комментарии: | Временное выключение курсора мыши может быть необходимым, если на
экран выводится новая информация.
После вызова text_rows() вам может понадобиться вызов mouse_pointer(1), чтобы курсор мыши стал снова видимым. |
См. также: | get_mouse, mouse_events |
Синтаксис: | 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 |
Синтаксис: | i = object(x) |
Описание: | Проверяет, является ли x объектом. Это всегда будет истиной, так что object() всегда выдает 1. |
Комментарии: | Все предопределенные и пользовательские типы могут также быть использованы для проверки, принадлежит ли величина данному типу. object() включена только для комплектности. Она всегда выдает 1. |
Пример: | |
? object({1,2,3}) -- всегда печатает 1 | |
См. также: | integer, atom, sequence |
Синтаксис: | fn = open(st1, st2) |
Описание: | Открывает файл или устройство, выдает номер файла. -1 выдается,
если открытие не состоялось. st1 содержит путь к файлу или устройству.
st2 задает режим, в котором файл должен быть открыт.
Возможны следующие режимы:
"r" - открыть текстовый файл для чтения Файлы, открываемые для чтения или обновления, должны уже существовать. Файлы, открытые для записи или добавления, будут созданы, если необходимо. Файл, открытый для записи будет установлен на 0 байт. Вывод в файл, открытый для добавления, начнется в конце существующего файла. Вывод в текстовые файлы будет иметь символы возврата каретки, автоматически добавляемые перед символами перевода строки. На входе эти символы возврата каретки удаляются. Символ control-Z (ASCII 26) является сигналом немедленного конца файла. Ввод/Вывод в двоичные файлы не претерпевает никаких изменений. Любая величина байта от 0 до 255 может быть считана или записана. Некоторые типовые устройства, которые вы можете открыть:
"CON" - консоль (экран) |
Комментарии: | DOS32:
При прогоне программы под Windows 95 или более новой ОС
вы можете открыть любой существующий файл, который имеет
длинное свое имя (т.е. длиннее, чем стандартный формат 8.3 DOS)
или длинные имена каталогов в его пути, используя любой режим
(чтение, запись и т.д.).
Тем не менее, если вы попытаетесь создать новый файл
с длинным именем,
(открыть в режиме "w" или "a" файл, который еще не существует),
тогда это имя будет усечено до необходимого формата 8.3.
Мы надеемся добавить возможность создания новых файлов
с длинными именами в будущей версии Euphoria.
WIN32, Linux: Длинные имена файлов полностью обеспечиваются при чтении, записи и создании. |
Пример: | |
integer file_num, file_num95 sequence first_line constant ERROR = 2 file_num = open("myfile", "r") if file_num = -1 then puts(ERROR, "couldn't open myfile\n") else first_line = gets(file_num) end if file_num = open("PRN", "w") -- открывает принтер для вывода -- под Windows 95: file_num95 = open("bigdirectoryname\\verylongfilename.abcdefg", "r") if file_num95 != -1 then puts(1, "it worked!\n") end if | |
См. также: | close |
Платформа: | WIN32, Linux |
Синтаксис: | include dll.e a = open_dll(st) |
Описание: | Открывает файл библиотеки динамического связывания Windows(.dll) или файл общей библиотеки Linux (.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 |
Синтаксис: | 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 |