mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-01 09:49:24 +03:00
53 lines
1.4 KiB
Idris
53 lines
1.4 KiB
Idris
import Language.Reflection
|
|
|
|
%language ElabReflection
|
|
|
|
logPrims : Elab a
|
|
logPrims
|
|
= do ns <- getType `{{ (++) }}
|
|
traverse_ (\ (n, ty) =>
|
|
do logMsg "" 0 ("Name: " ++ show n)
|
|
logTerm "" 0 "Type" ty) ns
|
|
fail "Not really trying"
|
|
|
|
logDataCons : Elab a
|
|
logDataCons
|
|
= do [(n, _)] <- getType `{{ Nat }}
|
|
| _ => fail "Ambiguous name"
|
|
logMsg "" 0 ("Resolved name: " ++ show n)
|
|
logMsg "" 0 ("Constructors: " ++ show !(getCons n))
|
|
fail "Still not trying"
|
|
|
|
logBad : Elab a
|
|
logBad
|
|
= do [(n, _)] <- getType `{{ DoesntExist }}
|
|
| [] => fail "Undefined name"
|
|
| _ => fail "Ambiguous name"
|
|
logMsg "" 0 ("Resolved name: " ++ show n)
|
|
logMsg "" 0 ("Constructors: " ++ show !(getCons n))
|
|
fail "Still not trying"
|
|
|
|
-- because the exact sequence number in a gensym depends on
|
|
-- the library and compiler internals we need to censor it so the
|
|
-- output won't be overly dependent on the exact versions used.
|
|
censorDigits : String -> String
|
|
censorDigits str = pack $ map (\c => if isDigit c then 'X' else c) (unpack str)
|
|
|
|
tryGenSym : Elab a
|
|
tryGenSym
|
|
= do n <- genSym "plus"
|
|
ns <- inCurrentNS n
|
|
fail $ "failed after generating " ++ censorDigits (show ns)
|
|
|
|
dummy1 : a
|
|
dummy1 = %runElab logPrims
|
|
|
|
dummy2 : a
|
|
dummy2 = %runElab logDataCons
|
|
|
|
dummy3 : a
|
|
dummy3 = %runElab logBad
|
|
|
|
dummy4 : a
|
|
dummy4 = %runElab tryGenSym
|