OpenComputers/Стандартные библиотеки Lua

В OpenComputers доступны многие функции стандартных библиотек Lua. Однако некоторые из них могут быть ограничены, или переопределены.

Подробнее о стандартных библиотеках Lua вы можете узнать в официальной документации здесь.



## Различия

### Базовые функции

Функции базовой библиотеки Lua:

`collectgarbage`

— Не доступна.

`dofile`

и`loadfile`

— Переопределены для загрузки из файловой системы OpenComputers (см. Filesystem API).

`load`

— Может использоваться только для загрузки текста. Загрузка байткода может быть разрешена в настройках мода, однако не рекомендуется, так как представляет собой*большую угрозу безопасности*.

`print`

— Переопределена для вывода на консоль (см. Term API)



### Сопрограммы (Coroutine)

Набор функций по управлению сопрограммами `coroutine`

доступен в моде без особенных изменений.


*Примечание*: функции `coroutine.resume`

и `coroutine.yield`

переопределены в моде с учетом того, что программа прерывает свое выполнение, если она не отвечает долгое время (точное значение смотрите в настройках мода).



### Модули

Функции работы с модулями `package`

переопределены в моде OpenComputer. Однако должны работать аналогично, за исключением следующих функций:

`package.config`

— не используется

`package.cpath`

— не используется

`package.loadlib`

— не переопределена

Последние две не используются в связи с тем, что невозможна загрузка кода C из OpenComputers.



### Операции со строками

Оригинальная библиотека для работы со строками `string`

доступна без изменений.

*Примечание*: функции GPU API (а также `term.write`

и `print`

) полностью совместимы со строками в формате UTF-8. Кроме того, для облегчения работы с форматом Unicode, OpenComputers предоставляет библиотеку Unicode API.



### Операции с таблицами

Оригинальная библиотека для работы с таблицами `table`

доступна без изменений.



### Математические функции

Оригинальная библиотека математических функций `math`

доступна с незначительными изменениями:

`math.random`

использует отдельный экземпляр класса`java.util.Random`

для каждого потока Lua.

`math.randomseed`

применяется к своему экземпляру`java.util.Random`

соответственно.



### Битовые операции

Оригинальная библиотека битовых операций `bit32`

доступна без изменений.



### Операции ввода/вывода

Функции библиотеки `io`

переопределены для работы с консолью и файловой системой OpenComputers.

Для стандартного ввода/вывода используются функции `term.read`

/ `term.write`

.

Функции по большей части *функционально* эквивалентны оригинальным. Они могут возвращать отличающиеся сообщения ошибки.

`io.popen`

— не доступна.

`io.open`

— не поддерживает режим`+`

. Поддерживаемые режимы:`r`

,`w`

,`a`

,`rb`

,`wb`

и`ab`

. Побитовый режим чтения файлов поддерживает загрузку строк в формате UTF-8.

`io.stdin`

— читает данные с помощью`term.read`

.

`io.stdout`

— пишет используя`term.write`

.

`io.stderr`

— также пишет используя`term.write`

, однако делает это красным цветом (если цвета поддерживаются монитором/видеокартой компьютера).

`io.read`

— поддерживает режим`"n"`

для ввода данных типа*number*вместо*string*. Для этого`"n"`

должен передаваться в функцию io.read как аргумент.



### Функции операционной системы

Функции библиотеки `os`

частично переопределены.

`os.clock`

— возвращает приблизительное время работы CPU. Это не то же самое, что время работы компьютера (см. функцию`computer.uptime`

из Computer API).

`os.date`

— использует внутриигровую дату. Поддерживает различные форматы.

`os.execute`

— переопределена для запуска программ с помощью`shell.execute`

. См. Shell API

`os.exit`

— создает событие ошибки, для того чтобы закрыть текущую сопрограмму.

`os.setenv`

— добавляет переменные окружения шелла.

`os.remove`

— алиас к`filesystem.remove`

.

`os.rename`

— алиас к`filesystem.rename`

.

`os.setlocale`

— не доступна.

`os.time`

— переопределена, выводит внутриигровое время, начиная с создания мира. Учтите, что время указывается во внутриигровых "секундах". Чтобы получить число тактов домножте это значение на`1000/60/60`

(в одном дне 24000 тактов) и вычтите 6000. Это число (6000) взято не случайным образом. Новая игра в Minecraft начинается в "полдень", который и считается точкой отсчета времени (ноль).

`os.tmpname`

переопределена для генерации нового (неиспользуемого) имени в каталоге`/tmp`

.


Кроме того добавлена одна новая функция:

`os.sleep(seconds: number)`

— приостанавливает скрипт на указанный промежуток времени. При этом сигналы (и события) по прежнему обрабатываются, когда компьютер приостановлен. События "копятся" в очереди событий и будут обработаны, когда компьютер возобновит работу.

См. также функции Computer API.



### Отладка

Доступна только функция `debug.traceback`

.