From d63779ec0a6f00854f53b48b0f6a67707879b6d1 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Thu, 12 Feb 2026 10:29:07 +0800 Subject: Updated docs. --- doc/docs/zh/doc/advanced/do.md | 22 ++- doc/docs/zh/doc/advanced/module.md | 253 ----------------------------- doc/docs/zh/doc/control-flow/for-loop.md | 16 +- doc/docs/zh/doc/control-flow/while-loop.md | 42 ++++- doc/docs/zh/doc/language-basics/module.md | 253 +++++++++++++++++++++++++++++ doc/docs/zh/doc/objects/with-statement.md | 44 +++++ 6 files changed, 374 insertions(+), 256 deletions(-) delete mode 100644 doc/docs/zh/doc/advanced/module.md create mode 100644 doc/docs/zh/doc/language-basics/module.md (limited to 'doc/docs/zh') diff --git a/doc/docs/zh/doc/advanced/do.md b/doc/docs/zh/doc/advanced/do.md index a2d5d19..b3f61af 100644 --- a/doc/docs/zh/doc/advanced/do.md +++ b/doc/docs/zh/doc/advanced/do.md @@ -20,7 +20,27 @@ print var -- 这里是nil -  月之脚本的 **do** 也可以用作表达式。允许你将多行代码的处理合并为一个表达式,并将 do 语句代码块的最后一个语句作为表达式返回的结果。 +  月之脚本的 **do** 也可以用作表达式。允许你将多行代码的处理合并为一个表达式,并将 do 语句代码块的最后一个语句作为表达式返回的结果。`do` 表达式支持通过 `break` 打断执行流并提前返回多个值。 + +```yuescript +status, value = do + n = 12 + if n > 10 + break "large", n + break "small", n +``` + + + +```yue +status, value = do + n = 12 + if n > 10 + break "large", n + break "small", n +``` + + ```yuescript counter = do diff --git a/doc/docs/zh/doc/advanced/module.md b/doc/docs/zh/doc/advanced/module.md deleted file mode 100644 index 6c90f0e..0000000 --- a/doc/docs/zh/doc/advanced/module.md +++ /dev/null @@ -1,253 +0,0 @@ -# 模块 - -## 导入 - -  导入语句是一个语法糖,用于需要引入一个模块或者从已导入的模块中提取子项目。从模块导入的变量默认为不可修改的常量。 - -```yuescript --- 用作表解构 -do - import insert, concat from table - -- 当给 insert, concat 变量赋值时,编译器会报告错误 - import C, Ct, Cmt from require "lpeg" - -- 快捷写法引入模块的子项 - import x, y, z from 'mymodule' - -- 使用Python风格的导入 - from 'module' import a, b, c - --- 快捷地导入一个模块 -do - import 'module' - import 'module_x' - import "d-a-s-h-e-s" - import "module.part" - --- 导入模块后起一个别名使用,或是进行导入模块表的解构 -do - import "player" as PlayerModule - import "lpeg" as :C, :Ct, :Cmt - import "export" as {one, two, Something:{umm:{ch}}} -``` - - - -```yue --- 用作表解构 -do - import insert, concat from table - -- 当给 insert, concat 变量赋值时,编译器会报告错误 - import C, Ct, Cmt from require "lpeg" - -- 快捷写法引入模块的子项 - import x, y, z from 'mymodule' - -- 使用Python风格的导入 - from 'module' import a, b, c - --- 快捷地导入一个模块 -do - import 'module' - import 'module_x' - import "d-a-s-h-e-s" - import "module.part" - --- 导入模块后起一个别名使用,或是进行导入模块表的解构 -do - import "player" as PlayerModule - import "lpeg" as :C, :Ct, :Cmt - import "export" as {one, two, Something:{umm:{ch}}} -``` - - - -## 导入全局变量 - -  你可以使用 `import` 将指定的全局变量导入到本地变量中。当导入一系列对全局变量的链式访问时,最后一个访问的字段将被赋值给本地变量。 - -```yuescript -do - import tostring - import table.concat - print concat ["a", tostring 1] -``` - - - -```yue -do - import tostring - import table.concat - print concat ["a", tostring 1] -``` - - - -### 自动全局变量导入 - -  在一个代码块的顶部写 `import global`,会将当前作用域中尚未显式声明或赋值过的变量名,自动导入为本地常量,并在该语句的位置绑定到同名的全局变量。 - -  但是在同一作用域中被显式声明为全局的变量不会被自动导入,因此可以继续进行赋值操作。 - -```yuescript -do - import global - print "hello" - math.random 3 - -- print = nil -- 报错:自动导入的全局变量为常量 - -do - -- 被显式声明为全局的变量不会被自动导入 - import global - global FLAG - print FLAG - FLAG = 123 -``` - - - -```yue -do - import global - print "hello" - math.random 3 - -- print = nil -- 报错:自动导入的全局变量是常量 - -do - -- 被显式声明为全局的变量不会被自动导入 - import global - global FLAG - print FLAG - FLAG = 123 -``` - - - -## 导出 - -  导出语句提供了一种简洁的方式来定义当前的模块。 - -### 命名导出 - -  带命名的导出将定义一个局部变量,并在导出的表中添加一个同名的字段。 - -```yuescript -export a, b, c = 1, 2, 3 -export cool = "cat" - -export What = if this - "abc" -else - "def" - -export y = -> - hallo = 3434 - -export class Something - umm: "cool" -``` - - - -```yue -export a, b, c = 1, 2, 3 -export cool = "cat" - -export What = if this - "abc" -else - "def" - -export y = -> - hallo = 3434 - -export class Something - umm: "cool" -``` - - - -  使用解构进行命名导出。 - -```yuescript -export :loadstring, to_lua: tolua = yue -export {itemA: {:fieldA = '默认值'}} = tb -``` - - - -```yue -export :loadstring, to_lua: tolua = yue -export {itemA: {:fieldA = '默认值'}} = tb -``` - - - -  从模块导出命名项目时,可以不用创建局部变量。 - -```yuescript -export.itemA = tb -export. = items -export["a-b-c"] = 123 -``` - - - -```yue -export.itemA = tb -export. = items -export["a-b-c"] = 123 -``` - - - -### 未命名导出 - -  未命名导出会将要导出的目标项目添加到导出表的数组部分。 - -```yuescript -d, e, f = 3, 2, 1 -export d, e, f - -export if this - 123 -else - 456 - -export with tmp - j = 2000 -``` - - - -```yue -d, e, f = 3, 2, 1 -export d, e, f - -export if this - 123 -else - 456 - -export with tmp - j = 2000 -``` - - - -### 默认导出 - -  在导出语句中使用 **default** 关键字,来替换导出的表为一个目标的对象。 - -```yuescript -export default -> - print "你好" - 123 -``` - - - -```yue -export default -> - print "你好" - 123 -``` - - diff --git a/doc/docs/zh/doc/control-flow/for-loop.md b/doc/docs/zh/doc/control-flow/for-loop.md index 52180b7..97e66f9 100644 --- a/doc/docs/zh/doc/control-flow/for-loop.md +++ b/doc/docs/zh/doc/control-flow/for-loop.md @@ -86,7 +86,7 @@ doubled_evens = for i = 1, 20 -  此外,for 循环还支持带返回值的 break 语句,这样循环本身就可以作为一个表达式,在满足条件时提前退出并返回有意义的结果。 +  此外,for 循环还支持带返回值的 break 语句,这样循环本身就可以作为一个表达式,在满足条件时提前退出并返回有意义的结果。for 循环表达式支持 `break` 返回多个值。   例如,查找第一个大于 10 的数字: @@ -104,6 +104,20 @@ first_large = for n in *numbers +```yuescript +key, score = for k, v in pairs data + break k, v * 10 if k == "target" +``` + + + +```yue +key, score = for k, v in pairs data + break k, v * 10 if k == "target" +``` + + +   你还可以结合 for 循环表达式与 continue 语句来过滤值。   注意出现在函数体末尾的 for 循环,不会被当作是一个表达式并将循环结果累积到一个列表中作为返回值(相反,函数将返回 nil)。如果要函数末尾的循环转换为列表表达式,可以显式地使用返回语句加 for 循环表达式。 diff --git a/doc/docs/zh/doc/control-flow/while-loop.md b/doc/docs/zh/doc/control-flow/while-loop.md index 3c624fe..0138d85 100644 --- a/doc/docs/zh/doc/control-flow/while-loop.md +++ b/doc/docs/zh/doc/control-flow/while-loop.md @@ -45,7 +45,25 @@ until running == false do my_function! -  像 for 循环的语法一样,while 循环也可以作为一个表达式使用。为了使函数返回 while 循环的累积列表值,必须明确使用返回语句返回 while 循环表达式。 +  像 for 循环的语法一样,while 循环也可以作为一个表达式使用。while / until 循环表达式支持 `break` 返回多个值。 + +```yuescript +value, doubled = while true + n = get_next! + break n, n * 2 if n > 10 +``` + + + +```yue +value, doubled = while true + n = get_next! + break n, n * 2 if n > 10 +``` + + + +  为了使函数返回 while 循环的累积列表值,必须明确使用返回语句返回 while 循环表达式。 ## repeat 循环 @@ -70,3 +88,25 @@ until i == 0 ``` + +  repeat 循环表达式同样支持 `break` 返回多个值: + +```yuescript +i = 1 +value, scaled = repeat + break i, i * 100 if i > 3 + i += 1 +until false +``` + + + +```yue +i = 1 +value, scaled = repeat + break i, i * 100 if i > 3 + i += 1 +until false +``` + + diff --git a/doc/docs/zh/doc/language-basics/module.md b/doc/docs/zh/doc/language-basics/module.md new file mode 100644 index 0000000..6c90f0e --- /dev/null +++ b/doc/docs/zh/doc/language-basics/module.md @@ -0,0 +1,253 @@ +# 模块 + +## 导入 + +  导入语句是一个语法糖,用于需要引入一个模块或者从已导入的模块中提取子项目。从模块导入的变量默认为不可修改的常量。 + +```yuescript +-- 用作表解构 +do + import insert, concat from table + -- 当给 insert, concat 变量赋值时,编译器会报告错误 + import C, Ct, Cmt from require "lpeg" + -- 快捷写法引入模块的子项 + import x, y, z from 'mymodule' + -- 使用Python风格的导入 + from 'module' import a, b, c + +-- 快捷地导入一个模块 +do + import 'module' + import 'module_x' + import "d-a-s-h-e-s" + import "module.part" + +-- 导入模块后起一个别名使用,或是进行导入模块表的解构 +do + import "player" as PlayerModule + import "lpeg" as :C, :Ct, :Cmt + import "export" as {one, two, Something:{umm:{ch}}} +``` + + + +```yue +-- 用作表解构 +do + import insert, concat from table + -- 当给 insert, concat 变量赋值时,编译器会报告错误 + import C, Ct, Cmt from require "lpeg" + -- 快捷写法引入模块的子项 + import x, y, z from 'mymodule' + -- 使用Python风格的导入 + from 'module' import a, b, c + +-- 快捷地导入一个模块 +do + import 'module' + import 'module_x' + import "d-a-s-h-e-s" + import "module.part" + +-- 导入模块后起一个别名使用,或是进行导入模块表的解构 +do + import "player" as PlayerModule + import "lpeg" as :C, :Ct, :Cmt + import "export" as {one, two, Something:{umm:{ch}}} +``` + + + +## 导入全局变量 + +  你可以使用 `import` 将指定的全局变量导入到本地变量中。当导入一系列对全局变量的链式访问时,最后一个访问的字段将被赋值给本地变量。 + +```yuescript +do + import tostring + import table.concat + print concat ["a", tostring 1] +``` + + + +```yue +do + import tostring + import table.concat + print concat ["a", tostring 1] +``` + + + +### 自动全局变量导入 + +  在一个代码块的顶部写 `import global`,会将当前作用域中尚未显式声明或赋值过的变量名,自动导入为本地常量,并在该语句的位置绑定到同名的全局变量。 + +  但是在同一作用域中被显式声明为全局的变量不会被自动导入,因此可以继续进行赋值操作。 + +```yuescript +do + import global + print "hello" + math.random 3 + -- print = nil -- 报错:自动导入的全局变量为常量 + +do + -- 被显式声明为全局的变量不会被自动导入 + import global + global FLAG + print FLAG + FLAG = 123 +``` + + + +```yue +do + import global + print "hello" + math.random 3 + -- print = nil -- 报错:自动导入的全局变量是常量 + +do + -- 被显式声明为全局的变量不会被自动导入 + import global + global FLAG + print FLAG + FLAG = 123 +``` + + + +## 导出 + +  导出语句提供了一种简洁的方式来定义当前的模块。 + +### 命名导出 + +  带命名的导出将定义一个局部变量,并在导出的表中添加一个同名的字段。 + +```yuescript +export a, b, c = 1, 2, 3 +export cool = "cat" + +export What = if this + "abc" +else + "def" + +export y = -> + hallo = 3434 + +export class Something + umm: "cool" +``` + + + +```yue +export a, b, c = 1, 2, 3 +export cool = "cat" + +export What = if this + "abc" +else + "def" + +export y = -> + hallo = 3434 + +export class Something + umm: "cool" +``` + + + +  使用解构进行命名导出。 + +```yuescript +export :loadstring, to_lua: tolua = yue +export {itemA: {:fieldA = '默认值'}} = tb +``` + + + +```yue +export :loadstring, to_lua: tolua = yue +export {itemA: {:fieldA = '默认值'}} = tb +``` + + + +  从模块导出命名项目时,可以不用创建局部变量。 + +```yuescript +export.itemA = tb +export. = items +export["a-b-c"] = 123 +``` + + + +```yue +export.itemA = tb +export. = items +export["a-b-c"] = 123 +``` + + + +### 未命名导出 + +  未命名导出会将要导出的目标项目添加到导出表的数组部分。 + +```yuescript +d, e, f = 3, 2, 1 +export d, e, f + +export if this + 123 +else + 456 + +export with tmp + j = 2000 +``` + + + +```yue +d, e, f = 3, 2, 1 +export d, e, f + +export if this + 123 +else + 456 + +export with tmp + j = 2000 +``` + + + +### 默认导出 + +  在导出语句中使用 **default** 关键字,来替换导出的表为一个目标的对象。 + +```yuescript +export default -> + print "你好" + 123 +``` + + + +```yue +export default -> + print "你好" + 123 +``` + + diff --git a/doc/docs/zh/doc/objects/with-statement.md b/doc/docs/zh/doc/objects/with-statement.md index 0925050..338e2cc 100644 --- a/doc/docs/zh/doc/objects/with-statement.md +++ b/doc/docs/zh/doc/objects/with-statement.md @@ -44,6 +44,50 @@ file = with File "favorite_foods.txt" +`with` 表达式支持 `break` 返回一个值: + +```yuescript +result = with obj + break .value +``` + + + +```yue +result = with obj + break .value +``` + + + +在 `with` 中使用 `break value` 后,`with` 表达式将不再返回其目标对象,而是返回 `break` 给出的值。 + +```yuescript +a = with obj + .x = 1 +-- a 是 obj + +b = with obj + break .x +-- b 是 .x,不是 obj +``` + + + +```yue +a = with obj + .x = 1 +-- a 是 obj + +b = with obj + break .x +-- b 是 .x,不是 obj +``` + + + +与 `for` / `while` / `repeat` / `do` 不同,`with` 只支持一个 break 返回值。 + 或者… ```yuescript -- cgit v1.2.3-55-g6feb