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

169
LINES

< > BotCompany Repo | #1002774 // class Native (include)

JavaX fragment (include)

1  
// class for linking Java methods to NL
2  
static class Native {
3  
  Lisp snl;
4  
  SNLMatches m;
5  
  SNLMatches trans;
6  
  boolean printExceptions;
7  
  int exceptions;
8  
  L<S> ins, strings;
9  
  
10  
  *() {} // good to have
11  
  
12  
  *(Lisp *snl) {}
13  
  
14  
  // assume it's a Lisp structure from another bot -
15  
  // restructure to import it
16  
  /* *(O o) {
17  
    snl = (Lisp) restructure(o);
18  
  }*/
19  
    
20  
  *(S s) { snl = snlToTree(s); }
21  
22  
  boolean match(S pat) {
23  
    m = new SNLMatches;
24  
    trans = new SNLMatches;
25  
    Lisp tree = snlToTree_cached(pat);
26  
    ins = new L;
27  
    strings = new L;
28  
    tree = findInVariables(tree, ins, strings);
29  
    //print("tree now: " + tree);
30  
    if (!snlMatch2(tree, snl, trans))
31  
      ret false;
32  
    for (S in : ins)
33  
      if (get(in) == null)
34  
        ret false;
35  
    for (S string : strings)
36  
      if (get(string) == null || !get(string).isEmpty())
37  
        ret false;
38  
    ret true;
39  
  }
40  
  
41  
  Lisp findInVariables(Lisp tree, L<S> ins, L<S> strings) {
42  
    if (tree == null) ret tree;
43  
44  
    if (tree.isEmpty()) {
45  
      if (tree.head.startsWith("in S ")) {
46  
        S var = dropPrefix("in S ", tree.head);
47  
        if (startsWithUpperCase(var)) {
48  
          if (!strings.contains(var))
49  
            strings.add(var);
50  
          ret lisp(var);
51  
        }
52  
      }
53  
      
54  
      if (tree.head.startsWith("in ")) {
55  
        S var = dropPrefix("in ", tree.head);
56  
        if (startsWithUpperCase(var)) {
57  
          if (!ins.contains(var))
58  
            ins.add(var);
59  
          ret lisp(var);
60  
        }
61  
      }
62  
      
63  
      ret tree;
64  
    } else {
65  
      // recurse
66  
      Lisp lisp = new Lisp(tree.head);
67  
      for (Lisp child : tree)
68  
        lisp.add(findInVariables(child, ins, strings));
69  
      ret lisp;
70  
    }
71  
  }
72  
  
73  
  Lisp get(S var) {
74  
    Lisp val = trans.get(var);
75  
    if (!isVar(val)) ret val;
76  
    ret getOuter(val.raw());
77  
  }
78  
  
79  
  // if only one in var
80  
  Lisp get() {
81  
    ret get(anyInVar());
82  
  }
83  
84  
  // ditto  
85  
  S str() {
86  
    ret str(anyInVar());
87  
  }
88  
  
89  
  S anyInVar() {
90  
    if (!empty(ins)) ret first(ins);
91  
    ret first(strings);
92  
  }
93  
  
94  
  boolean isVar(Lisp l) {
95  
    ret l != null && l.isEmpty() && startsWithUpperCase(l.raw());
96  
  }
97  
  
98  
  // called from outside native
99  
  Lisp getOuter(S var) {
100  
    ret m.get(var);
101  
  }
102  
  
103  
  // called from inside native
104  
  S str(S var) {
105  
    Lisp val = get(var);
106  
    if (val == null) fail("variable " + quote(var) + " not set");
107  
    if (!val.isEmpty()) fail("variable " + quote(var) + " not a string: " + struct(val));
108  
    ret unquote(val.raw());
109  
  }
110  
  
111  
  S strOuter(S var) {
112  
    Lisp val = getOuter(var);
113  
    if (val == null) fail("variable " + quote(var) + " not set");
114  
    if (!val.isEmpty()) fail("variable " + quote(var) + " not a string: " + struct(val));
115  
    ret unquote(val.raw());
116  
  }
117  
  
118  
  // may throw an exception if variable problem (already set to different value)
119  
  void set(S var, O val) {
120  
    if (val instanceof List) val = structure(val); // TODO
121  
    Lisp lisp = val instanceof Lisp ? (Lisp) val : lisp(quote(main.str(val)));
122  
    Lisp outer = trans.get(var);
123  
    if (isVar(outer)) {
124  
      if (!m.put(trans.raw(var), lisp))
125  
        fail();
126  
    } else
127  
      if (!eq(lisp, outer)) {
128  
        //print("neq " + lisp + " != " + outer);
129  
        fail();
130  
      }
131  
  }
132  
  
133  
  boolean callExternal(O bot) {
134  
    try {
135  
      O copy = newObject(main.getClass(bot, "main$Native"), quickExport(snl, bot));
136  
      //O copy = quickExport(this, bot);
137  
      if (!isTrue(callOpt(bot, "yo", copy)))
138  
        ret false;
139  
        
140  
      m = (SNLMatches) quickImport(main.get(copy, "m"));
141  
      ret true;
142  
    } catch (Exception e) {
143  
      handle(e);
144  
      ret false;
145  
    }
146  
  }
147  
  
148  
  boolean callExternal(Method yo) {
149  
    try {
150  
      Class c = yo.getDeclaringClass();
151  
      //print("Declaring class: " + c + " (" + identityHashCode(c) + ")");
152  
      O copy = newObject(main.getClass(c, "main$Native"), quickExport(snl, c));
153  
      if (!isTrue(yo.invoke(null, copy)))
154  
        ret false;
155  
        
156  
      m = (SNLMatches) quickImport(main.get(copy, "m"));
157  
      ret true;
158  
    } catch (Exception e) {
159  
      handle(e);
160  
      ret false;
161  
    }
162  
  }
163  
  
164  
  void handle(Throwable t) {
165  
    if (printExceptions)
166  
      printStackTrace(t);
167  
    ++exceptions;
168  
  }
169  
}

download  show line numbers  debug dex  old transpilations   

Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, onxytkatvevr, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt

No comments. add comment

Snippet ID: #1002774
Snippet name: class Native (include)
Eternal ID of this version: #1002774/4
Text MD5: f5482417f092686a9e48129c662587da
Author: stefan
Category: javax
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2018-05-02 09:08:32
Source code size: 4310 bytes / 169 lines
Pitched / IR pitched: No / No
Views / Downloads: 777 / 1939
Version history: 3 change(s)
Referenced in: [show references]