tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

consumer_worker_abi.tri (1929B)


      1 -- Descriptor ABI: target defaults and explicit state are separate entry modes.
      2 !import "consumers.lexical-worker" L
      3 !import "consumers.structural" S
      4 !import "prelude" !Local
      5 
      6 rule input state output = S.makeRule input state output
      7 targetIR = S.makeConsumer 11 [(rule S.patAny (S.patCapture 0) (S.outCapture 0))]
      8 target = resultOr t (L.lCompile targetIR)
      9 
     10 -- The caller state (99) is distinct from the target default (11).
     11 stateIR = S.makeConsumer (pair 99 target) [(rule S.patAny
     12   (S.patFork (S.patCapture 0) (S.patCapture 1))
     13   (S.outCall (S.outCapture 1) (S.outLiteral 7) 2 (S.outCapture 2)))]
     14 stateWorker = resultOr t (L.lCompile stateIR)
     15 inputIR = S.makeConsumer 99 [(rule (S.patCapture 0) S.patAny
     16   (S.outCall (S.outCapture 0) (S.outLiteral 7) 1 (S.outCapture 1)))]
     17 inputWorker = resultOr t (L.lCompile inputIR)
     18 
     19 -- An authored literal may be an already prepared worker: do not validate its
     20 -- payload as SCP syntax. The returned worker is then invoked by the caller.
     21 providerIR = S.makeConsumer t [(rule S.patAny S.patAny (S.outLiteral target))]
     22 provider = resultOr t (L.lCompile providerIR)
     23 returnedIR = S.makeConsumer t [(rule S.patAny S.patAny
     24   (S.outCall (S.outLiteral provider) (S.outLiteral t) 0
     25     (S.outCall (S.outCapture 0) (S.outLiteral 7) 1 (S.outCapture 1))))]
     26 returnedWorker = resultOr t (L.lCompile returnedIR)
     27 
     28 checks = foldl and? true [
     29   (L.lWorkerShape? target)
     30   (not? (L.lWorkerShape? t))
     31   (not? (L.lWorkerShape? (pair 0 t)))
     32   (equal? (L.lRunChecked target 7) (ok 11 t))
     33   (equal? (L.lRunOpenChecked target 7 19) (ok 19 t))
     34   (equal? (L.lRunChecked stateWorker 7) (ok 11 t))
     35   (equal? (L.lRunChecked inputWorker target) (ok 11 t))
     36   (equal? (L.lRunChecked returnedWorker 7) (ok 11 t))
     37   (equal? (L.lRunChecked t 7) (err "invalid SCP worker" t))
     38   (equal? (L.lRunOpenChecked t 7 19) (err "invalid SCP worker" t))]
     39 main = matchBool "consumer-worker-abi-ok" "consumer-worker-abi-DIFFER" checks
     40 main