«*»=
# If f is to be used to split patterns, what intervals need to be considered?
procedure intervals(patterns, f)
cuts := set([0, 2^(f.hi - f.lo)])
every p := !patterns & d := !p.disjuncts & c := !d.constraints & c.field === f do
every insert(cuts, c.lo | c.hi)
return sort(cuts)
end
# what fields are mentioned in a case statement?
procedure mentions(cs)
result := set()
every a := !cs.arms & d := !a.pattern.disjuncts & c := !d.constraints do
insert(result, c.field)
return result
end
# find_id: tab to and past identifier id, returning its position
# ignores quotes, comment brackets
procedure find_id(id)
static notlnum
initial notlnum := (&letters ++ &digits ++ '_')
tab(p := find(id)) & p = 1 | (move(-1) & any(notlnum) & move(1)) &
=id & pos(0) | any(notlnum) & suspend p
end
@