aboutsummaryrefslogtreecommitdiff
path: root/spec/inputs/unicode/macro.yue
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2023-08-17 10:36:15 +0800
committerLi Jin <dragon-fly@qq.com>2023-08-17 10:36:15 +0800
commite61cce21ef7def2c2e52dd6cb6a5b540ebcac29d (patch)
tree6e7c5e7e6f13157e9f8db26c38f6d8cba75683e5 /spec/inputs/unicode/macro.yue
parent289faf45ac26f7e0ac1a1e4305e5c42fc1e5b866 (diff)
downloadyuescript-e61cce21ef7def2c2e52dd6cb6a5b540ebcac29d.tar.gz
yuescript-e61cce21ef7def2c2e52dd6cb6a5b540ebcac29d.tar.bz2
yuescript-e61cce21ef7def2c2e52dd6cb6a5b540ebcac29d.zip
add unicode identifier support, fix more issue from #144
Diffstat (limited to 'spec/inputs/unicode/macro.yue')
-rw-r--r--spec/inputs/unicode/macro.yue291
1 files changed, 291 insertions, 0 deletions
diff --git a/spec/inputs/unicode/macro.yue b/spec/inputs/unicode/macro.yue
new file mode 100644
index 0000000..79d3c07
--- /dev/null
+++ b/spec/inputs/unicode/macro.yue
@@ -0,0 +1,291 @@
1import "unicode.macro_export" as {
2 $, -- import all macros
3 $配置: $我的配置, -- rename macro $config to $myconfig
4}
5
6import "unicode.macro_todo" as $
7
8$断言集 对象 == nil
9
10$我的配置 false
11
12结果 = $断言 对象 == nil
13
14macro 和 = (...)->
15 值们 = [元素 for 元素 in *{...}]
16 $显示宏 "和", "#{ table.concat 值们, " and " }"
17
18if $和 函数1!
19 打印 "没问题"
20
21if $和 函数1!, 函数2!, 函数3!
22 打印 "没问题"
23
24对象 = $复制(
25 @
26 {位置: {}, 标签: 标签::转数字!}
27 标识
28 连接们
29 位置.x坐标
30 位置.y坐标
31 位置.z坐标
32)
33
34macro 在 = (目标, ...)->
35 值们 = [元素 for 元素 in *{...}]
36 $显示宏 "在", table.concat ["#{目标} == #{值}" for 值 in *值们], " or "
37
38if 变量x |> $在 "🍎", "🐷", "🐶"
39 打印 "存在"
40
41macro 映射 = (数组, 动作)->
42 $显示宏 "映射", "[#{动作} for _ in *#{数组}]"
43
44macro 过滤 = (数组, 动作)->
45 $显示宏 "过滤", "[_ for _ in *#{数组} when #{动作}]"
46
47macro 合并 = (数组, 默认值, 动作)->
48 $显示宏 "合并", "if ##{数组} == 0
49 #{默认值}
50else
51 _1 = #{默认值}
52 for _2 in *#{数组}
53 _1 = #{动作}
54 _1"
55
56macro 每一个 = (数组, 动作)->
57 $显示宏 "每一个", "for _ in *#{数组}
58 #{动作}"
59
60macro 管道 = (...)->
61 switch select "#", ...
62 when 0 then return ""
63 when 1 then return ...
64 操作数组 = {...}
65 最后一个 = 操作数组[1]
66 声明数组 = for 计数 = 2, #操作数组
67 声明 = "\tlocal _#{计数} = #{最后一个} |> #{操作数组[计数]}"
68 最后一个 = "_#{计数}"
69 声明
70 结果 = "do
71#{table.concat 声明数组, "\n"}
72 #{最后一个}"
73 $显示宏 "管道", 结果
74
75{1,2,3} |> $映射(_ * 2) |> $过滤(_ > 4) |> $每一个 打印 _
76
77$每一个 $过滤($映射({1,2,3}, _ * 2), _ > 4), 打印 _
78
79值 = $管道(
80 {1, 2, 3}
81 [[$映射(_ * 2)]]
82 [[$过滤(_ > 4)]]
83 [[$合并(0, _1 + _2)]]
84)
85
86macro 加 = (参数a, 参数b)-> "#{参数a} + #{参数b}"
87
88$加(1,2)\调用 123
89
90结果 = 1 |> $加 2
91
92macro 柯里化 = (...)->
93 参数数组 = {...}
94 长度 = #参数数组
95 主体 = 参数数组[长度]
96 定义 = table.concat ["(#{参数数组[计数]})->" for 计数 = 1, 长度 - 1]
97 "#{定义}\n#{主体\gsub "^do%s*\n",""}"
98
99f = $柯里化 参数x,参数y,参数z,do
100 打印 参数x,参数y,参数z
101
102macro 获取里值 = (值)-> "do
103 变量a = 1
104 变量a + 1"
105
106macro 获取里值_保持卫生 = (值)-> "(->
107 local 变量a = 1
108 变量a + 1)!"
109
110do
111 变量a = 8
112 变量a = $获取里值!
113 变量a += $获取里值!
114 打印 变量a
115
116do
117 变量a = 8
118 变量a = $获取里值_保持卫生!
119 变量a += $获取里值_保持卫生!
120 打印 变量a
121
122macro Lua代码 = (代码)-> {
123 code: 代码
124 type: "lua"
125}
126
127变量x = 0
128
129$Lua代码 [[
130local function f(a)
131 return a + 1
132end
133x = x + f(3)
134]]
135
136$Lua代码[[
137function tb:func()
138 print(123)
139end
140]]
141
142打印 变量x
143
144macro 定义函数 = (函数名, ...)->
145 参数数组 = {...}
146 最后一个 = table.remove 参数数组
147 {
148 code: $显示宏 "定义函数", "local function #{函数名}(#{table.concat 参数数组, ', '})
149 #{最后一个}
150end"
151 type: "lua"
152 }
153
154sel = (参数a, 参数b, 参数c)-> if 参数a then 参数b else 参数c
155
156$定义函数 sel, a, b, c, [[
157 if a then
158 return b
159 else
160 return c
161 end
162]]
163
164$定义函数 dummy,[[]]
165
166macro 插入注释 = (文本)-> {
167 code: "-- #{文本\match '[\'"](.*)[\'"]'}"
168 type: "lua"
169}
170
171$插入注释 "这有个注释"
172
173import '下划线' as _
174
175macro 链式调用 = (...)->
176 主调用 = nil
177 for 元素 in *{...}
178 主调用 = 主调用? and "(#{主调用})\\#{元素}" or 元素
179 $显示宏 "链式调用", 主调用
180
181结果a = $链式调用(
182 _{1, 2, 3, 4, -2, 3}
183 链!
184 映射 => @ * 2
185 过滤 => @ > 3
186 取值!
187)
188
189$链式调用(
190 _{1, 2, 3, 4, -2, 3}
191 链!
192 映射 => @ * 2
193 过滤 => @ > 3
194 每一个 => 打印 @
195)
196
197结果 = $链式调用(
198 原点.变换.根节点.游戏对象\父节点!
199 后代!
200 选择启用!
201 选择可见!
202 标签等于 "fx"
203 其中 (x)-> x.名称\结尾为 "(克隆)"
204 摧毁!
205)
206
207macro 链式调用B = (...)->
208 switch select "#", ...
209 when 0 then return ""
210 when 1 then return ...
211 参数数组 = {...}
212 最后一个 = nil
213 声明数组 = for 计数 = 1,#参数数组
214 声明 = if 计数 == #参数数组
215 最后的字符串 = 最后一个 and "#{最后一个}\\" or ""
216 "\t#{最后的字符串}#{参数数组[计数]}"
217 else
218 最后的字符串 = 最后一个 and "#{最后一个}\\" or ""
219 "\tlocal _#{计数} = #{最后的字符串}#{参数数组[计数]}"
220 最后一个 = "_#{计数}"
221 声明
222 结果 = "do
223#{table.concat 声明数组, '\n'}
224"
225 $显示宏 "链式调用B", 结果
226
227$链式调用B(
228 原点.变换.根节点.游戏对象\父节点!
229 后代!
230 选择启用!
231 选择可见!
232 标签等于 "fx"
233 其中 (x)-> x.名称\结尾为 "(克隆)"
234 摧毁!
235)
236
237macro 链式调用C = (...)->
238 import "yue" as {:to_lua}
239 主调用 = nil
240 编译配置 = {
241 implicit_return_root: false
242 reserve_line_number: false
243 }
244 for 参数 in *{...}
245 参数转代码 = to_lua(参数,编译配置)\gsub '%s*$',''
246 if 主调用?
247 主调用 = "#{主调用}:#{参数转代码}"
248 else
249 主调用 = 参数转代码
250 {
251 code: $显示宏 "链式调用C", 主调用
252 type: "lua"
253 }
254
255$链式调用C(
256 原点.变换.根节点.游戏对象\父节点!
257 后代!
258 选择启用!
259 选择可见!
260 标签等于 "fx"
261 其中 (x)-> x.名称\结尾为 "(克隆)"
262 摧毁!
263)
264
265macro 表 = -> "{'abc', 字段a:123, <call>:=> 998}"
266打印 $表[1], $表.字段a, ($表)!, $表!
267
268打印 "当前代码行数: #{ $LINE }"
269
270$待办
271
272macro 跳过 = -> ""
273
274do
275 打印 1
276 <- $跳过
277 打印 2
278 打印 3
279
280macro 跳过 = -> "while false do break"
281
282_1 = ->
283 打印 1
284 <- $跳过
285 打印 2
286 打印 3
287
288macro 隐式返回宏是允许的 = -> "打印 'abc'\n123"
289
290$隐式返回宏是允许的
291