type term: change display parenthesis to <>, allow \n to as newline character literal
This commit is contained in:
parent
b0f30e9198
commit
52efcfc6c6
1 changed files with 28 additions and 6 deletions
|
@ -9,6 +9,13 @@ use {
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
|
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
|
||||||
pub enum TypeTerm {
|
pub enum TypeTerm {
|
||||||
|
/* TODO: refactor into this:
|
||||||
|
Nominal {
|
||||||
|
id: u64,
|
||||||
|
args: Vec< TypeTerm >
|
||||||
|
},
|
||||||
|
Ladder(Vec< TypeTerm >),
|
||||||
|
*/
|
||||||
Type {
|
Type {
|
||||||
id: u64,
|
id: u64,
|
||||||
args: Vec< TypeLadder >
|
args: Vec< TypeLadder >
|
||||||
|
@ -70,11 +77,24 @@ impl TypeTerm {
|
||||||
|
|
||||||
match f {
|
match f {
|
||||||
Some(f) => {
|
Some(f) => {
|
||||||
if atom.chars().nth(0).unwrap().is_numeric() {
|
let mut chars = atom.chars();
|
||||||
|
let first = chars.next().unwrap();
|
||||||
|
|
||||||
|
if first.is_numeric() {
|
||||||
f.num_arg(i64::from_str_radix(atom, 10).unwrap());
|
f.num_arg(i64::from_str_radix(atom, 10).unwrap());
|
||||||
|
} else if first == '\'' {
|
||||||
|
if let Some(mut c) = chars.next() {
|
||||||
|
if c == '\\' {
|
||||||
|
if let Some('n') = chars.next() {
|
||||||
|
c = '\n';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f.char_arg(c);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
f.arg(TypeTerm::new(
|
f.arg(TypeTerm::new(
|
||||||
names.get(atom).expect(&format!("invalid atom {}", atom)).clone(),
|
names.get(atom)
|
||||||
|
.expect(&format!("invalid atom {}", atom)).clone()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,7 +117,7 @@ impl TypeTerm {
|
||||||
TypeTerm::Type { id, args } => {
|
TypeTerm::Type { id, args } => {
|
||||||
if args.len() > 0 {
|
if args.len() > 0 {
|
||||||
format!(
|
format!(
|
||||||
"({}{})",
|
"<{}{}>",
|
||||||
names[&TypeID::Fun(*id)],
|
names[&TypeID::Fun(*id)],
|
||||||
if args.len() > 0 {
|
if args.len() > 0 {
|
||||||
args.iter().fold(String::new(), |str, term| {
|
args.iter().fold(String::new(), |str, term| {
|
||||||
|
@ -113,6 +133,7 @@ impl TypeTerm {
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeTerm::Num(n) => format!("{}", n),
|
TypeTerm::Num(n) => format!("{}", n),
|
||||||
|
TypeTerm::Char('\n') => format!("'\\n'"),
|
||||||
TypeTerm::Char(c) => format!("'{}'", c),
|
TypeTerm::Char(c) => format!("'{}'", c),
|
||||||
TypeTerm::Var(varid) => format!("T"),
|
TypeTerm::Var(varid) => format!("T"),
|
||||||
}
|
}
|
||||||
|
@ -122,7 +143,7 @@ impl TypeTerm {
|
||||||
pub fn to_str(&self, names: &HashMap<TypeID, String>) -> String {
|
pub fn to_str(&self, names: &HashMap<TypeID, String>) -> String {
|
||||||
match self {
|
match self {
|
||||||
TypeTerm::Type { id, args } => format!(
|
TypeTerm::Type { id, args } => format!(
|
||||||
"( {} {})",
|
"<{}{}>",
|
||||||
names[&TypeID::Fun(*id)],
|
names[&TypeID::Fun(*id)],
|
||||||
if args.len() > 0 {
|
if args.len() > 0 {
|
||||||
args.iter().fold(String::new(), |str, term| {
|
args.iter().fold(String::new(), |str, term| {
|
||||||
|
@ -134,6 +155,7 @@ impl TypeTerm {
|
||||||
),
|
),
|
||||||
|
|
||||||
TypeTerm::Num(n) => format!("{}", n),
|
TypeTerm::Num(n) => format!("{}", n),
|
||||||
|
TypeTerm::Char('\n') => format!("'\\n'"),
|
||||||
TypeTerm::Char(c) => format!("'{}'", c),
|
TypeTerm::Char(c) => format!("'{}'", c),
|
||||||
TypeTerm::Var(varid) => format!("T"),
|
TypeTerm::Var(varid) => format!("T"),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue