mirror of
https://github.com/leafo/moonscript.git
synced 2025-01-09 00:04:22 +00:00
converted some lua to moonscript
This commit is contained in:
parent
19211b356d
commit
ec8cc9ae66
@ -1,7 +1,6 @@
|
|||||||
module("moonscript.compile", package.seeall)
|
module("moonscript.compile", package.seeall)
|
||||||
local util = require("moonscript.util")
|
local util = require("moonscript.util")
|
||||||
local data = require("moonscript.data")
|
local data = require("moonscript.data")
|
||||||
local itwos = util.itwos
|
|
||||||
local Set, ntype = data.Set, data.ntype
|
local Set, ntype = data.Set, data.ntype
|
||||||
local concat, insert = table.concat, table.insert
|
local concat, insert = table.concat, table.insert
|
||||||
indent_char = " "
|
indent_char = " "
|
||||||
|
@ -3,7 +3,6 @@ module "moonscript.compile", package.seeall
|
|||||||
util = require "moonscript.util"
|
util = require "moonscript.util"
|
||||||
data = require "moonscript.data"
|
data = require "moonscript.data"
|
||||||
|
|
||||||
import itwos from util
|
|
||||||
import Set, ntype from data
|
import Set, ntype from data
|
||||||
import concat, insert from table
|
import concat, insert from table
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
module("moonscript.compile", package.seeall)
|
module("moonscript.compile", package.seeall)
|
||||||
local util = require("moonscript.util")
|
local util = require("moonscript.util")
|
||||||
local data = require("moonscript.data")
|
local data = require("moonscript.data")
|
||||||
local dump = require("moonscript.dump")
|
|
||||||
require("moonscript.compile.format")
|
require("moonscript.compile.format")
|
||||||
require("moonscript.compile.types")
|
require("moonscript.compile.types")
|
||||||
local reversed = util.reversed
|
local reversed = util.reversed
|
||||||
|
@ -2,7 +2,6 @@ module "moonscript.compile", package.seeall
|
|||||||
|
|
||||||
util = require "moonscript.util"
|
util = require "moonscript.util"
|
||||||
data = require "moonscript.data"
|
data = require "moonscript.data"
|
||||||
dump = require "moonscript.dump"
|
|
||||||
|
|
||||||
require "moonscript.compile.format"
|
require "moonscript.compile.format"
|
||||||
require "moonscript.compile.types"
|
require "moonscript.compile.types"
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
module("moonscript.compile", package.seeall)
|
module("moonscript.compile", package.seeall)
|
||||||
local util = require("moonscript.util")
|
local util = require("moonscript.util")
|
||||||
local data = require("moonscript.data")
|
local data = require("moonscript.data")
|
||||||
local dump = require("moonscript.dump")
|
|
||||||
require("moonscript.compile.format")
|
require("moonscript.compile.format")
|
||||||
local ntype = data.ntype
|
local ntype = data.ntype
|
||||||
local concat, insert = table.concat, table.insert
|
local concat, insert = table.concat, table.insert
|
||||||
|
@ -3,7 +3,6 @@ module "moonscript.compile", package.seeall
|
|||||||
|
|
||||||
util = require "moonscript.util"
|
util = require "moonscript.util"
|
||||||
data = require "moonscript.data"
|
data = require "moonscript.data"
|
||||||
dump = require "moonscript.dump"
|
|
||||||
|
|
||||||
require "moonscript.compile.format"
|
require "moonscript.compile.format"
|
||||||
|
|
||||||
|
@ -1,52 +1,87 @@
|
|||||||
|
|
||||||
module("moonscript.data", package.seeall)
|
module("moonscript.data", package.seeall)
|
||||||
|
local concat = table.concat
|
||||||
local stack_t = {}
|
ntype = function(node)
|
||||||
local _stack_mt = { __index = stack_t, __tostring = function(self)
|
if type(node) ~= "table" then
|
||||||
return "<Stack {"..table.concat(self, ", ").."}>"
|
return "value"
|
||||||
end}
|
else
|
||||||
|
return node[1]
|
||||||
function stack_t:pop()
|
end
|
||||||
return table.remove(self)
|
|
||||||
end
|
end
|
||||||
|
Set = function(items)
|
||||||
function stack_t:push(value)
|
local self = { }
|
||||||
table.insert(self, value)
|
do
|
||||||
return value
|
local _item_0 = items
|
||||||
|
for _index_0 = 1, #_item_0 do
|
||||||
|
local key = _item_0[_index_0]
|
||||||
|
self[key] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return self
|
||||||
end
|
end
|
||||||
|
Stack = (function(_parent_0)
|
||||||
function stack_t:top()
|
local _base_0 = {
|
||||||
return self[#self]
|
__tostring = function(self)
|
||||||
end
|
return "<Stack {" .. concat(self, ", ") .. "}>"
|
||||||
|
end,
|
||||||
function Stack(...)
|
pop = function(self)
|
||||||
local self = setmetatable({}, _stack_mt)
|
return table.remove(self)
|
||||||
|
end,
|
||||||
for _, v in ipairs{...} do
|
push = function(self, value)
|
||||||
self:push(v)
|
table.insert(self, value)
|
||||||
end
|
return value
|
||||||
|
end,
|
||||||
return self
|
top = function(self)
|
||||||
end
|
return self[#self]
|
||||||
|
end
|
||||||
function Set(items)
|
}
|
||||||
local self = {}
|
_base_0.__index = _base_0
|
||||||
for _,item in ipairs(items) do
|
if _parent_0 then
|
||||||
self[item] = true
|
setmetatable(_base_0, getmetatable(_parent_0).__index)
|
||||||
end
|
end
|
||||||
return self
|
local _class_0 = setmetatable({
|
||||||
end
|
__init = function(self, ...)
|
||||||
|
do
|
||||||
-- find out the type of a node
|
local _item_0 = {
|
||||||
function ntype(node)
|
...
|
||||||
if type(node) ~= "table" then return "value" end
|
}
|
||||||
return node[1]
|
for _index_0 = 1, #_item_0 do
|
||||||
end
|
local v = _item_0[_index_0]
|
||||||
|
self:push(v)
|
||||||
lua_keywords = Set{
|
end
|
||||||
'and', 'break', 'do', 'else', 'elseif',
|
end
|
||||||
'end', 'false', 'for', 'function', 'if',
|
return nil
|
||||||
'in', 'local', 'nil', 'not', 'or',
|
end
|
||||||
'repeat', 'return', 'then', 'true',
|
}, {
|
||||||
'until', 'while'
|
__index = _base_0,
|
||||||
}
|
__call = function(mt, ...)
|
||||||
|
local self = setmetatable({}, _base_0)
|
||||||
|
mt.__init(self, ...)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
})
|
||||||
|
_base_0.__class = _class_0
|
||||||
|
return _class_0
|
||||||
|
end)()
|
||||||
|
lua_keywords = Set({
|
||||||
|
'and',
|
||||||
|
'break',
|
||||||
|
'do',
|
||||||
|
'else',
|
||||||
|
'elseif',
|
||||||
|
'end',
|
||||||
|
'false',
|
||||||
|
'for',
|
||||||
|
'function',
|
||||||
|
'if',
|
||||||
|
'in',
|
||||||
|
'local',
|
||||||
|
'nil',
|
||||||
|
'not',
|
||||||
|
'or',
|
||||||
|
'repeat',
|
||||||
|
'return',
|
||||||
|
'then',
|
||||||
|
'true',
|
||||||
|
'until',
|
||||||
|
'while'
|
||||||
|
})
|
||||||
|
47
moonscript/data.moon
Normal file
47
moonscript/data.moon
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
-- data structure utils
|
||||||
|
|
||||||
|
module "moonscript.data", package.seeall
|
||||||
|
|
||||||
|
export Set, Stack
|
||||||
|
export ntype, lua_keywords
|
||||||
|
|
||||||
|
import concat from table
|
||||||
|
|
||||||
|
-- type of node as string
|
||||||
|
ntype = (node) ->
|
||||||
|
if type(node) != "table"
|
||||||
|
"value"
|
||||||
|
else
|
||||||
|
node[1]
|
||||||
|
|
||||||
|
Set = (items) ->
|
||||||
|
self = {}
|
||||||
|
self[key] = true for key in *items
|
||||||
|
self
|
||||||
|
|
||||||
|
class Stack
|
||||||
|
__tostring: => "<Stack {"..concat(self, ", ").."}>"
|
||||||
|
|
||||||
|
new: (...) =>
|
||||||
|
@push v for v in *{...}
|
||||||
|
nil
|
||||||
|
|
||||||
|
pop: =>
|
||||||
|
table.remove self
|
||||||
|
|
||||||
|
push: (value) =>
|
||||||
|
table.insert self, value
|
||||||
|
value
|
||||||
|
|
||||||
|
top: =>
|
||||||
|
self[#self]
|
||||||
|
|
||||||
|
|
||||||
|
lua_keywords = Set{
|
||||||
|
'and', 'break', 'do', 'else', 'elseif',
|
||||||
|
'end', 'false', 'for', 'function', 'if',
|
||||||
|
'in', 'local', 'nil', 'not', 'or',
|
||||||
|
'repeat', 'return', 'then', 'true',
|
||||||
|
'until', 'while'
|
||||||
|
}
|
||||||
|
|
@ -1,29 +1,46 @@
|
|||||||
|
|
||||||
module("moonscript.dump", package.seeall)
|
module("moonscript.dump", package.seeall)
|
||||||
|
local flat_value
|
||||||
local function flat_value(op, depth)
|
flat_value = function(op, depth)
|
||||||
depth = depth or 1
|
if depth == nil then
|
||||||
|
depth = 1
|
||||||
if type(op) == "string" then return '"'..op..'"' end
|
end
|
||||||
if type(op) ~= "table" then return tostring(op) end
|
if type(op) == "string" then
|
||||||
local items = {}
|
return '"' .. op .. '"'
|
||||||
for _, item in ipairs(op) do
|
end
|
||||||
table.insert(items, flat_value(item, depth+1))
|
if type(op) ~= "table" then
|
||||||
end
|
return tostring(op)
|
||||||
|
end
|
||||||
local pos = op[-1]
|
local items = (function()
|
||||||
|
local _accum_0 = { }
|
||||||
return "{"..(pos and "["..pos.."] " or "")..table.concat(items, ", ").."}"
|
local _len_0 = 0
|
||||||
|
do
|
||||||
|
local _item_0 = op
|
||||||
|
for _index_0 = 1, #_item_0 do
|
||||||
|
local item = _item_0[_index_0]
|
||||||
|
_len_0 = _len_0 + 1
|
||||||
|
_accum_0[_len_0] = flat_value(item, depth + 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _accum_0
|
||||||
|
end)()
|
||||||
|
local pos = op[-1]
|
||||||
|
return "{" .. (pos and "[" .. pos .. "] " or "") .. table.concat(items, ", ") .. "}"
|
||||||
end
|
end
|
||||||
|
value = function(op)
|
||||||
function value(op)
|
return flat_value(op)
|
||||||
return flat_value(op)
|
|
||||||
end
|
end
|
||||||
|
tree = function(block)
|
||||||
function tree(block, depth)
|
return (function()
|
||||||
depth = depth or 0
|
local _accum_0 = { }
|
||||||
for _, op in ipairs(block) do
|
local _len_0 = 0
|
||||||
print(flat_value(op))
|
do
|
||||||
end
|
local _item_0 = block
|
||||||
|
for _index_0 = 1, #_item_0 do
|
||||||
|
local value = _item_0[_index_0]
|
||||||
|
_len_0 = _len_0 + 1
|
||||||
|
_accum_0[_len_0] = print(flat_value(value))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _accum_0
|
||||||
|
end)()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
19
moonscript/dump.moon
Normal file
19
moonscript/dump.moon
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
|
||||||
|
module "moonscript.dump", package.seeall
|
||||||
|
|
||||||
|
export value, tree
|
||||||
|
|
||||||
|
flat_value = (op, depth=1) ->
|
||||||
|
return '"'..op..'"' if type(op) == "string"
|
||||||
|
return tostring(op) if type(op) != "table"
|
||||||
|
|
||||||
|
items = [flat_value item, depth + 1 for item in *op]
|
||||||
|
pos = op[-1]
|
||||||
|
|
||||||
|
"{"..(pos and "["..pos.."] " or "")..table.concat(items, ", ").."}"
|
||||||
|
|
||||||
|
value = (op) ->
|
||||||
|
flat_value op
|
||||||
|
|
||||||
|
tree = (block) ->
|
||||||
|
print flat_value value for value in *block
|
@ -1,144 +1,101 @@
|
|||||||
|
|
||||||
module("moonscript.util", package.seeall)
|
module("moonscript.util", package.seeall)
|
||||||
|
local concat = table.concat
|
||||||
moon = {
|
moon = {
|
||||||
is_object = function(value)
|
is_object = function(value)
|
||||||
return type(value) == "table" and value.__class
|
return type(value) == "table" and value.__class
|
||||||
end,
|
end,
|
||||||
type = function(value)
|
type = function(value)
|
||||||
base_type = type(value)
|
local base_type = type(value)
|
||||||
if base_type == "table" then
|
if base_type == "table" then
|
||||||
cls = value.__class
|
local cls = value.__class
|
||||||
if cls then return cls end
|
if cls then
|
||||||
end
|
return cls
|
||||||
return base_type
|
end
|
||||||
end
|
end
|
||||||
|
return base_type
|
||||||
|
end
|
||||||
}
|
}
|
||||||
|
pos_to_line = function(str, pos)
|
||||||
function pos_to_line(str, pos)
|
local line = 1
|
||||||
local line = 1
|
for _ in str:sub(1, pos):gmatch("\n") do
|
||||||
for _ in str:sub(1, pos):gmatch("\n") do
|
line = line + 1
|
||||||
line = line + 1
|
end
|
||||||
end
|
return line
|
||||||
return line
|
|
||||||
end
|
end
|
||||||
|
get_closest_line = function(str, line_num)
|
||||||
function get_closest_line(str, line_num)
|
local line = get_line(str, line_num)
|
||||||
local line = get_line(str, line_num)
|
if (not line or trim(line) == "") and line_num > 1 then
|
||||||
if (not line or trim(line) == "") and line_num > 1 then
|
return get_closest_line(str, line_num - 1)
|
||||||
return get_closest_line(str, line_num - 1)
|
else
|
||||||
end
|
return line, line_num
|
||||||
|
end
|
||||||
return line, line_num
|
|
||||||
end
|
end
|
||||||
|
get_line = function(str, line_num)
|
||||||
function get_line(str, line_num)
|
for line in str:gmatch("(.-)[\n$]") do
|
||||||
for line in str:gmatch("(.-)[\n$]") do
|
if line_num == 1 then
|
||||||
if line_num == 1 then
|
return line
|
||||||
return line
|
end
|
||||||
end
|
line_num = line_num - 1
|
||||||
line_num = line_num - 1
|
end
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
reversed = function(seq)
|
||||||
-- shallow copy
|
return coroutine.wrap(function()
|
||||||
function clone(tbl)
|
for i = #seq, 1, -1 do
|
||||||
local out = {}
|
coroutine.yield(i, seq[i])
|
||||||
for k,v in pairs(tbl) do
|
end
|
||||||
out[k] = v
|
end)
|
||||||
end
|
|
||||||
return out
|
|
||||||
end
|
end
|
||||||
|
trim = function(str)
|
||||||
function map(tbl, fn)
|
return str:match("^%s*(.-)%s*$")
|
||||||
local out = {}
|
|
||||||
for i,v in ipairs(tbl) do
|
|
||||||
out[i] = fn(v)
|
|
||||||
end
|
|
||||||
return out
|
|
||||||
end
|
end
|
||||||
|
split = function(str, delim)
|
||||||
function every(tbl, fn)
|
if str == "" then
|
||||||
for i=1,#tbl do
|
return { }
|
||||||
local pass
|
end
|
||||||
if fn then
|
str = str .. delim
|
||||||
pass = fn(tbl[i])
|
return (function()
|
||||||
else
|
local _accum_0 = { }
|
||||||
pass = tbl[i]
|
local _len_0 = 0
|
||||||
end
|
for m in str:gmatch("(.-)" .. delim) do
|
||||||
|
_len_0 = _len_0 + 1
|
||||||
if not pass then return false end
|
_accum_0[_len_0] = m
|
||||||
end
|
end
|
||||||
return true
|
return _accum_0
|
||||||
|
end)()
|
||||||
end
|
end
|
||||||
|
dump = function(what)
|
||||||
function bind(obj, name)
|
local seen = { }
|
||||||
return function(...)
|
local _dump
|
||||||
return obj[name](obj, ...)
|
_dump = function(what, depth)
|
||||||
end
|
if depth == nil then
|
||||||
|
depth = 0
|
||||||
|
end
|
||||||
|
local t = type(what)
|
||||||
|
if t == "string" then
|
||||||
|
return '"' .. what .. '"\n'
|
||||||
|
elseif t == "table" then
|
||||||
|
if seen[what] then
|
||||||
|
return "recursion(" .. tostring(what) .. ")...\n"
|
||||||
|
end
|
||||||
|
local _ = seen[what] == true
|
||||||
|
depth = depth + 1
|
||||||
|
local lines = (function()
|
||||||
|
local _accum_0 = { }
|
||||||
|
local _len_0 = 0
|
||||||
|
for k, v in pairs(what) do
|
||||||
|
local _value_0 = (" "):rep(depth * 4) .. "[" .. tostring(k) .. "] = " .. _dump(v, depth)
|
||||||
|
if _value_0 ~= nil then
|
||||||
|
_len_0 = _len_0 + 1
|
||||||
|
_accum_0[_len_0] = _value_0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _accum_0
|
||||||
|
end)()
|
||||||
|
seen[what] = false
|
||||||
|
return "{\n" .. concat(lines) .. (" "):rep((depth - 1) * 4) .. "}\n"
|
||||||
|
else
|
||||||
|
return tostring(what) .. "\n"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return _dump(what)
|
||||||
end
|
end
|
||||||
|
|
||||||
function itwos(seq)
|
|
||||||
n = 2
|
|
||||||
return coroutine.wrap(function()
|
|
||||||
for i = 1, #seq-n+1 do
|
|
||||||
coroutine.yield(i, seq[i], i+1, seq[i+1])
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
function reversed(seq)
|
|
||||||
return coroutine.wrap(function()
|
|
||||||
for i=#seq,1,-1 do
|
|
||||||
coroutine.yield(i, seq[i])
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
function dump(what)
|
|
||||||
local seen = {}
|
|
||||||
local function _dump(what, depth)
|
|
||||||
depth = depth or 0
|
|
||||||
local t = type(what)
|
|
||||||
|
|
||||||
if t == "string" then
|
|
||||||
return '"'..what..'"\n'
|
|
||||||
elseif t == "table" then
|
|
||||||
if seen[what] then
|
|
||||||
return "recursion("..tostring(what)..")...\n"
|
|
||||||
end
|
|
||||||
seen[what] = true
|
|
||||||
|
|
||||||
depth = depth + 1
|
|
||||||
out = "{\n"
|
|
||||||
for k,v in pairs(what) do
|
|
||||||
out = out..(" "):rep(depth*4).."["..tostring(k).."] = ".._dump(v, depth)
|
|
||||||
end
|
|
||||||
|
|
||||||
seen[what] = false
|
|
||||||
|
|
||||||
return out .. (" "):rep((depth-1)*4) .. "}\n"
|
|
||||||
else
|
|
||||||
return tostring(what).."\n"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return _dump(what)
|
|
||||||
end
|
|
||||||
|
|
||||||
function split(str, delim)
|
|
||||||
if str == "" then return {} end
|
|
||||||
str = str..delim
|
|
||||||
local out = {}
|
|
||||||
for m in str:gmatch("(.-)"..delim) do
|
|
||||||
table.insert(out, m)
|
|
||||||
end
|
|
||||||
return out
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
function trim(str)
|
|
||||||
return str:match("^%s*(.-)%s*$")
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
76
moonscript/util.moon
Normal file
76
moonscript/util.moon
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
|
||||||
|
module "moonscript.util", package.seeall
|
||||||
|
|
||||||
|
export moon
|
||||||
|
export pos_to_line, get_closest_line, get_line
|
||||||
|
export reversed, trim, split
|
||||||
|
export dump
|
||||||
|
|
||||||
|
import concat from table
|
||||||
|
|
||||||
|
moon =
|
||||||
|
is_object: (value) -> -- is a moonscript object
|
||||||
|
type(value) == "table" and value.__class
|
||||||
|
type: (value) -> -- the moonscript object class
|
||||||
|
base_type = type value
|
||||||
|
if base_type == "table"
|
||||||
|
cls = value.__class
|
||||||
|
return cls if cls
|
||||||
|
base_type
|
||||||
|
|
||||||
|
-- convet position in text to line number
|
||||||
|
pos_to_line = (str, pos) ->
|
||||||
|
line = 1
|
||||||
|
for _ in str\sub(1, pos)\gmatch("\n")
|
||||||
|
line += 1
|
||||||
|
line
|
||||||
|
|
||||||
|
get_closest_line = (str, line_num) ->
|
||||||
|
line = get_line str, line_num
|
||||||
|
if (not line or trim(line) == "") and line_num > 1
|
||||||
|
get_closest_line(str, line_num - 1)
|
||||||
|
else
|
||||||
|
line, line_num
|
||||||
|
|
||||||
|
get_line = (str, line_num) ->
|
||||||
|
for line in str\gmatch "(.-)[\n$]"
|
||||||
|
return line if line_num == 1
|
||||||
|
line_num -= 1
|
||||||
|
|
||||||
|
reversed = (seq) ->
|
||||||
|
coroutine.wrap ->
|
||||||
|
for i=#seq,1,-1
|
||||||
|
coroutine.yield i, seq[i]
|
||||||
|
|
||||||
|
trim = (str) ->
|
||||||
|
str\match "^%s*(.-)%s*$"
|
||||||
|
|
||||||
|
split = (str, delim) ->
|
||||||
|
return {} if str == ""
|
||||||
|
str ..= delim
|
||||||
|
[m for m in str\gmatch("(.-)"..delim)]
|
||||||
|
|
||||||
|
dump = (what) ->
|
||||||
|
seen = {}
|
||||||
|
_dump = (what, depth=0) ->
|
||||||
|
t = type what
|
||||||
|
if t == "string"
|
||||||
|
'"'..what..'"\n'
|
||||||
|
elseif t == "table"
|
||||||
|
if seen[what]
|
||||||
|
return "recursion("..tostring(what) ..")...\n"
|
||||||
|
seen[what] == true
|
||||||
|
|
||||||
|
depth += 1
|
||||||
|
lines = for k,v in pairs what
|
||||||
|
(" ")\rep(depth*4).."["..tostring(k).."] = ".._dump(v, depth)
|
||||||
|
|
||||||
|
seen[what] = false
|
||||||
|
|
||||||
|
"{\n" .. concat(lines) .. (" ")\rep((depth - 1)*4) .. "}\n"
|
||||||
|
else
|
||||||
|
tostring(what).."\n"
|
||||||
|
|
||||||
|
_dump what
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user