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:14]
hfsr [模块]
api:non-standard-lua-libs:zh [2023/11/28 10:32]
hfsr [输入输出功能]
Line 35: Line 35:
  
   * ''​require(library:​ string): table''  ​   * ''​require(library:​ string): table''  ​
-  返回给定名称对应的`library`。首先,如果该库先前已被加载过,那么`package`库已经缓存它了,`require`会返回该库的缓存版本。如果想要卸载已预缓存的库,参见`package.loaded`。如果库没有被缓存,就会搜索`package.path`直到找到匹配的库。 +  返回给定名称对应的`library`。首先,如果该库先前已被加载过,那么`package`库已经缓存它了,`require`会返回该库的缓存版本。如果想要卸载已预缓存的库,参见`package.loaded`。如果库没有被缓存,就会搜索`package.path`直到找到匹配的库。 ​  
 +\\
   * ''​package.path''  ​   * ''​package.path''  ​
-**我们建议用户不要修改默认的`package.path`,相反地,用户应该把自定义库放入`/​usr/​lib/​`中。** +**我们建议用户不要修改默认的`package.path`,相反地,用户应该把自定义库放入`/​usr/​lib/​`中。** ​  
- +  定义了一个供 `require` 遍历寻找库的搜索路径列表。它是一个用分号分隔的路径列表,使用`?​`作为传递给`require`库名的占位符。下面的例子会使它更容易理解。  ​ 
-  定义了一个供 `require` 遍历寻找库的搜索路径列表。它是一个用分号分隔的路径列表,使用`?​`作为传递给`require`库名的占位符。下面的例子会使它更容易理解 +\\ 
- +  默认 package.path:  ​ 
-  默认 package.path: +`/​lib/?​.lua;/​usr/​lib/?​.lua;/​home/​lib/?​.lua;​./?​.lua;/​lib/?/​init.lua;/​usr/​lib/?/​init.lua;/​home/​lib/?/​init.lua;​./?/​init.lua` ​  
- +\\ 
-  ​`/​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"​)` ​  
-  如果用户尝试导入"​foobar"​ +\\ 
- +  以下是`require`为了执行require("​foobar"​) 而会去查找的文件的顺序。为了有趣,我们假设当前工作目录是 /​tmp/​。 ​ 
-  `local foobar = require("​foobar"​)` +
- +
-  以下是`require`为了执行require("​foobar"​) 而会去查找的文件的顺序。出于有趣,我们假设当前工作目录是 /tmp/。 +
     - /​lib/​foobar.lua     - /​lib/​foobar.lua
     - /​usr/​lib/​foobar.lua     - /​usr/​lib/​foobar.lua
Line 60: 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`的效果为从缓存中删除这个库。为了操作系统的正常运行,有些库会假定保持加载状态。   一个包含已缓存库源码的表,键为库的名称(即传入 `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 86: 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)均可用,没有任何变化。
  
 输入输出功能 输入输出功能
 --------------------------- ---------------------------
-`io` 库中大部分[原函数](http://​www.lua.org/​manual/​5.2/​manual.html#​6.8)都被重新实现了,它们工作在已挂载的文件系统组件上。标准输入通过 `io.read` (同 `term.read` 和 `io.stdin:​read`)读取。 标准输出通过 `io.write` (同 `term.write`、`io.stdout:​write` 和 `print`)写入。标准错误通过 `io.stderr:​write` 写入。+`io`库中[原函数](http://​www.lua.org/​manual/​5.2/​manual.html#​6.8)都被很大程度上重新实现了,它们工作在已挂载的文件系统组件上。标准输入通过`io.read`(以及`term.read`和`io.stdin:​read`)读取。 标准输出通过`io.write`(以及`term.write`、`io.stdout:​write`和`print`)写入。标准错误通过`io.stderr:​write`写入。
  
-大多数情况下,它们应该与标准 Lua 实现在*功能上*等价。也许它们返回的错误信息与原版Lua 不同,但大多数情况下原版Lua使用的也是平台相关的 C 异常库,因此将这些用于程序逻辑无论如何都不是一个好主意。+大多数情况下,它们应该与标准Lua实现在**功能上**等价。也许它们返回的错误信息与原版Lua 不同,但大多数情况下原版Lua使用的也是基于平台的C异常库,因此将这些用于程序逻辑无论如何都不是一个好主意。
  
-- `io.open(path,​ mode)` **支持 `+` 模式,即只支持 `r`、`w`、`a` 和 `rb` (允许使用`wb` 和 `ab` 模式,但是二进制模式对写入来说没有意义)。 注意, `io.open()` 返回 [[api:​buffer:​zh#​实例方法|带缓冲IO流]],有比较智能的 ​api,如 `read("​*a"​)` 可以读取整个文件,或者 `io.read("​*l"​)` 可以读取一行。注意,带缓冲IO流(由 `io.open`返回的)可以是二进制模式或文本模式,而原始流(由 `filesystem.open`返回的)是且只能是二进制模式。 流是二进制模式还是文本模式只会影响到 `read`。+- `io.open(path,​ mode)`**支持**`+`模式,即只支持`r`、`w`、`a`和`rb`(允许使用`wb` 和 `ab` 模式,但是二进制模式对写入来说没有意义)。 ​  
 +注意,`io.open()`返回[[api:​buffer:​zh#​实例方法|带缓冲IO流]],有比较智能的API,如`read("​*a"​)` 可以读取整个文件,或者`io.read("​*l"​)`可以读取一行。 ​  
 +还需注意,带缓冲IO流(由 `io.open`返回的)可以是二进制模式或文本模式,而原始流(由 `filesystem.open`返回的)是且只能是二进制模式。 流是二进制模式还是文本模式只会影响到 `read`。
  
   `path` 是你想打开的文件的相对路径或绝对路径。   `path` 是你想打开的文件的相对路径或绝对路径。
Line 100: Line 97:
   `mode` 可以是 `nil` 或一个字符串, `nil` 默认为“r”。   `mode` 可以是 `nil` 或一个字符串, `nil` 默认为“r”。
  
-  - **二进制模式** +  - **二进制模式** ​  
- +  `io.open(path,​ "​rb"​)`或`filesystem.open(path)`返回的流是二进制格式。`filesystem.open(path,​ "​rb"​)`的写法也可以,但从`filesystem.open`返回的流**永远**都是二进制模式。 ​  
-  `io.open(path,​ "​rb"​)` 或 `filesystem.open(path)` 返回的流是二进制格式。 `filesystem.open(path,​ "​rb"​)` 也可以,但从 `filesystem.open` 返回的流**永远**都是二进制模式。 `stream:​read(1)` ​在二进制模式下读取一个字节。通过 `buffered_stream:​read("​*n"​)` 读取一个数值会数据读成单字节字符。(缓冲流从 `io.open` 返回,并支持从流中解释数值) +  二进制模式下的`stream:​read(1)`读取一个字节。 ​  
- +  ​通过`buffered_stream:​read("​*n"​)`读取一个数值会数据单字节字符的形式读取。(缓冲流从 `io.open` 返回,并支持从流中解释数值) ​  
-  - **文本模式** +\\ 
- +  - **文本模式** ​  
-  只有从 `io.open` 返回的,模式中没有使用 "​b"​ 的流才是文本模式。例如 `io.open(path)` 和 `io.open(path,​ "​r"​)`。`filesystem.open` 返回的任何句柄都不是文本模式下的流。文本模式下的 `stream:​read(1)` ​是考虑Unicode的单个字符。它可能是单字节的,或者甚至有3个字节——这取决于文本。 通过 `buffered_stream:​read("​*n"​)` ​一个数值读取成 ​unicode 字符。(带缓冲IO流是由 `io,open` 返回的,支持从流中解释数值) +  只有从`io.open`返回的,模式中没有使用"​b"​的流才是文本模式。例如`io.open(path)`和`io.open(path,​ "​r"​)`。`filesystem.open`返回的任何句柄都不是文本模式下的流。 ​  
-  * `io.open(path,​ "​r"​)` 相当于 `io.open(path)`,它以文本只读模式打开一个文件。 +  ​文本模式下的`stream:​read(1)`读取单个Unicode字符。它可能是单字节的,或者甚至有3个字节取决于文本。 ​  
-  * `io.open(path,​ "​rb"​)` 以二进制只读模式打开一个文件。 +  ​通过`buffered_stream:​read("​*n"​)`读取一个数会将数据以unicode字符的形式进行读取。(带缓冲IO流是由 `io,open` 返回的,支持从流中解释数值) ​  
-  * `io.open(path,​ "​w"​)` 删除文件的所有内容,以写模式打开文件。流是二进制模式还是文本模式并不影响写入。因此“w”在功能上等价于“wb”。 + \\ 
-  * `io.open(path,​ "​a"​)` 以写模式打开一个文件并将文件句柄位置放在文件的末尾,这意味着下一次写入会追加到文件末尾。 +  * `io.open(path,​ "​r"​)` 相当于 `io.open(path)`,它以文本只读模式打开一个文件。 ​  
-- `io.stdin` 从模拟的 stdin 中读取数据,它默认为 OpenOS shell 中的用户输入。注意 `io.read()` 是 `io.stdin:​read()` 的简,它们会被解析为完全相同的操作。+\\ 
 +  * `io.open(path,​ "​rb"​)` 以二进制只读模式打开一个文件。 ​  
 +\\ 
 +  * `io.open(path,​ "​w"​)` 删除文件的所有内容,以写模式打开文件。流是二进制模式还是文本模式并不影响写入。因此“w”在功能上等价于“wb”。 ​  
 +\\ 
 +  * `io.open(path,​ "​a"​)` 以写模式打开一个文件并将文件句柄位置放在文件的末尾,这意味着下一次写入会追加到文件末尾。 ​  
 +\\ 
 +- `io.stdin`从模拟的stdin中读取数据,它默认为OpenOS shell中的用户输入。注意`io.read()`是`io.stdin:​read()`的简,它们会被解析为完全相同的操作。
  
 ```lua ```lua
-io.stdin:​read() -- 从 std in 中读取 +io.stdin:​read() -- 从stdin中读取 
-io.read() -- 也是从 ​std in 中读取 +io.read() -- 也是从stdin中读取 
-term.read() -- 也是从 ​std in 中读取+term.read() -- 也是从stdin中读取
 ``` ```
  
-- `io.stdout` 将数据写到模拟的 stdout,默认在 ​gpu 上渲染。注意 `io.write()` 是 `io.stdout:​write()` 的简称,它们会被解析为完全相同的操作。+- `io.stdout`将数据写到模拟的stdout,默认GPU上渲染。注意`io.write()`是`io.stdout:​write()`的简称,它们会被解析为完全相同的操作。
  
 ```lua ```lua
-io.stdout:​write("​写入 stdout"​) +io.stdout:​write("​写入stdout"​) 
-io.write("​也是写入 stdout"​) +io.write("​也是写入stdout"​) 
-term.write("​也是写入 stdout,但如果字符串超过屏幕分辨率允许的宽度,就会自动换行,就像这样--------------------------------------------------------------------------------------------------------------------------------#​")+term.write("​也是写入stdout,但如果字符串超过屏幕分辨率允许的宽度,就会自动换行"​)
 ``` ```
  
-- `io.stderr` 将数据写到模拟的 stderr,默认在 ​gpu 上渲染,但如果主 GPU 和屏幕支持的话,会尝试用红色渲染。没有像 stdin 和 stdout 那样的使用 stderr 的快捷方式。+- `io.stderr`将数据写到模拟的stderr,默认在GPU上渲染,但如果首选GPU和屏幕支持的话,会尝试用红色渲染。没有像stdin和stdout那样的使用stderr的快捷方式。
  
 ```lua ```lua
-io.stderr:​write("​向 stderr 写入错误信息"​)+io.stderr:​write("​向stderr写入错误信息"​)
 ``` ```