lean4-htt/tests/playground/expander.lean

47 lines
1.6 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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