aboutsummaryrefslogtreecommitdiff
path: root/spec/inputs/unicode/macro.yue
blob: 79d3c071a71ede77d957b86b413d9c795b4ac4df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
import "unicode.macro_export" as {
	$, -- import all macros
	$配置: $我的配置, -- rename macro $config to $myconfig
}

import "unicode.macro_todo" as $

$断言集 对象 == nil

$我的配置 false

结果 = $断言 对象 == nil

macro 和 = (...)->
	值们 = [元素 for 元素 in *{...}]
	$显示宏 "和", "#{ table.concat 值们, " and " }"

if $和 函数1!
	打印 "没问题"

if $和 函数1!, 函数2!, 函数3!
	打印 "没问题"

对象 = $复制(
	@
	{位置: {}, 标签: 标签::转数字!}
	标识
	连接们
	位置.x坐标
	位置.y坐标
	位置.z坐标
)

macro 在 = (目标, ...)->
	值们 = [元素 for 元素 in *{...}]
	$显示宏 "在", table.concat ["#{目标} == #{值}" for 值 in *值们], " or "

if 变量x |> $在 "🍎", "🐷", "🐶"
	打印 "存在"

macro 映射 = (数组, 动作)->
	$显示宏 "映射", "[#{动作} for _ in *#{数组}]"

macro 过滤 = (数组, 动作)->
	$显示宏 "过滤", "[_ for _ in *#{数组} when #{动作}]"

macro 合并 = (数组, 默认值, 动作)->
	$显示宏 "合并", "if ##{数组} == 0
	#{默认值}
else
	_1 = #{默认值}
	for _2 in *#{数组}
		_1 = #{动作}
	_1"

macro 每一个 = (数组, 动作)->
	$显示宏 "每一个", "for _ in *#{数组}
	#{动作}"

macro 管道 = (...)->
	switch select "#", ...
		when 0 then return ""
		when 1 then return ...
	操作数组 = {...}
	最后一个 = 操作数组[1]
	声明数组 = for 计数 = 2, #操作数组
		声明 = "\tlocal _#{计数} = #{最后一个} |> #{操作数组[计数]}"
		最后一个 = "_#{计数}"
		声明
	结果 = "do
#{table.concat 声明数组, "\n"}
	#{最后一个}"
	$显示宏 "管道", 结果

{1,2,3} |> $映射(_ * 2) |> $过滤(_ > 4) |> $每一个 打印 _

$每一个 $过滤($映射({1,2,3}, _ * 2), _ > 4), 打印 _

值 = $管道(
	{1, 2, 3}
	[[$映射(_ * 2)]]
	[[$过滤(_ > 4)]]
	[[$合并(0, _1 + _2)]]
)

macro 加 = (参数a, 参数b)-> "#{参数a} + #{参数b}"

$加(1,2)\调用 123

结果 = 1 |> $加 2

macro 柯里化 = (...)->
	参数数组 = {...}
	长度 = #参数数组
	主体 = 参数数组[长度]
	定义 = table.concat ["(#{参数数组[计数]})->" for 计数 = 1, 长度 - 1]
	"#{定义}\n#{主体\gsub "^do%s*\n",""}"

f = $柯里化 参数x,参数y,参数z,do
	打印 参数x,参数y,参数z

macro 获取里值 = (值)-> "do
	变量a = 1
	变量a + 1"

macro 获取里值_保持卫生 = (值)-> "(->
	local 变量a = 1
	变量a + 1)!"

do
	变量a = 8
	变量a = $获取里值!
	变量a += $获取里值!
	打印 变量a

do
	变量a = 8
	变量a = $获取里值_保持卫生!
	变量a += $获取里值_保持卫生!
	打印 变量a

macro Lua代码 = (代码)-> {
	code: 代码
	type: "lua"
}

变量x = 0

$Lua代码 [[
local function f(a)
	return a + 1
end
x = x + f(3)
]]

$Lua代码[[
function tb:func()
	print(123)
end
]]

打印 变量x

macro 定义函数 = (函数名, ...)->
	参数数组 = {...}
	最后一个 = table.remove 参数数组
	{
		code: $显示宏 "定义函数", "local function #{函数名}(#{table.concat 参数数组, ', '})
	#{最后一个}
end"
		type: "lua"
	}

sel = (参数a, 参数b, 参数c)-> if 参数a then 参数b else 参数c

$定义函数 sel, a, b, c, [[
	if a then
		return b
	else
		return c
	end
]]

$定义函数 dummy,[[]]

macro 插入注释 = (文本)-> {
	code: "-- #{文本\match '[\'"](.*)[\'"]'}"
	type: "lua"
}

$插入注释 "这有个注释"

import '下划线' as _

macro 链式调用 = (...)->
	主调用 = nil
	for 元素 in *{...}
		主调用 = 主调用? and "(#{主调用})\\#{元素}" or 元素
	$显示宏 "链式调用", 主调用

结果a = $链式调用(
	_{1, 2, 3, 4, -2, 3}
	链!
	映射 => @ * 2
	过滤 => @ > 3
	取值!
)

$链式调用(
	_{1, 2, 3, 4, -2, 3}
	链!
	映射 => @ * 2
	过滤 => @ > 3
	每一个 => 打印 @
)

结果 = $链式调用(
	原点.变换.根节点.游戏对象\父节点!
	后代!
	选择启用!
	选择可见!
	标签等于 "fx"
	其中 (x)-> x.名称\结尾为 "(克隆)"
	摧毁!
)

macro 链式调用B = (...)->
	switch select "#", ...
		when 0 then return ""
		when 1 then return ...
	参数数组 = {...}
	最后一个 = nil
	声明数组 = for 计数 = 1,#参数数组
		声明 = if 计数 == #参数数组
			最后的字符串 = 最后一个 and "#{最后一个}\\" or ""
			"\t#{最后的字符串}#{参数数组[计数]}"
		else
			最后的字符串 = 最后一个 and "#{最后一个}\\" or ""
			"\tlocal _#{计数} = #{最后的字符串}#{参数数组[计数]}"
		最后一个 = "_#{计数}"
		声明
	结果 = "do
#{table.concat 声明数组, '\n'}
"
	$显示宏 "链式调用B", 结果

$链式调用B(
	原点.变换.根节点.游戏对象\父节点!
	后代!
	选择启用!
	选择可见!
	标签等于 "fx"
	其中 (x)-> x.名称\结尾为 "(克隆)"
	摧毁!
)

macro 链式调用C = (...)->
	import "yue" as {:to_lua}
	主调用 = nil
	编译配置 = {
		implicit_return_root: false
		reserve_line_number: false
	}
	for 参数 in *{...}
		参数转代码 = to_lua(参数,编译配置)\gsub '%s*$',''
		if 主调用?
			主调用 = "#{主调用}:#{参数转代码}"
		else
			主调用 = 参数转代码
	{
		code: $显示宏 "链式调用C", 主调用
		type: "lua"
	}

$链式调用C(
	原点.变换.根节点.游戏对象\父节点!
	后代!
	选择启用!
	选择可见!
	标签等于 "fx"
	其中 (x)-> x.名称\结尾为 "(克隆)"
	摧毁!
)

macro 表 = -> "{'abc', 字段a:123, <call>:=> 998}"
打印 $表[1], $表.字段a, ($表)!, $表!

打印 "当前代码行数: #{ $LINE }"

$待办

macro 跳过 = -> ""

do
	打印 1
	<- $跳过
	打印 2
	打印 3

macro 跳过 = -> "while false do break"

_1 = ->
	打印 1
	<- $跳过
	打印 2
	打印 3

macro 隐式返回宏是允许的 = -> "打印 'abc'\n123"

$隐式返回宏是允许的