Mercurial Hosting > luan
annotate core/src/luan/modules/Io.luan @ 422:af82b266fe89
add Io.repr()
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 01 May 2015 16:13:52 -0600 |
parents | 62b457c50594 |
children | 750a68eceb1d |
rev | line source |
---|---|
321
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
1 java() |
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
2 local IoLuan = require "java:luan.modules.IoLuan" |
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
3 local System = require "java:java.lang.System" |
297
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
4 |
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
5 read_console_line = IoLuan.read_console_line |
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
6 schemes = IoLuan.newSchemes() |
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
7 Uri = IoLuan.Uri |
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
8 stdin = IoLuan.defaultStdin.table() |
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
9 socket_server = IoLuan.socket_server |
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
10 stdout = IoLuan.textWriter(System.out) |
899253043270
remove PackageLuan.load_lib()
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
diff
changeset
|
11 stderr = IoLuan.textWriter(System.err) |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
12 |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
13 |
321
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
14 local Luan = require "luan:Luan" |
320
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
15 local to_string = Luan.to_string |
422 | 16 local type = Luan.type |
17 local try = Luan.try | |
18 local ipairs = Luan.ipairs | |
19 local pairs = Luan.pairs | |
321
7f7708e8fdd4
remove import statement
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
320
diff
changeset
|
20 local Table = require "luan:Table" |
320
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
21 |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
22 function print_to(out,...) |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
23 local list = {} |
402 | 24 for v in Luan.values(...) do |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
25 list[#list+1] = to_string(v) |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
26 list[#list+1] = '\t' |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
27 end |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
28 if #list == 0 then |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
29 out.write( '\n' ) |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
30 else |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
31 list[#list] = '\n' |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
32 out.write( Table.unpack(list) ) |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
33 end |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
34 end |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
35 |
320
fed1893821bf
remove global namespace
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
319
diff
changeset
|
36 function print(...) |
298
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
37 print_to(stdout,...) |
2ce23c7e2342
remove init.luan
fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
parents:
297
diff
changeset
|
38 end |
392
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
39 |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
40 |
422 | 41 -- repr |
42 | |
43 local function do_repr(obj,done) | |
44 local tp = type(obj) | |
45 if tp == "table" then | |
46 if done[obj] == true then | |
47 %><circular reference><% | |
48 return | |
49 end | |
50 done[obj] = true | |
51 %>{<% | |
52 local is_first = true | |
53 local in_list = {} | |
54 for key, value in ipairs(obj) do | |
55 if is_first then is_first = false else %>, <% end | |
56 do_repr(value,done) | |
57 in_list[key] = true | |
58 end | |
59 for key, value in pairs(obj) do | |
60 if in_list[key] ~= true then | |
61 if is_first then is_first = false else %>, <% end | |
62 if type(key) == "string" and key.match "^[a-zA-Z_][a-zA-Z_0-9]*$" ~= nil then | |
63 %><%=key%><% | |
64 else | |
65 %>[<%do_repr(key,done)%>]<% | |
66 end | |
67 %>=<% do_repr(value,done) | |
68 end | |
69 end | |
70 %>}<% | |
71 elseif tp == "string" then | |
72 %>"<%=obj.encode()%>"<% | |
73 elseif tp == "nil" or tp == "boolean" or tp == "number" then | |
74 %><%=obj%><% | |
75 else | |
76 %><<%=obj%>><% | |
77 end | |
78 end | |
79 | |
80 function repr(obj) | |
81 local old_out = stdout | |
82 return try { | |
83 function() | |
84 local string_uri = Uri "string:" | |
85 stdout = string_uri.text_writer() | |
86 do_repr(obj,{}) | |
87 stdout.close() | |
88 return string_uri.read_text() | |
89 end; | |
90 finally = function() | |
91 stdout = old_out | |
92 end; | |
93 } | |
94 end | |
95 | |
96 | |
392
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
97 -- useful for SimplyHTML responsiveness |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
98 |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
99 NO = {} |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
100 |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
101 function dont_write_when_no(write_fn) |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
102 return function(...) |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
103 for v in Luan.values(...) do |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
104 if v == NO then |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
105 return |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
106 end |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
107 end |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
108 write_fn(...) |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
109 end |
8668f3799ad9
add Io.dont_write_when_no
Franklin Schmidt <fschmidt@gmail.com>
parents:
321
diff
changeset
|
110 end |