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"

$隐式返回宏是允许的