Mercurial Hosting > luan
comparison src/luan/modules/BasicLuan.java @ 775:1a68fc55a80c
simplify dir structure
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 26 Aug 2016 14:36:40 -0600 |
parents | core/src/luan/modules/BasicLuan.java@b21d82ee5756 |
children | 60661a8e738c |
comparison
equal
deleted
inserted
replaced
774:3e30cf310e56 | 775:1a68fc55a80c |
---|---|
1 package luan.modules; | |
2 | |
3 import java.io.InputStreamReader; | |
4 import java.io.IOException; | |
5 import java.lang.reflect.Method; | |
6 import java.util.Iterator; | |
7 import java.util.Map; | |
8 import java.util.List; | |
9 import java.util.ArrayList; | |
10 import luan.Luan; | |
11 import luan.LuanState; | |
12 import luan.LuanTable; | |
13 import luan.LuanFunction; | |
14 import luan.LuanException; | |
15 import luan.LuanMethod; | |
16 import luan.LuanMeta; | |
17 | |
18 | |
19 public final class BasicLuan { | |
20 | |
21 public static String type(Object obj) { | |
22 return Luan.type(obj); | |
23 } | |
24 | |
25 public static LuanFunction load(String text,String sourceName,LuanTable env) | |
26 throws LuanException | |
27 { | |
28 Utils.checkNotNull(text); | |
29 Utils.checkNotNull(sourceName,1); | |
30 return Luan.load(text,sourceName,env); | |
31 } | |
32 | |
33 public static LuanFunction load_file(LuanState luan,String fileName) throws LuanException { | |
34 if( fileName == null ) { | |
35 fileName = "stdin:"; | |
36 } else if( fileName.indexOf(':') == -1 ) { | |
37 fileName = "file:" + fileName; | |
38 } | |
39 String src = PackageLuan.read(luan,fileName); | |
40 if( src == null ) | |
41 throw new LuanException("file '"+fileName+"' not found" ); | |
42 return load(src,fileName,null); | |
43 } | |
44 | |
45 public static LuanFunction pairs(final LuanState luan,final LuanTable t) throws LuanException { | |
46 Utils.checkNotNull(t); | |
47 return t.pairs(luan); | |
48 } | |
49 | |
50 public static LuanFunction ipairs(final LuanTable t) throws LuanException { | |
51 Utils.checkNotNull(t); | |
52 return new LuanFunction() { | |
53 List<Object> list = t.asList(); | |
54 int i = 0; | |
55 final int size = list.size(); | |
56 | |
57 @Override public Object[] call(LuanState luan,Object[] args) { | |
58 if( i >= size ) | |
59 return LuanFunction.NOTHING; | |
60 Object val = list.get(i++); | |
61 return new Object[]{i,val}; | |
62 } | |
63 }; | |
64 } | |
65 | |
66 public static Object get_metatable(LuanTable table) throws LuanException { | |
67 Utils.checkNotNull(table); | |
68 LuanTable metatable = table.getMetatable(); | |
69 if( metatable == null ) | |
70 return null; | |
71 Object obj = metatable.rawGet("__metatable"); | |
72 return obj!=null ? obj : metatable; | |
73 } | |
74 | |
75 public static void set_metatable(LuanTable table,LuanTable metatable) throws LuanException { | |
76 Utils.checkNotNull(table); | |
77 if( table.getHandler("__metatable") != null ) | |
78 throw new LuanException("cannot change a protected metatable"); | |
79 table.setMetatable(metatable); | |
80 } | |
81 | |
82 public static boolean raw_equal(Object v1,Object v2) { | |
83 return v1 == v2 || v1 != null && v1.equals(v2); | |
84 } | |
85 | |
86 public static Object raw_get(LuanTable table,Object index) { | |
87 return table.rawGet(index); | |
88 } | |
89 | |
90 public static void raw_set(LuanTable table,Object index,Object value) { | |
91 table.rawPut(index,value); | |
92 } | |
93 | |
94 public static int raw_len(Object v) throws LuanException { | |
95 if( v instanceof String ) { | |
96 String s = (String)v; | |
97 return s.length(); | |
98 } | |
99 if( v instanceof LuanTable ) { | |
100 LuanTable t = (LuanTable)v; | |
101 return t.rawLength(); | |
102 } | |
103 throw new LuanException( "bad argument #1 to 'raw_len' (table or string expected)" ); | |
104 } | |
105 | |
106 public static String to_string(LuanState luan,Object v) throws LuanException { | |
107 return luan.toString(v); | |
108 } | |
109 | |
110 public static LuanTable new_error(LuanState luan,Object msg) throws LuanException { | |
111 String s = luan.toString(msg); | |
112 LuanTable tbl = new LuanException(s).table(); | |
113 tbl.rawPut( "message", msg ); | |
114 return tbl; | |
115 } | |
116 | |
117 public static String assert_string(String v) throws LuanException { | |
118 Utils.checkNotNull(v); | |
119 return v; | |
120 } | |
121 | |
122 public static Number assert_number(Number v) throws LuanException { | |
123 Utils.checkNotNull(v); | |
124 return v; | |
125 } | |
126 | |
127 public static LuanTable assert_table(LuanTable v) throws LuanException { | |
128 Utils.checkNotNull(v); | |
129 return v; | |
130 } | |
131 | |
132 public static boolean assert_boolean(boolean v) throws LuanException { | |
133 return v; | |
134 } | |
135 | |
136 public static int assert_integer(int v) throws LuanException { | |
137 return v; | |
138 } | |
139 | |
140 public static long assert_long(long v) throws LuanException { | |
141 return v; | |
142 } | |
143 | |
144 public static double assert_double(double v) throws LuanException { | |
145 return v; | |
146 } | |
147 | |
148 @LuanMethod public static byte[] assert_binary(byte[] v) throws LuanException { | |
149 Utils.checkNotNull(v); | |
150 return v; | |
151 } | |
152 | |
153 public static LuanFunction assert_function(LuanFunction v) throws LuanException { | |
154 Utils.checkNotNull(v); | |
155 return v; | |
156 } | |
157 | |
158 public static LuanFunction range(final double from,final double to,Double stepV) throws LuanException { | |
159 final double step = stepV==null ? 1.0 : stepV; | |
160 if( step == 0.0 ) | |
161 throw new LuanException("bad argument #3 (step may not be zero)"); | |
162 return new LuanFunction() { | |
163 double v = from; | |
164 | |
165 @Override public Object call(LuanState luan,Object[] args) { | |
166 if( step > 0.0 && v > to || step < 0.0 && v < to ) | |
167 return LuanFunction.NOTHING; | |
168 double rtn = v; | |
169 v += step; | |
170 return rtn; | |
171 } | |
172 }; | |
173 } | |
174 | |
175 public static LuanFunction values(final Object... args) throws LuanException { | |
176 return new LuanFunction() { | |
177 int i = 0; | |
178 | |
179 @Override public Object call(LuanState luan,Object[] unused) { | |
180 if( i >= args.length ) | |
181 return LuanFunction.NOTHING; | |
182 return args[i++]; | |
183 } | |
184 }; | |
185 } | |
186 | |
187 private LuanFunction fn(Object obj) { | |
188 return obj instanceof LuanFunction ? (LuanFunction)obj : null; | |
189 } | |
190 | |
191 public static Object try_(LuanState luan,LuanTable blocks,Object... args) throws LuanException { | |
192 Utils.checkNotNull(blocks); | |
193 Object obj = blocks.get(luan,1); | |
194 if( obj == null ) | |
195 throw new LuanException("missing 'try' value"); | |
196 if( !(obj instanceof LuanFunction) ) | |
197 throw new LuanException("bad 'try' value (function expected, got "+Luan.type(obj)+")"); | |
198 LuanFunction tryFn = (LuanFunction)obj; | |
199 LuanFunction catchFn = null; | |
200 obj = blocks.get(luan,"catch"); | |
201 if( obj != null ) { | |
202 if( !(obj instanceof LuanFunction) ) | |
203 throw new LuanException("bad 'catch' value (function expected, got "+Luan.type(obj)+")"); | |
204 catchFn = (LuanFunction)obj; | |
205 } | |
206 LuanFunction finallyFn = null; | |
207 obj = blocks.get(luan,"finally"); | |
208 if( obj != null ) { | |
209 if( !(obj instanceof LuanFunction) ) | |
210 throw new LuanException("bad 'finally' value (function expected, got "+Luan.type(obj)+")"); | |
211 finallyFn = (LuanFunction)obj; | |
212 } | |
213 try { | |
214 return tryFn.call(luan,args); | |
215 } catch(LuanException e) { | |
216 if( catchFn == null ) | |
217 throw e; | |
218 return catchFn.call(luan,new Object[]{e.table()}); | |
219 } finally { | |
220 if( finallyFn != null ) | |
221 finallyFn.call(luan); | |
222 } | |
223 } | |
224 | |
225 @LuanMethod public static Object[] pcall(LuanState luan,LuanFunction f,Object... args) { | |
226 try { | |
227 Object[] r = Luan.array(f.call(luan,args)); | |
228 Object[] rtn = new Object[r.length+1]; | |
229 rtn[0] = true; | |
230 for( int i=0; i<r.length; i++ ) { | |
231 rtn[i+1] = r[i]; | |
232 } | |
233 return rtn; | |
234 } catch(LuanException e) { | |
235 return new Object[]{false,e.table()}; | |
236 } | |
237 } | |
238 | |
239 public static String number_type(Number v) throws LuanException { | |
240 Utils.checkNotNull(v); | |
241 return v.getClass().getSimpleName().toLowerCase(); | |
242 } | |
243 | |
244 } |