Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

120
LINES

< > BotCompany Repo | #1000394 // Meta-programming example (implementation, adding automatic clone method)

JavaX source code - run with: x30.jar

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  
!700 // "no exceptions" short hand
10  
11  
!include #1000353 // class JavaTok
12  
13  
main {
14  
  static Object in;
15  
  static new (Hash)Map<String, Function> functions;
16  
  
17  
  interface Function {
18  
    public Object process(Object[] args);
19  
  }
20  
  
21  
  static class Call {
22  
    String function;
23  
    String[] args;
24  
    
25  
    Object eval() {
26  
      return functions.get(function).process(args);
27  
    }
28  
    
29  
    public String toString() {
30  
      new StringBuilder buf;
31  
      for (int i = 0; i < args.length; i++) {
32  
        if (i != 0) buf.append(", ");
33  
        buf.append(quote(args[i]));
34  
      }
35  
      return function + "(" + buf + ")";
36  
    }
37  
  }
38  
  
39  
  psvm {
40  
    in = [[contains("<all iois>", "<latest ioi>")]];
41  
    parseAsJavaExpression();
42  
    
43  
    replaceStringConstant("<all iois>", "#681");
44  
    replaceStringConstant("<latest ioi>", "#1000384");
45  
    loadSnippetID1();
46  
    
47  
    // replace contains(x, y) with contains(toLines(x), y)
48  
    // use standard function "contains(List, Object)"
49  
    
50  
    functions.put("contains", new Function() {
51  
      public Object process(Object[] args) {
52  
        return toLinesTrim((String) args[0]).contains(args[1]);
53  
      }
54  
    });
55  
    
56  
    System.out.println("Result: " + ((Call) in).eval());
57  
  }
58  
  
59  
  static void parseAsJavaExpression() {
60  
    L<S> tok = JavaTok.split((String) in);
61  
    new Call c;
62  
    c.function = tok.get(1);
63  
    c.args = new String[] { unquote(tok.get(5)), unquote(tok.get(9)) };
64  
    in = c;
65  
  }
66  
  
67  
  static void replaceStringConstant(String before, String now) {
68  
    Call c = (Call) clone(in);
69  
    for (int i = 0; i < c.args.length; i++)
70  
      if (c.args[i].equals(before))
71  
        c.args[i] = now;
72  
    in = c;
73  
  }
74  
  
75  
  static void loadSnippetID1() tex {
76  
    Call c = (Call) clone(in);
77  
    for (int i = 0; i < c.args.length; i++)
78  
      if (c.args[i].startsWith("#") && isSnippetID(c.args[i])) {
79  
        c.args[i] = loadSnippet(c.args[i]);
80  
        break;
81  
      }
82  
    in = c;
83  
  }
84  
  
85  
  static Object clone(Object o) no exceptions {
86  
    if (o == null)
87  
      return o;
88  
    
89  
    if (o instanceof List) {
90  
      List l = new ArrayList();
91  
      for (Object x : (List) o)
92  
        l.add(clone(x));
93  
      return l;
94  
    }
95  
    
96  
    if (o instanceof String || o instanceof Number || o instanceof Boolean)
97  
      return o;
98  
      
99  
    if (o instanceof Object[]) {
100  
      Object[] l = (Object[]) o;
101  
      Object[] l2 = l.clone();
102  
      for (int i = 0; i < l.length; i++)
103  
        l2[i] = clone(l[i]);
104  
      return l2;
105  
    }
106  
    
107  
    // TODO: go to superclasses too
108  
    Field[] fields = o.getClass().getDeclaredFields();
109  
    Object clone = o.getClass().newInstance();
110  
    for (Field field : fields) {
111  
      if ((field.getModifiers() & Modifier.STATIC) != 0)
112  
        continue;
113  
      Object value;
114  
      value = field.get(o);
115  
      field.set(clone, clone(value));
116  
    }
117  
    return clone;
118  
  }
119  
  
120  
}

Author comment

Began life as a copy of #1000393

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

Comments [hide]

ID Author/Program Comment Date
1047 stefan TODO: check if it still works (translators have changed) 2015-08-21 18:56:23

add comment

Snippet ID: #1000394
Snippet name: Meta-programming example (implementation, adding automatic clone method)
Eternal ID of this version: #1000394/1
Text MD5: 20b40abb47d667f619f3e3a401833742
Author: stefan
Category:
Type: JavaX source code
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2015-08-02 00:15:35
Source code size: 3050 bytes / 120 lines
Pitched / IR pitched: No / Yes
Views / Downloads: 958 / 844
Referenced in: [show references]