use of suite.fp.intrinsic.Intrinsics.Intrinsic in project suite by stupidsing.
the class InterpretFunEager method eager.
public Node eager(Node node) {
Node mode = isLazyify ? Atom.of("LAZY") : Atom.of("EAGER");
Node query = Suite.substitute("source .in, fc-process-function .0 .in .out, sink .out", mode);
RuleSet rs = Suite.newRuleSet(List.of("auto.sl", "fc/fc.sl"));
Finder finder = new SewingProverBuilder2().build(rs).apply(query);
Node parsed = FindUtil.collectSingle(finder, node);
IntrinsicCallback ic = isLazyify ? lazyIntrinsicCallback() : Intrinsics.eagerIntrinsicCallback;
Map<String, Node> df = new HashMap<>();
df.put(TermOp.AND___.name, f2((a, b) -> Tree.of(TermOp.AND___, a, b)));
df.put("+call%i-t1", f1(i -> fn(1, l -> Data.<Intrinsic>get(i).invoke(ic, l))));
df.put("+call%i-t2", f1(i -> fn(2, l -> Data.<Intrinsic>get(i).invoke(ic, l))));
df.put("+call%i-t3", f1(i -> fn(3, l -> Data.<Intrinsic>get(i).invoke(ic, l))));
df.put("+call%i-v1", f1(i -> fn(1, l -> Data.<Intrinsic>get(i).invoke(ic, l))));
df.put("+call%i-v2", f1(i -> fn(2, l -> Data.<Intrinsic>get(i).invoke(ic, l))));
df.put("+call%i-v3", f1(i -> fn(3, l -> Data.<Intrinsic>get(i).invoke(ic, l))));
df.put("+compare", f2((a, b) -> Int.of(Comparer.comparer.compare(a, b))));
df.put("+get%i", f1(a -> new Data<>(Intrinsics.intrinsics.get(((Atom) a).name.split("!")[1]))));
df.put("+is-list", f1(a -> b(Tree.decompose(a) != null)));
df.put("+is-pair", f1(a -> b(Tree.decompose(a) != null)));
df.put("+lcons", f2((a, b) -> Tree.of(TermOp.OR____, a, b)));
df.put("+lhead", f1(a -> Tree.decompose(a).getLeft()));
df.put("+ltail", f1(a -> Tree.decompose(a).getRight()));
df.put("+pcons", f2((a, b) -> Tree.of(TermOp.AND___, a, b)));
df.put("+pleft", f1(a -> Tree.decompose(a).getLeft()));
df.put("+pright", f1(a -> Tree.decompose(a).getRight()));
for (Entry<Operator, IntInt_Bool> e : TreeUtil.boolOperations.entrySet()) {
IntInt_Bool fun = e.getValue();
df.put(e.getKey().getName(), f2((a, b) -> b(fun.apply(compare(a, b), 0))));
}
for (Entry<Operator, IntInt_Int> e : TreeUtil.intOperations.entrySet()) {
IntInt_Int fun = e.getValue();
df.put(e.getKey().getName(), f2((a, b) -> Int.of(fun.apply(i(a), i(b)))));
}
List<String> keys = df.keySet().stream().sorted().collect(Collectors.toList());
Eager_ eager0 = new Eager_(0, IMap.empty());
Frame frame = new Frame(null);
for (String key : keys) {
eager0 = eager0.put(Atom.of(key));
frame.add(df.get(key));
}
return eager0.eager_(parsed).apply(frame);
}
use of suite.fp.intrinsic.Intrinsics.Intrinsic in project suite by stupidsing.
the class FunInstructionExecutor method handle.
@Override
protected void handle(Exec exec, Instruction insn) {
Activation current = exec.current;
Frame frame = current.frame;
Object[] regs = frame != null ? frame.registers : null;
Object[] ds = exec.stack;
int dsp = exec.sp;
Node n0, n1, result;
Data<?> data;
switch(insn.insn) {
case CALLINTRINSIC_:
data = (Data<?>) ds[--dsp];
List<Node> ps = new ArrayList<>(3);
for (int i = 1; i < insn.op1; i++) ps.add((Node) ds[--dsp]);
result = Data.<Intrinsic>get(data).invoke(intrinsicCallback, ps);
break;
case COMPARE_______:
n0 = (Node) ds[--dsp];
n1 = (Node) ds[--dsp];
result = Int.of(comparer.compare(n0, n1));
break;
case CONSLIST______:
n0 = (Node) ds[--dsp];
n1 = (Node) ds[--dsp];
result = Tree.of(TermOp.OR____, n0, n1);
break;
case CONSPAIR______:
n0 = (Node) ds[--dsp];
n1 = (Node) ds[--dsp];
result = Tree.of(TermOp.AND___, n0, n1);
break;
case DATACHARS_____:
result = new Data<>(To.chars(((Str) regs[insn.op1]).value));
break;
case GETINTRINSIC__:
Atom atom = (Atom) ds[--dsp];
String intrinsicName = atom.name.split("!")[1];
result = new Data<>(Intrinsics.intrinsics.get(intrinsicName));
break;
case HEAD__________:
result = Tree.decompose((Node) ds[--dsp]).getLeft();
break;
case ISCONS________:
result = atom(Tree.decompose((Node) ds[--dsp]) != null);
break;
case TAIL__________:
result = Tree.decompose((Node) ds[--dsp]).getRight();
break;
default:
result = Fail.t("unknown instruction " + insn);
}
exec.sp = dsp;
regs[insn.op0] = result;
}
Aggregations