lean4-htt/library/init/lean/name_mangling.lean
Leonardo de Moura 55626ba60d chore(library/init/lean): disable new frontend for now
We are going to start making drastic changes in the parser,
elaborator, attributes, etc. Examples:
- No View objects. I am going to implement match_syntax.
- No RecT in the parser. I am going to implement parser extensions
using an approach similar to the one I used to implement environment
extensions.
- No Parsec. I will use an approach similar to the one used in the
experiment https://github.com/leanprover/lean4/tree/master/tests/playground/parser

It is easier to perform these changes with the new frontend disabled.
I will slowly re-active it as I apply the changes.

cc @kha
2019-06-05 15:26:43 -07:00

50 lines
1.5 KiB
Text

/-
Copyright (c) 2018 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
-/
prelude
import init.lean.name
namespace Lean
private def String.mangleAux : Nat → String.Iterator → String → String
| 0 it r := r
| (i+1) it r :=
let c := it.curr in
if c.isAlpha || c.isDigit then
String.mangleAux i it.next (r.push c)
else if c = '_' then
String.mangleAux i it.next (r ++ "__")
else if c.toNat < 255 then
let n := c.toNat in
let r := r ++ "_x" in
let r := r.push $ Nat.digitChar (n / 16) in
let r := r.push $ Nat.digitChar (n % 16) in
String.mangleAux i it.next r
else
let n := c.toNat in
let r := r ++ "_u" in
let r := r.push $ Nat.digitChar (n / 4096) in
let n := n % 4096 in
let r := r.push $ Nat.digitChar (n / 256) in
let n := n % 256 in
let r := r.push $ Nat.digitChar (n / 16) in
let r := r.push $ Nat.digitChar (n % 16) in
String.mangleAux i it.next r
def String.mangle (s : String) : String :=
String.mangleAux s.length s.mkIterator ""
private def Name.mangleAux : Name → String
| Name.anonymous := ""
| (Name.mkString p s) :=
let m := String.mangle s in
match p with
| Name.anonymous := m
| _ := Name.mangleAux p ++ "_" ++ m
| (Name.mkNumeral p n) := Name.mangleAux p ++ "_" ++ toString n ++ "_"
def Name.mangle (n : Name) (pre : String := "l_") : String :=
pre ++ Name.mangleAux n
end Lean