rufus-lua-moon 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 64a42dafd47150d25613181b8f9898f7456e89ce
4
+ data.tar.gz: 22e9a59e022d27df880130803b6fa7a2aad8be10
5
+ SHA512:
6
+ metadata.gz: 602ddba5e7e2abfca7c15ec506332e19ab5ddc7f81a3dc454488ced77b97e6559d9d9381cabbac08dde5cf6a86be575e68155ce7b3a7580a7187e714a0b66b32
7
+ data.tar.gz: ff8982b11792e45e2d21007527d0b0f84a8f1e58fa2e848caf05e9561255450822bc3868de0e36999b8d5e4662dc19b2b24862a0840a88ab35e8ffc86b044c78
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .subversion
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rufus-lua-moon.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Stas Ukolov
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # Rufus::Lua::Moon
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/rufus-lua-moon.svg)](http://badge.fury.io/rb/rufus-lua-moon)
4
+
5
+ Provides MoonScript for Rufus::Lua interpreter
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'rufus-lua-moon'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install rufus-lua-moon
20
+
21
+ ## Usage
22
+
23
+ After creating Rufus::Lua interpreter patch it to support MoonScript:
24
+
25
+ ```ruby
26
+ s=Rufus::Lua::State.new
27
+ s.moon!
28
+ s.eval <<EOL
29
+ m=require "moonscript.base"
30
+ x=m.to_lua "->1"
31
+ print(x)
32
+ EOL
33
+ ```
34
+ You can set `package.moonpath` and require file(s) with moonscript code:
35
+ ```ruby
36
+ s=Rufus::Lua::State.new.moon!
37
+ s.eval <<EOL
38
+ package.moonpath='./?.moon'
39
+ require 'myfile' -- load 'myfile.moon'
40
+ EOL
41
+ ```
42
+
43
+ ## Credits
44
+
45
+ * [Lua](http://www.lua.org/)
46
+ * [MoonScript](http://moonscript.org/)
47
+ * [Rufus::Lua](https://github.com/jmettraux/rufus-lua)
48
+
49
+ ## See also
50
+
51
+ * [Rufus::Lua::Win](https://github.com/ukoloff/rufus-lua-win) if you run Rufus::Lua on Windows
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,12 @@
1
+ module Rufus
2
+ module Lua
3
+ module Moon
4
+ root=File.expand_path '../../../../..', __FILE__
5
+ subV=File.read(File.expand_path '.subversion', root).strip rescue ''
6
+ subV="."+subV.gsub(/\W+/, '.') if subV.length>0
7
+ Path=File.expand_path 'vendor/lua', root
8
+ m=/(["'])(\d+(\.\d+){1,3}(-(?!0)[\da-z])*)\1/i.match File.read File.expand_path 'moonscript/version.lua', Path
9
+ VERSION = m ? m[2].gsub('-', '.')+subV : '0.0.?'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ require "rufus/lua/moon/version"
2
+
3
+ module Rufus
4
+ module Lua
5
+ module Moon
6
+
7
+ end
8
+ class State
9
+ def moon!
10
+ self['package']['path']=
11
+ (['', '/init'].map{|x|File.expand_path "?#{x}.lua", Moon::Path}<<
12
+ self['package']['path'])*';'
13
+ eval 'require "moonscript"'
14
+ self
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rufus/lua/moon/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rufus-lua-moon"
8
+ spec.version = Rufus::Lua::Moon::VERSION
9
+ spec.authors = ["Stas Ukolov"]
10
+ spec.email = ["ukoloff@gmail.com"]
11
+ spec.description = 'Provides MoonScript for Rufus::Lua interpreter'
12
+ spec.summary = ''
13
+ spec.homepage = "https://github.com/ukoloff/rufus-lua-moon"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+
24
+ spec.add_dependency "rufus-lua"
25
+ end
@@ -0,0 +1,8 @@
1
+
2
+ -- insert all moon library functions into requiring scope
3
+
4
+ export moon
5
+ moon = moon or {}
6
+ moon.inject = true
7
+ require "moon.init"
8
+
@@ -0,0 +1,136 @@
1
+
2
+ if not moon or not moon.inject
3
+ module "moon", package.seeall
4
+
5
+ util = require "moonscript.util"
6
+
7
+ lua = { :debug, :type }
8
+
9
+ export *
10
+
11
+ dump = util.dump
12
+
13
+ p = (...) ->
14
+ print dump ...
15
+
16
+ is_object = (value) -> -- is a moonscript object
17
+ lua.type(value) == "table" and value.__class
18
+
19
+ type = (value) -> -- class aware type
20
+ base_type = lua.type value
21
+ if base_type == "table"
22
+ cls = value.__class
23
+ return cls if cls
24
+ base_type
25
+
26
+ debug = setmetatable {
27
+ upvalue: (fn, k, v) ->
28
+ upvalues = {}
29
+ i = 1
30
+ while true
31
+ name = lua.debug.getupvalue(fn, i)
32
+ break if name == nil
33
+ upvalues[name] = i
34
+ i += 1
35
+
36
+ if not upvalues[k]
37
+ error "Failed to find upvalue: " .. tostring k
38
+
39
+ if not v
40
+ _, value = lua.debug.getupvalue fn, upvalues[k]
41
+ value
42
+ else
43
+ lua.debug.setupvalue fn, upvalues[k], v
44
+ }, __index: lua.debug
45
+
46
+ -- run a function with scope injected before its function environment
47
+ run_with_scope = (fn, scope, ...) ->
48
+ old_env = getfenv fn
49
+ env = setmetatable {}, {
50
+ __index: (name) =>
51
+ val = scope[name]
52
+ if val != nil
53
+ val
54
+ else
55
+ old_env[name]
56
+ }
57
+ setfenv fn, env
58
+ fn ...
59
+
60
+ -- wrap obj such that calls to methods do not need a reference to self
61
+ bind_methods = (obj) ->
62
+ setmetatable {}, {
63
+ __index: (name) =>
64
+ val = obj[name]
65
+ if val and lua.type(val) == "function"
66
+ bound = (...) -> val obj, ...
67
+ self[name] = bound
68
+ bound
69
+ else
70
+ val
71
+ }
72
+
73
+ -- use a function to provide default values to table
74
+ -- optionally specify a starting table
75
+ -- fibanocci table:
76
+ -- t = defaultbl {[0]: 0, [1]: 1}, (i) -> self[i - 1] + self[i - 2]
77
+ defaultbl = (t, fn) ->
78
+ if not fn
79
+ fn = t
80
+ t = {}
81
+ setmetatable t, {
82
+ __index: (name) =>
83
+ val = fn self, name
84
+ rawset self, name, val
85
+ val
86
+ }
87
+
88
+ -- chain together tables by __index metatables
89
+ extend = (...) ->
90
+ tbls = {...}
91
+ return if #tbls < 2
92
+
93
+ for i = 1, #tbls - 1
94
+ a = tbls[i]
95
+ b = tbls[i + 1]
96
+
97
+ setmetatable a, __index: b
98
+
99
+ tbls[1]
100
+
101
+ -- shallow copy
102
+ copy = =>
103
+ {key,val for key,val in pairs self}
104
+
105
+ -- mixin class properties into self, call new
106
+ mixin = (cls, ...) =>
107
+ meta = getmetatable cls
108
+ for key, val in pairs meta.__index
109
+ self[key] = val if not key\match"^__"
110
+ cls.__init self, ...
111
+
112
+ -- mixin methods from an object into self
113
+ mixin_object = (object, methods) =>
114
+ for name in *methods
115
+ self[name] = (parent, ...) ->
116
+ object[name](object, ...)
117
+
118
+ -- mixin table values into self
119
+ mixin_table = (tbl, keys) =>
120
+ if keys
121
+ for key in *keys
122
+ self[key] = tbl[key]
123
+ else
124
+ for key, val in pairs tbl
125
+ self[key] = val
126
+
127
+ fold = (items, fn)->
128
+ len = #items
129
+ if len > 1
130
+ accum = fn items[1], items[2]
131
+ for i=3,len
132
+ accum = fn acum, items[i]
133
+ accum
134
+ else
135
+ items[1]
136
+
@@ -0,0 +1,55 @@
1
+ module("moonscript.compile", package.seeall)
2
+ local util = require("moonscript.util")
3
+ local data = require("moonscript.data")
4
+ local Set
5
+ do
6
+ local _table_0 = require("moonscript.data")
7
+ Set = _table_0.Set
8
+ end
9
+ local ntype
10
+ do
11
+ local _table_0 = require("moonscript.types")
12
+ ntype = _table_0.ntype
13
+ end
14
+ local concat, insert = table.concat, table.insert
15
+ indent_char = " "
16
+ user_error = function(...)
17
+ return error({
18
+ "user-error",
19
+ ...
20
+ })
21
+ end
22
+ moonlib = {
23
+ bind = function(tbl, name)
24
+ return concat({
25
+ "moon.bind(",
26
+ tbl,
27
+ ".",
28
+ name,
29
+ ", ",
30
+ tbl,
31
+ ")"
32
+ })
33
+ end
34
+ }
35
+ non_atomic = Set({
36
+ "update"
37
+ })
38
+ has_value = function(node)
39
+ if ntype(node) == "chain" then
40
+ local ctype = ntype(node[#node])
41
+ return ctype ~= "call" and ctype ~= "colon"
42
+ else
43
+ return true
44
+ end
45
+ end
46
+ is_non_atomic = function(node)
47
+ return non_atomic[ntype(node)]
48
+ end
49
+ count_lines = function(str)
50
+ local count = 1
51
+ for _ in str:gmatch("\n") do
52
+ count = count + 1
53
+ end
54
+ return count
55
+ end
@@ -0,0 +1,217 @@
1
+ module("moonscript.compile", package.seeall)
2
+ local util = require("moonscript.util")
3
+ require("moonscript.compile.format")
4
+ local dump = require("moonscript.dump")
5
+ local reversed = util.reversed
6
+ local ntype
7
+ do
8
+ local _table_0 = require("moonscript.types")
9
+ ntype = _table_0.ntype
10
+ end
11
+ local concat, insert = table.concat, table.insert
12
+ line_compile = {
13
+ raw = function(self, node)
14
+ local _, text = unpack(node)
15
+ return self:add(text)
16
+ end,
17
+ declare = function(self, node)
18
+ local _, names = unpack(node)
19
+ local undeclared = self:declare(names)
20
+ if #undeclared > 0 then
21
+ do
22
+ local _with_0 = self:line("local ")
23
+ _with_0:append_list((function()
24
+ local _accum_0 = { }
25
+ local _len_0 = 0
26
+ local _list_0 = names
27
+ for _index_0 = 1, #_list_0 do
28
+ local name = _list_0[_index_0]
29
+ _len_0 = _len_0 + 1
30
+ _accum_0[_len_0] = self:name(name)
31
+ end
32
+ return _accum_0
33
+ end)(), ", ")
34
+ return _with_0
35
+ end
36
+ end
37
+ end,
38
+ assign = function(self, node)
39
+ local _, names, values = unpack(node)
40
+ local undeclared = self:declare(names)
41
+ local declare = "local " .. concat(undeclared, ", ")
42
+ local has_fndef = false
43
+ local i = 1
44
+ while i <= #values do
45
+ if ntype(values[i]) == "fndef" then
46
+ has_fndef = true
47
+ end
48
+ i = i + 1
49
+ end
50
+ do
51
+ local _with_0 = self:line()
52
+ if #undeclared == #names and not has_fndef then
53
+ _with_0:append(declare)
54
+ else
55
+ if #undeclared > 0 then
56
+ self:add(declare)
57
+ end
58
+ _with_0:append_list((function()
59
+ local _accum_0 = { }
60
+ local _len_0 = 0
61
+ local _list_0 = names
62
+ for _index_0 = 1, #_list_0 do
63
+ local name = _list_0[_index_0]
64
+ _len_0 = _len_0 + 1
65
+ _accum_0[_len_0] = self:value(name)
66
+ end
67
+ return _accum_0
68
+ end)(), ", ")
69
+ end
70
+ _with_0:append(" = ")
71
+ _with_0:append_list((function()
72
+ local _accum_0 = { }
73
+ local _len_0 = 0
74
+ local _list_0 = values
75
+ for _index_0 = 1, #_list_0 do
76
+ local v = _list_0[_index_0]
77
+ _len_0 = _len_0 + 1
78
+ _accum_0[_len_0] = self:value(v)
79
+ end
80
+ return _accum_0
81
+ end)(), ", ")
82
+ return _with_0
83
+ end
84
+ end,
85
+ ["return"] = function(self, node)
86
+ return self:line("return ", (function()
87
+ if node[2] ~= "" then
88
+ return self:value(node[2])
89
+ end
90
+ end)())
91
+ end,
92
+ ["break"] = function(self, node)
93
+ return "break"
94
+ end,
95
+ ["if"] = function(self, node)
96
+ local cond, block = node[2], node[3]
97
+ local root
98
+ do
99
+ local _with_0 = self:block(self:line("if ", self:value(cond), " then"))
100
+ _with_0:stms(block)
101
+ root = _with_0
102
+ end
103
+ local current = root
104
+ local add_clause
105
+ add_clause = function(clause)
106
+ local type = clause[1]
107
+ local i = 2
108
+ local next
109
+ if type == "else" then
110
+ next = self:block("else")
111
+ else
112
+ i = i + 1
113
+ next = self:block(self:line("elseif ", self:value(clause[2]), " then"))
114
+ end
115
+ next:stms(clause[i])
116
+ current.next = next
117
+ current = next
118
+ end
119
+ local _list_0 = node
120
+ for _index_0 = 4, #_list_0 do
121
+ cond = _list_0[_index_0]
122
+ add_clause(cond)
123
+ end
124
+ return root
125
+ end,
126
+ ["while"] = function(self, node)
127
+ local _, cond, block = unpack(node)
128
+ local out
129
+ if is_non_atomic(cond) then
130
+ do
131
+ local _with_0 = self:block("while true do")
132
+ _with_0:stm({
133
+ "if",
134
+ {
135
+ "not",
136
+ cond
137
+ },
138
+ {
139
+ {
140
+ "break"
141
+ }
142
+ }
143
+ })
144
+ out = _with_0
145
+ end
146
+ else
147
+ out = self:block(self:line("while ", self:value(cond), " do"))
148
+ end
149
+ out:stms(block)
150
+ return out
151
+ end,
152
+ ["for"] = function(self, node)
153
+ local _, name, bounds, block = unpack(node)
154
+ local loop = self:line("for ", self:name(name), " = ", self:value({
155
+ "explist",
156
+ unpack(bounds)
157
+ }), " do")
158
+ do
159
+ local _with_0 = self:block(loop)
160
+ _with_0:stms(block)
161
+ return _with_0
162
+ end
163
+ end,
164
+ foreach = function(self, node)
165
+ local _, names, exp, block = unpack(node)
166
+ local loop
167
+ do
168
+ local _with_0 = self:line()
169
+ _with_0:append("for ")
170
+ _with_0:append_list((function()
171
+ local _accum_0 = { }
172
+ local _len_0 = 0
173
+ local _list_0 = names
174
+ for _index_0 = 1, #_list_0 do
175
+ local name = _list_0[_index_0]
176
+ _len_0 = _len_0 + 1
177
+ _accum_0[_len_0] = self:name(name)
178
+ end
179
+ return _accum_0
180
+ end)(), ", ")
181
+ _with_0:append(" in ", self:value(exp), " do")
182
+ loop = _with_0
183
+ end
184
+ do
185
+ local _with_0 = self:block(loop)
186
+ _with_0:stms(block)
187
+ return _with_0
188
+ end
189
+ end,
190
+ export = function(self, node)
191
+ local _, names = unpack(node)
192
+ if type(names) == "string" then
193
+ if names == "*" then
194
+ self.export_all = true
195
+ elseif names == "^" then
196
+ self.export_proper = true
197
+ end
198
+ else
199
+ self:declare(names)
200
+ end
201
+ return nil
202
+ end,
203
+ run = function(self, code)
204
+ code:call(self)
205
+ return nil
206
+ end,
207
+ group = function(self, node)
208
+ return self:stms(node[2])
209
+ end,
210
+ ["do"] = function(self, node)
211
+ do
212
+ local _with_0 = self:block()
213
+ _with_0:stms(node[2])
214
+ return _with_0
215
+ end
216
+ end
217
+ }