Пример 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, чтобы снизить вероятность пропуска события, имеющего большое значение в вашей программе.