src/Pure/General/long_name.ML
author wenzelm
Sat, 15 Mar 2014 12:51:14 +0100
changeset 56162 ea6303e2261b
parent 56023 f252a315c26e
child 56800 b904ea8edd73
permissions -rw-r--r--
clarified completion ordering: prefer local names;

(*  Title:      Pure/General/long_name.ML
    Author:     Makarius

Long names.
*)

signature LONG_NAME =
sig
  val separator: string
  val is_qualified: string -> bool
  val hidden: string -> string
  val is_hidden: string -> bool
  val localN: string
  val is_local: string -> bool
  val implode: string list -> string
  val explode: string -> string list
  val append: string -> string -> string
  val qualification: string -> int
  val qualify: string -> string -> string
  val qualifier: string -> string
  val base_name: string -> string
  val map_base_name: (string -> string) -> string -> string
end;

structure Long_Name: LONG_NAME =
struct

val separator = ".";
val is_qualified = exists_string (fn s => s = separator);

fun hidden name = "??." ^ name;
val is_hidden = String.isPrefix "??.";

val localN = "local";
val is_local = String.isPrefix "local.";

val implode = space_implode separator;
val explode = space_explode separator;

fun append name1 "" = name1
  | append "" name2 = name2
  | append name1 name2 = name1 ^ separator ^ name2;

fun qualification "" = 0
  | qualification name = fold_string (fn s => s = separator ? Integer.add 1) name 1;

fun qualify qual name =
  if qual = "" orelse name = "" then name
  else qual ^ separator ^ name;

fun qualifier "" = ""
  | qualifier name = implode (#1 (split_last (explode name)));

fun base_name "" = ""
  | base_name name = List.last (explode name);

fun map_base_name _ "" = ""
  | map_base_name f name =
      let val names = explode name
      in implode (nth_map (length names - 1) f names) end;

end;