aboutsummaryrefslogtreecommitdiff
path: root/src/MoonPlus.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/MoonPlus.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/MoonPlus.h b/src/MoonPlus.h
new file mode 100644
index 0000000..da5f3ac
--- /dev/null
+++ b/src/MoonPlus.h
@@ -0,0 +1,125 @@
1R"moonscript_codes(
2import "moonp"
3import concat, insert, remove from table
4unpack = unpack or table.unpack
5lua = :loadstring, :load
6
7local *
8
9dirsep = "/"
10
11moonp.moon_compiled = {}
12
13split = (str, delim) ->
14 return {} if str == ""
15 str ..= delim
16 [m for m in str\gmatch("(.-)"..delim)]
17
18get_options = (...) ->
19 count = select "#", ...
20 opts = select count, ...
21 if type(opts) == "table"
22 opts, unpack {...}, nil, count - 1
23 else
24 {}, ...
25
26-- create moon path package from lua package path
27create_moonpath = (package_path) ->
28 moonpaths = for path in *split package_path, ";"
29 prefix = path\match "^(.-)%.lua$"
30 continue unless prefix
31 prefix .. ".moon"
32 concat moonpaths, ";"
33
34moon_loader = (name) ->
35 name_path = name\gsub "%.", dirsep
36
37 local file, file_path
38 for path in package.moonpath\gmatch "[^;]+"
39 file_path = path\gsub "?", name_path
40 file = io.open file_path
41 break if file
42
43 if file
44 text = file\read "*a"
45 file\close!
46 res, err = loadstring text, "@#{file_path}"
47 if not res
48 error file_path .. ": " .. err
49
50 return res
51
52 return nil, "Could not find moon file"
53
54
55loadstring = (...) ->
56 options, str, chunk_name, mode, env = get_options ...
57 chunk_name or= "=(moonscript.loadstring)"
58
59 code, err = moonp.to_lua str, options
60 unless code
61 return nil, err
62
63 moonp.moon_compiled[chunk_name] = code if chunk_name
64 -- the unpack prevents us from passing nil
65 (lua.loadstring or lua.load) code, chunk_name, unpack { mode, env }
66
67loadfile = (fname, ...) ->
68 file, err = io.open fname
69 return nil, err unless file
70 text = assert file\read "*a"
71 file\close!
72 loadstring text, "@#{fname}", ...
73
74-- throws errros
75dofile = (...) ->
76 f = assert loadfile ...
77 f!
78
79insert_loader = (pos=2) ->
80 if not package.moonpath
81 package.moonpath = create_moonpath package.path
82
83 loaders = package.loaders or package.searchers
84 for loader in *loaders
85 return false if loader == moon_loader
86
87 insert loaders, pos, moon_loader
88 true
89
90remove_loader = ->
91 loaders = package.loaders or package.searchers
92
93 for i, loader in ipairs loaders
94 if loader == moon_loader
95 remove loaders, i
96 return true
97
98 false
99
100moon_require = (name)->
101 insert_loader!
102 xpcall (-> require name), (err)->
103 msg = moonp.stp.stacktrace err, 2
104 print msg
105
106setmetatable moonp, {
107 __index: (key)=>
108 return nil unless key == "stp"
109 stp = rawget moonp,"stp"
110 unless stp
111 stp = with moonp.load_stacktraceplus!
112 .dump_locals = false
113 .simplified = true
114 rawset moonp,"stp",stp
115 rawset moonp,"load_stacktraceplus",nil
116 stp
117 __call: (name)=> @.require name
118}
119
120moonp[k] = v for k,v in pairs {
121 :insert_loader, :remove_loader, :moon_loader, :dirsep,
122 :dofile, :loadfile, :loadstring, :create_moonpath,
123 require:moon_require
124}
125)moonscript_codes";