From babfdb879a49bce8e131a9cd8bf6f8142bcff6c9 Mon Sep 17 00:00:00 2001 From: Gabriel Ebner Date: Mon, 25 Oct 2021 11:48:29 +0200 Subject: [PATCH] feat: add aux_def command --- src/Lean/Elab.lean | 1 + src/Lean/Elab/AuxDef.lean | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/Lean/Elab/AuxDef.lean diff --git a/src/Lean/Elab.lean b/src/Lean/Elab.lean index 7b518d0b23..b56422ff40 100644 --- a/src/Lean/Elab.lean +++ b/src/Lean/Elab.lean @@ -24,6 +24,7 @@ import Lean.Elab.Inductive import Lean.Elab.Structure import Lean.Elab.Print import Lean.Elab.MutualDef +import Lean.Elab.AuxDef import Lean.Elab.PreDefinition import Lean.Elab.Deriving import Lean.Elab.DeclarationRange diff --git a/src/Lean/Elab/AuxDef.lean b/src/Lean/Elab/AuxDef.lean new file mode 100644 index 0000000000..fd7cedc7e2 --- /dev/null +++ b/src/Lean/Elab/AuxDef.lean @@ -0,0 +1,32 @@ +/- +Copyright (c) 2021 Microsoft Corporation. All rights reserved. +Released under Apache 2.0 license as described in the file LICENSE. +Authors: Gabriel Ebner +-/ +import Lean.Elab.Command + +namespace Lean.Elab.Command +open Lean.Parser.Command +open Lean.Parser.Term + +/-- +Declares an auxiliary definition with an automatically generated name. +For example, `aux_def foo : Nat := 42` creates a definition +with an internal, unused name based on the suggestion `foo`. +-/ +scoped syntax (name := aux_def) docComment ? attributes ? "aux_def" ident+ ":" term ":=" term : command + +@[builtinCommandElab «aux_def»] +def elabAuxDef : CommandElab + | `($[$doc?:docComment]? $[$attrs?:attributes]? aux_def $[$suggestion:ident]* : $ty := $body) => do + let id := suggestion.map (·.getId.eraseMacroScopes) |>.foldl (· ++ ·) Name.anonymous + let id := `_aux ++ (← getMainModule) ++ `_ ++ id + let id := String.intercalate "_" <| id.components.map (·.toString) + let ns ← getCurrNamespace + -- make sure we only add a single component so that scoped workes + let id ← mkAuxName (ns.mkStr id) 1 + let id := id.replacePrefix ns Name.anonymous -- TODO: replace with def _root_.id + elabCommand <| + ← `($[$doc?:docComment]? $[$attrs?:attributes]? + def $(mkIdent id):ident : $ty := $body) + | _ => throwUnsupportedSyntax