This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
api:non-standard-lua-libs:zh [2023/11/28 10:07] hfsr [基本函数] |
api:non-standard-lua-libs:zh [2023/11/28 10:18] hfsr [位操作] |
||
---|---|---|---|
Line 18: | Line 18: | ||
协程操作 | 协程操作 | ||
---------------------- | ---------------------- | ||
- | `coroutine` 库内的[原函数](http://www.lua.org/manual/5.3/manual.html#6.2)均可用,并没有可见的差异。 | + | `coroutine`库内的[原函数](http://www.lua.org/manual/5.3/manual.html#6.2)均可用,并没有可见的差异。 |
- | 注意,暴露给用户使用的 `coroutine.resume` 和 `coroutine.yield` 实现是封装过的,它们负责中止在一定时间后还没有 yield 的代码(见配置),还可以区分系统产生的 yield 和用户产生的 yield(系统会产生“bubble”,例如在关闭命令行或调用组件 API 时)。然而这不应该从用户代码层面被注意到。如果被注意到了,那这应该被认为是一个 bug。 | + | 注意,暴露给用户使用的`coroutine.resume`和`coroutine.yield`实现是封装过的,它们负责中止在一定时间(见配置文件)后还没有yield的代码,还可以区分系统产生的yield和用户产生的yield(系统会产生“bubble”,例如在关闭命令行或调用组件 API 时)。然而这不应该从用户代码层面被注意到。如果被注意到了,应该被认为是bug。 |
模块 | 模块 | ||
------- | ------- | ||
- | 模块部分已针对 OpenComputer 重新实现。效果应该跟[原本的](http://www.lua.org/manual/5.3/manual.html#6.3)相同,但它没有以下函数: | + | 模块部分已针对OpenComputer重新实现。效果应该跟[原本的](http://www.lua.org/manual/5.3/manual.html#6.3)相同,但它没有以下函数: |
- | - `package.config` 不存在且未使用。 | + | - `package.config`不存在且未使用。 |
- | - `package.cpath` 不存在且未使用。 | + | - `package.cpath`不存在且未使用。 |
- | - `package.loadlib` 未实现。 | + | - `package.loadlib`未实现。 |
- | 后两者不存在是因为OpenComputer不能加载C语言程序。 | + | 后两者不存在是因为OpenComputer不能加载C语言代码。 |
- | `require` 是一个在全局范围内可用的方法,也就是说,你不需要加载任何模块就能访问它,你可以在脚本的第一行就使用它(这是很常见的用法)。它的工作依赖于 `package` 库,因此我们就在这里对它进行介绍。 | + | `require`是在全局范围内可用的方法,也就是说,你不需要加载任何模块就能访问它,你可以在脚本的第一行就使用它(这是很常见的用法)。它的工作依赖于`package`库,因此我们就在这里对它进行介绍。 |
- | + | ||
- | * ''require(library: string): table'' | + | |
- | + | ||
- | 返回给定名称对应的 `library`。首先,如果该库先前已被加载过,那么 `package` 库已经缓存过它了,`require` 会返回该库的缓存版本。如果想要卸载库,参见 `package.loaded`。如果库没有被缓存,就会搜索 `package.path` 直到找到匹配的库。 | + | |
- | + | ||
- | * ''package.path'' | + | |
- | **我们建议用户不要修改默认的 package.path,相反地,用户应该把自定义库放入 /usr/lib/ 中。** | + | |
- | + | ||
- | 定义了一个供 `require` 遍历寻找库的搜索路径列表。它是一个用分号分隔的路径列表,使用 ‘?’ 作为传递给 `require` 库名的占位符。下面的例子会使它更容易理解 | + | |
- | + | ||
- | 默认 package.path: | + | |
- | + | ||
- | `/lib/?.lua;/usr/lib/?.lua;/home/lib/?.lua;./?.lua;/lib/?/init.lua;/usr/lib/?/init.lua;/home/lib/?/init.lua;./?/init.lua` | + | |
- | + | ||
- | 如果用户尝试导入 "foobar" | + | |
- | + | ||
- | `local foobar = require("foobar")` | + | |
- | + | ||
- | 以下是 `require` 为了执行 require("foobar") 而会去查找的文件的顺序。我们假设当前工作目录是 /tmp/,因为这样很 Cool! | + | |
+ | * ''require(library: string): table'' | ||
+ | 返回给定名称对应的`library`。首先,如果该库先前已被加载过,那么`package`库已经缓存它了,`require`会返回该库的缓存版本。如果想要卸载已预缓存的库,参见`package.loaded`。如果库没有被缓存,就会搜索`package.path`直到找到匹配的库。 | ||
+ | \\ | ||
+ | * ''package.path'' | ||
+ | **我们建议用户不要修改默认的`package.path`,相反地,用户应该把自定义库放入`/usr/lib/`中。** | ||
+ | 定义了一个供 `require` 遍历寻找库的搜索路径列表。它是一个用分号分隔的路径列表,使用`?`作为传递给`require`库名的占位符。下面的例子会使它更容易理解。 | ||
+ | \\ | ||
+ | 默认 package.path: | ||
+ | `/lib/?.lua;/usr/lib/?.lua;/home/lib/?.lua;./?.lua;/lib/?/init.lua;/usr/lib/?/init.lua;/home/lib/?/init.lua;./?/init.lua` | ||
+ | \\ | ||
+ | 如果用户尝试导入"foobar" | ||
+ | `local foobar = require("foobar")` | ||
+ | \\ | ||
+ | 以下是`require`为了执行require("foobar") 而会去查找的文件的顺序。为了有趣,我们假设当前工作目录是 /tmp/。 | ||
- /lib/foobar.lua | - /lib/foobar.lua | ||
- /usr/lib/foobar.lua | - /usr/lib/foobar.lua | ||
Line 61: | Line 56: | ||
- /home/lib/foobar/init.lua | - /home/lib/foobar/init.lua | ||
- /tmp/foobar/init.lua | - /tmp/foobar/init.lua | ||
- | + | \\ | |
- | * ''package.loaded'' | + | * ''package.loaded'' |
- | **修改 package.loaded 的行为并非标准操作** | + | **修改package.loaded的行为并非标准操作** |
- | + | 一个包含已缓存库源码的表,键为库的名称(即传入 `require` 的那个),值是缓存的库本身。将该表中的某个值设为`nil`的效果为从缓存中删除这个库。为了操作系统的正常运行,有些库会假定保持加载状态。 | |
- | 一个包含已被缓存的库的table,键为库的名称 (即传入 `require` 的那个),值是缓存的库本身。将该表中的某个值设为 `nil` 会从缓存中实实在在地删除这个库。有些库会假定保持加载状态,为了操作系统的正常运行。 | + | |
字符串操作 | 字符串操作 | ||
------------------- | ------------------- | ||
- | `string` 库内的[原函数](http://www.lua.org/manual/5.2/manual.html#6.4)均可用,没有任何变化。 | + | `string`库内的[原函数](http://www.lua.org/manual/5.2/manual.html#6.4)均可用,没有任何变化。 |
- | 注意,GPU API 中的函数可以接收 UTF-8 字符串,进而 `term.write` 和 `print` 也可以。为了帮助你处理 UTF-8 字符串,我们准备了一个额外的库,即 [[api:unicode:zh|Unicode API]]。 | + | 注意,GPU API中的函数工作于UTF-8字符串环境下,进而`term.write`和`print`也一样。为了帮助你处理UTF-8字符串,我们准备了一个额外的库,即[[api:unicode:zh|Unicode API]]。 |
表操作 | 表操作 | ||
------------------ | ------------------ | ||
- | `table` 库内的[原函数](http://www.lua.org/manual/5.2/manual.html#6.5)均可用,没有任何变化。 | + | `table`库内的[原函数](http://www.lua.org/manual/5.2/manual.html#6.5)均可用,没有任何变化。 |
数学函数 | 数学函数 | ||
Line 87: | Line 81: | ||
位操作 | 位操作 | ||
------------------ | ------------------ | ||
- | `bit32` 库内的[原函数](http://www.lua.org/manual/5.2/manual.html#6.7)均可用,没有任何变化。 | + | `bit32`库内的[原函数](http://www.lua.org/manual/5.2/manual.html#6.7)均可用,没有任何变化。 |
输入输出功能 | 输入输出功能 |