Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 14: Line 14:
 - `dofile`和`loadfile` 被重新实现为从已挂载的文件系统组件(使用[[api:​filesystem:​zh|文件系统 API]]或重新实现过的 `io` 库)内加载文件。 - `dofile`和`loadfile` 被重新实现为从已挂载的文件系统组件(使用[[api:​filesystem:​zh|文件系统 API]]或重新实现过的 `io` 库)内加载文件。
 - `load`在默认情况下只能用来加载文本,不支持二进制或编译过的代码。注意,配置文件中可以启用字节码的加载,但非常不推荐这样做,因为这是一个**重大安全风险**。 - `load`在默认情况下只能用来加载文本,不支持二进制或编译过的代码。注意,配置文件中可以启用字节码的加载,但非常不推荐这样做,因为这是一个**重大安全风险**。
-- `print`、`io.write`、`io.stdout:​write`和`term.write`都向stdout(标准输出)推送字符串,这在大多数情况下都指gpu渲染,即打印到屏幕上。+- `print`、`io.write`、`io.stdout:​write`和`term.write`都向stdout(标准输出)推送字符串,这在大多数情况下都指gpu渲染,即输出到屏幕上。
  
 协程操作 协程操作
 ---------------------- ----------------------
-`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)均可用,没有任何变化。
  
 输入输出功能 输入输出功能