1 | !636 |
2 | //!* constructors |
3 | //!class JavaTok |
4 | !L<S> |
5 | !quicknew |
6 | !standard functions |
7 | //!multi-line strings |
8 | !699 // improved multi-line strings |
9 | |
10 | !include #1000353 // class JavaTok |
11 | |
12 | main {
|
13 | static Object in; |
14 | static new (Hash)Map<String, Function> functions; |
15 | |
16 | interface Function {
|
17 | public Object process(Object[] args); |
18 | } |
19 | |
20 | static class Call {
|
21 | String function; |
22 | String[] args; |
23 | |
24 | Object eval() {
|
25 | return functions.get(function).process(args); |
26 | } |
27 | |
28 | public String toString() {
|
29 | new StringBuilder buf; |
30 | for (int i = 0; i < args.length; i++) {
|
31 | if (i != 0) buf.append(", ");
|
32 | buf.append(quote(args[i])); |
33 | } |
34 | return function + "(" + buf + ")";
|
35 | } |
36 | } |
37 | |
38 | psvm {
|
39 | in = [[contains("<all iois>", "<latest ioi>")]];
|
40 | parseAsJavaExpression(); |
41 | |
42 | replaceStringConstant("<all iois>", "#681");
|
43 | replaceStringConstant("<latest ioi>", "#1000384");
|
44 | loadSnippetID1(); |
45 | |
46 | // replace contains(x, y) with contains(toLines(x), y) |
47 | // use standard function "contains(List, Object)" |
48 | |
49 | functions.put("contains", new Function() {
|
50 | public Object process(Object[] args) {
|
51 | return toLinesTrim((String) args[0]).contains(args[1]); |
52 | } |
53 | }); |
54 | |
55 | System.out.println("Result: " + ((Call) in).eval());
|
56 | } |
57 | |
58 | static void parseAsJavaExpression() {
|
59 | L<S> tok = JavaTok.split((String) in); |
60 | new Call c; |
61 | c.function = tok.get(1); |
62 | c.args = new String[] { unquote(tok.get(5)), unquote(tok.get(9)) };
|
63 | in = c; |
64 | } |
65 | |
66 | static void replaceStringConstant(String before, String now) {
|
67 | Call c = (Call) in; |
68 | new Call c2; |
69 | c2.function = c.function; |
70 | c2.args = new String[c.args.length]; |
71 | for (int i = 0; i < c.args.length; i++) |
72 | c2.args[i] = c.args[i].equals(before) ? now : c.args[i]; |
73 | in = c2; |
74 | } |
75 | |
76 | static void loadSnippetID1() tex {
|
77 | Call c = (Call) in; |
78 | new Call c2; |
79 | c2.function = c.function; |
80 | c2.args = new String[c.args.length]; |
81 | System.arraycopy(c.args, 0, c2.args, 0, c.args.length); |
82 | for (int i = 0; i < c.args.length; i++) |
83 | if (c.args[i].startsWith("#") && isSnippetID(c.args[i])) {
|
84 | c2.args[i] = loadSnippet(c.args[i]); |
85 | break; |
86 | } |
87 | in = c2; |
88 | } |
89 | } |
Began life as a copy of #1000392
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, teubizvjbppd, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1000393 |
| Snippet name: | Meta-programming example (implementation) |
| Eternal ID of this version: | #1000393/1 |
| Text MD5: | d611159be06ecba87d3bb8900130f46b |
| Author: | stefan |
| Category: | |
| Type: | JavaX source code |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2015-08-01 18:37:58 |
| Source code size: | 2318 bytes / 89 lines |
| Pitched / IR pitched: | No / Yes |
| Views / Downloads: | 923 / 803 |
| Referenced in: | [show references] |