@kha I have added support for opaque constants to the old C++ frontend, and made sure the new frontend can still parse `library/init/core.lean`. The kernel should enforce that opaque constants are really opaque, and the following example should fail ``` constant x : nat := 0 theorem foo : x = 0 := rfl ``` If it doesn't, it is a bug. Here are some remaining issues: 1- `environment.mk_empty` is currently an axiom because we cannot create an inhabitant of an opaque type. A possible solution is to use `option environment` instead of `environment`. 2- There is no support for opaque constants in the new frontend. However, I modified it to handle axioms, and fixed the literal values with decl_cmd_kind. I tried to mark some of my changes with comments, but it is probably much easier for you to just check the commit change list. 3- I did not add any support for automatically constructing `e` at `constant x : t := e`. I think we can do this later after we replace the old frontend with the new one. BTW, it took only a few minutes to provide the inhabitants manually.
17 lines
591 B
Text
17 lines
591 B
Text
/-
|
||
Copyright (c) 2019 Sebastian Ullrich. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Author: Sebastian Ullrich
|
||
-/
|
||
prelude
|
||
import init.lean.position init.io
|
||
|
||
namespace lean
|
||
|
||
/-- Print and accumulate run time of `act` when option `profiler` is set to `true`. -/
|
||
@[extern 5 "lean_lean_profileit"]
|
||
constant profileit {α : Type} (category : @& string) (pos : @& position) (act : io α) : io α := act
|
||
def profileit_pure {α : Type} (category : string) (pos : position) (fn : unit → α) : io α :=
|
||
profileit category pos $ io.lazy_pure fn
|
||
|
||
end lean
|