import Ostap; import List; import Fun; public fun left (f) { fun (c, x) { fun (y) { f (c (x), y) } } } public fun right (f) { fun (c, x) { fun (y) { c (f (x, y)) } } } --- ops -> fun (x, y) {x `op` y} fun altl (level) { case level of [assoc, ps] -> local assfun = case assoc of Left -> left | Right -> right | Nona -> left esac; case map (fun (p) { case p of [op, sema] -> op @ lift(assfun (sema)) esac }, ps) of p : ps -> foldl (infix |, p, ps) esac esac } public fun expr (ops, opnd) { fun inner (ops) { case ops of {} -> fun (c) {opnd @ c} | level : tl -> local lops = altl (level), next = inner (tl); case level.fst of Nona -> fun this (c) { next (id) |> fun (l) {lops |> fun (op) {next (id) @ fun (r) {c (op)(id, l)(r)}}} | next (id) @ c } this | _ -> fun this (c) { next (id) |> fun (l) {lops |> fun (op) {this (op (c, l))}} | next (id) @ c } this esac esac } inner (ops) }