blob: ee021238dda7b62f45e0eafdde78ea7c139589fd [file] [edit]
import init.lean.expander
open Lean
open Lean.Parser
open Lean.Expander
def prof {α : Type} (msg : String) (p : IO α) : IO α :=
let msg₁ := "Time for '" ++ msg ++ "':" in
let msg₂ := "Memory usage for '" ++ msg ++ "':" in
allocprof msg₂ (timeit msg₁ p)
def node : SyntaxNodeKind := ⟨`node⟩
def leaf : SyntaxNodeKind := ⟨`leaf⟩
def node.arity := 4
def mkStx : ℕ → Syntax
| 0 := Syntax.mkNode leaf []
| (n+1) := Syntax.mkNode node $ (List.replicate node.arity Syntax.missing).map (λ _, mkStx n)
def cfg : FrontendConfig := {filename := "foo", fileMap := FileMap.fromString "", input := ""}
def test (transformers : List (Name × transformer)) (stx : Syntax) : IO Unit :=
match expand stx {cfg with transformers := RBMap.fromList transformers _} with
| Except.ok _ := pure ()
| Except.error e := throw e.toString
def testNoOp := test []
def testNoExp := test [(`node, λ stx, noExpansion)]
def testSimple := test [(`node, λ stx, match stx.asNode with
| some n := pure $ Syntax.mkNode ⟨`node2⟩ n.args
| none := pure Syntax.missing)]
-- direct transformation, no hygiene system
partial def toNode2 : Syntax → Syntax
| (Syntax.rawNode ⟨kind, as, scopes⟩) := Syntax.rawNode ⟨⟨`node2⟩, as.map toNode2, scopes⟩
| other := other
def testToNode2 (stx : Syntax) : IO Syntax := pure $ toNode2 stx
def main (xs : List String) : IO Unit := do
let stx := mkStx 11, --xs.head.toNat,
prof "testNoOp" $ testNoOp stx,
prof "testNoExp" $ testNoExp stx,
prof "testSimple" $ testSimple stx,
prof "testToNode2" $ testToNode2 stx,
pure ()