yuescript-src 0.13.6

Sources of Yuescript and logic to build them.
Documentation
import "macro-export" as {
	$, -- import all macros
	$config: $myconfig, -- rename macro $config to $myconfig
}

import "macro-todo" as $

$asserts item == nil

$myconfig false

v = $assert item == nil

macro and = (...)->
	values = [value for value in *{...}]
	$showMacro "and", "#{ table.concat values, " and " }"

if $and f1!
	print "OK"

if $and f1!, f2!, f3!
	print "OK"

item = $copy(
	@
	{pos: {}, flags: flags::tonumber!}
	id
	connections
	pos.x
	pos.y
	pos.z
)

macro in = (target, ...)->
	values = [value for value in *{...}]
	$showMacro "in", table.concat ["#{target} == #{item}" for item in *values], " or "

if x |> $in "Apple", "Pig", "Dog"
	print "exist"

macro map = (items, action)->
	$showMacro "map", "[#{action} for _ in *#{items}]"

macro filter = (items, action)->
	$showMacro "filter", "[_ for _ in *#{items} when #{action}]"

macro reduce = (items, def, action)->
	$showMacro "reduce", "if ##{items} == 0
	#{def}
else
	_1 = #{def}
	for _2 in *#{items}
		_1 = #{action}
	_1"

macro foreach = (items, action)->
	$showMacro "foreach", "for _ in *#{items}
	#{action}"

macro pipe = (...)->
	switch select "#", ...
		when 0 then return ""
		when 1 then return ...
	ops = {...}
	last = ops[1]
	stmts = for i = 2, #ops
		stmt = "\tlocal _#{i} = #{last} |> #{ops[i]}"
		last = "_#{i}"
		stmt
	res = "do
#{table.concat stmts, "\n"}
	#{last}"
	$showMacro "pipe", res

{1,2,3} |> $map(_ * 2) |> $filter(_ > 4) |> $foreach print _

$foreach $filter($map({1,2,3}, _ * 2), _ > 4), print _

val = $pipe(
	{1, 2, 3}
	[[$map(_ * 2)]]
	[[$filter(_ > 4)]]
	[[$reduce(0, _1 + _2)]]
)

macro plus = (a, b)-> "#{a} + #{b}"

$plus(1,2)\call 123

res = 1 |> $plus 2

macro curry = (...)->
	args = {...}
	len = #args
	body = args[len]
	def = table.concat ["(#{args[i]})->" for i = 1, len - 1]
	"#{def}\n#{body\gsub "^do%s*\n",""}"

f = $curry x,y,z,do
	print x,y,z

macro get_inner = (var)-> "do
	a = 1
	a + 1"

macro get_inner_hygienic = (var)-> "(->
	local a = 1
	a + 1)!"

do
	a = 8
	a = $get_inner!
	a += $get_inner!
	print a

do
	a = 8
	a = $get_inner_hygienic!
	a += $get_inner_hygienic!
	print a

macro lua = (code)-> {
	: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
]]

print x

macro def = (fname, ...)->
	args = {...}
	last = table.remove args
	{
		code: $showMacro "def", "local function #{fname}(#{table.concat args, ', '})
	#{last}
end"
		type: "lua"
	}

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

$def sel, a, b, c, [[
	if a then
		return b
	else
		return c
	end
]]

$def dummy,[[]]

macro insertComment = (text)-> {
	code: "-- #{text\match '[\'"](.*)[\'"]'}"
	type: "lua"
}

$insertComment "a comment here"

import 'underscore' as _

macro chain = (...)->
	callable = nil
	for item in *{...}
		callable = callable? and "(#{callable})\\#{item}" or item
	$showMacro "chain", callable

a = $chain(
	_{1, 2, 3, 4, -2, 3}
	chain!
	map => @ * 2
	filter => @ > 3
	value!
)

$chain(
	_{1, 2, 3, 4, -2, 3}
	chain!
	map => @ * 2
	filter => @ > 3
	each => print @
)

result = $chain(
	origin.transform.root.gameObject\Parents!
	Descendants!
	SelectEnable!
	SelectVisible!
	TagEqual "fx"
	Where (x) -> x.name\EndsWith "(Clone)"
	Destroy!
)

macro chainB = (...)->
	switch select "#", ...
		when 0 then return ""
		when 1 then return ...
	items = {...}
	last = nil
	stmts = for i = 1,#items
		stmt = if i == #items
			lastStr = last and "#{last}\\" or ""
			"\t#{lastStr}#{items[i]}"
		else
			lastStr = last and "#{last}\\" or ""
			"\tlocal _#{i} = #{lastStr}#{items[i]}"
		last = "_#{i}"
		stmt
	res = "do
#{table.concat stmts, '\n'}
"
	$showMacro "chainB", res

$chainB(
	origin.transform.root.gameObject\Parents!
	Descendants!
	SelectEnable!
	SelectVisible!
	TagEqual "fx"
	Where (x) -> x.name\EndsWith "(Clone)"
	Destroy!
)

macro chainC = (...)->
	import "yue" as {:to_lua}
	callable = nil
	config = {
		implicit_return_root: false
		reserve_line_number: false
	}
	for item in *{...}
		itemCodes = to_lua(item,config)\gsub '%s*$',''
		if callable?
			callable = "#{callable}:#{itemCodes}"
		else
			callable = itemCodes
	{
		code: $showMacro "chainC", callable
		type: "lua"
	}

$chainC(
	origin.transform.root.gameObject\Parents!
	Descendants!
	SelectEnable!
	SelectVisible!
	TagEqual "fx"
	Where (x) -> x.name\EndsWith "(Clone)"
	Destroy!
)

macro tb = -> "{'abc', a:123, call#:=> 998}"
print $tb[1], $tb.a, ($tb)!, $tb!

print "current line: #{ $LINE }"

$todo

macro skip = -> ""

do
	print 1
	<- $skip
	print 2
	print 3

macro skip = -> "while false do break"

_ = ->
	print 1
	<- $skip
	print 2
	print 3

macro implicitReturnMacroIsAllowed = -> "print 'abc'\n123"

$implicitReturnMacroIsAllowed