Search in sources :

Example 1 with Intrinsic

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);
}
Also used : IntInt_Bool(suite.node.util.TreeUtil.IntInt_Bool) APPLY(suite.fp.match.Matchers.APPLY) DECONS(suite.fp.match.Matchers.DECONS) Fun(suite.util.FunUtil.Fun) BinOp(suite.util.FunUtil2.BinOp) Node(suite.node.Node) BOOLEAN(suite.fp.match.Matchers.BOOLEAN) VAR(suite.fp.match.Matchers.VAR) Map(java.util.Map) FindUtil(suite.lp.search.FindUtil) RuleSet(suite.lp.kb.RuleSet) NUMBER(suite.fp.match.Matchers.NUMBER) ERROR(suite.fp.match.Matchers.ERROR) IntrinsicCallback(suite.fp.intrinsic.Intrinsics.IntrinsicCallback) TREE(suite.fp.match.Matchers.TREE) IMap(suite.immutable.IMap) FUN(suite.fp.match.Matchers.FUN) To(suite.util.To) Intrinsic(suite.fp.intrinsic.Intrinsics.Intrinsic) Collectors(java.util.stream.Collectors) Matcher(suite.fp.match.Matcher) PRAGMA(suite.fp.match.Matchers.PRAGMA) Tree(suite.node.Tree) UNWRAP(suite.fp.match.Matchers.UNWRAP) IntInt_Int(suite.primitive.IntInt_Int) Iterate(suite.util.FunUtil.Iterate) Pair(suite.adt.pair.Pair) List(java.util.List) Entry(java.util.Map.Entry) Int(suite.node.Int) TreeUtil(suite.node.util.TreeUtil) IF(suite.fp.match.Matchers.IF) SewingProverBuilder2(suite.lp.search.SewingProverBuilder2) Comparer(suite.node.util.Comparer) HashMap(java.util.HashMap) TCO(suite.fp.match.Matchers.TCO) ArrayList(java.util.ArrayList) CONS(suite.fp.match.Matchers.CONS) Data(suite.node.Data) Formatter(suite.node.io.Formatter) Intrinsics(suite.fp.intrinsic.Intrinsics) DEFVARS(suite.fp.match.Matchers.DEFVARS) Suite(suite.Suite) Source(suite.util.FunUtil.Source) Finder(suite.lp.search.ProverBuilder.Finder) Pattern(suite.BindArrayUtil.Pattern) TermOp(suite.node.io.TermOp) ATOM(suite.fp.match.Matchers.ATOM) WRAP(suite.fp.match.Matchers.WRAP) CHARS(suite.fp.match.Matchers.CHARS) Atom(suite.node.Atom) Operator(suite.node.io.Operator) Fail(suite.util.Fail) Str(suite.node.Str) Operator(suite.node.io.Operator) RuleSet(suite.lp.kb.RuleSet) IntrinsicCallback(suite.fp.intrinsic.Intrinsics.IntrinsicCallback) HashMap(java.util.HashMap) Node(suite.node.Node) Finder(suite.lp.search.ProverBuilder.Finder) SewingProverBuilder2(suite.lp.search.SewingProverBuilder2) Data(suite.node.Data) Atom(suite.node.Atom) IntInt_Int(suite.primitive.IntInt_Int) Intrinsic(suite.fp.intrinsic.Intrinsics.Intrinsic) IntInt_Bool(suite.node.util.TreeUtil.IntInt_Bool)

Example 2 with Intrinsic

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;
}
Also used : Frame(suite.instructionexecutor.InstructionUtil.Frame) Node(suite.node.Node) ArrayList(java.util.ArrayList) Activation(suite.instructionexecutor.InstructionUtil.Activation) Atom(suite.node.Atom) Intrinsic(suite.fp.intrinsic.Intrinsics.Intrinsic)

Aggregations

ArrayList (java.util.ArrayList)2 Intrinsic (suite.fp.intrinsic.Intrinsics.Intrinsic)2 Atom (suite.node.Atom)2 Node (suite.node.Node)2 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 Entry (java.util.Map.Entry)1 Collectors (java.util.stream.Collectors)1 Pattern (suite.BindArrayUtil.Pattern)1 Suite (suite.Suite)1 Pair (suite.adt.pair.Pair)1 Intrinsics (suite.fp.intrinsic.Intrinsics)1 IntrinsicCallback (suite.fp.intrinsic.Intrinsics.IntrinsicCallback)1 Matcher (suite.fp.match.Matcher)1 APPLY (suite.fp.match.Matchers.APPLY)1 ATOM (suite.fp.match.Matchers.ATOM)1 BOOLEAN (suite.fp.match.Matchers.BOOLEAN)1 CHARS (suite.fp.match.Matchers.CHARS)1 CONS (suite.fp.match.Matchers.CONS)1