local c={}function c.named(c)assert(type(c)=="\115\116\114\105\110\103","\083\121\109\098\111\108\115 \109\117\115\116 \098\101 \099\114\101\097\116\101\100 \117\115\105\110\103 \097 \115\116\114\105\110\103 \110\097\109\101\033")local N=newproxy(true)local z=("\083\121\109\098\111\108\040\037\115\041"):format(c);(getmetatable(N)).__tostring=function()return z end return N end return c
--!strict
--[[
	A 'Symbol' is an opaque marker type.

	Symbols have the type 'userdata', but when printed to the console, the name
	of the symbol is shown.
]]

local Symbol = {}

--[[
	Creates a Symbol with the given name.

	When printed or coerced to a string, the symbol will turn into the string
	given as its name.
]]
function Symbol.named(name)
	assert(type(name) == "string", "Symbols must be created using a string name!")

	local self = newproxy(true)

	local wrappedName = ("Symbol(%s)"):format(name)

	getmetatable(self).__tostring = function()
		return wrappedName
	end

	return self
end

return Symbol
