lama_byterun/stdlib/Expr.lama
Dmitry Boulytchev 61296c51e7 Massive renaming
2020-02-16 00:21:15 +03:00

66 lines
1.2 KiB
Text

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)
}