1pub mod text;
4pub mod interpreter;
5pub mod types;
6pub mod runner;
7
8use hyperon_atom::*;
9use hyperon_macros::*;
10use hyperon_atom::gnd::str::atom_to_string;
11use crate::space::grounding::GroundingSpace;
12
13pub const ATOM_TYPE_UNDEFINED : Atom = metta_const!(%Undefined%);
14pub const ATOM_TYPE_TYPE : Atom = metta_const!(Type);
15pub const ATOM_TYPE_ATOM : Atom = metta_const!(Atom);
16pub const ATOM_TYPE_SYMBOL : Atom = metta_const!(Symbol);
17pub const ATOM_TYPE_VARIABLE : Atom = metta_const!(Variable);
18pub const ATOM_TYPE_EXPRESSION : Atom = metta_const!(Expression);
19pub const ATOM_TYPE_GROUNDED : Atom = metta_const!(Grounded);
20
21pub const HAS_TYPE_SYMBOL : Atom = metta_const!(:);
22pub const SUB_TYPE_SYMBOL : Atom = metta_const!(:<);
23pub const EQUAL_SYMBOL : Atom = metta_const!(=);
24pub const ARROW_SYMBOL : Atom = metta_const!(->);
25pub const ERROR_SYMBOL : Atom = metta_const!(Error);
26pub const BAD_TYPE_SYMBOL : Atom = metta_const!(BadType);
27pub const BAD_ARG_TYPE_SYMBOL : Atom = metta_const!(BadArgType);
28pub const INCORRECT_NUMBER_OF_ARGUMENTS_SYMBOL : Atom = metta_const!(IncorrectNumberOfArguments);
29pub const NOT_REDUCIBLE_SYMBOL : Atom = metta_const!(NotReducible);
30pub const STACK_OVERFLOW_SYMBOL : Atom = metta_const!(StackOverflow);
31pub const NO_RETURN_SYMBOL : Atom = metta_const!(NoReturn);
32
33pub const EMPTY_SYMBOL : Atom = metta_const!(Empty);
34
35pub const EVAL_SYMBOL : Atom = metta_const!(eval);
36pub const EVALC_SYMBOL : Atom = metta_const!(evalc);
37pub const CHAIN_SYMBOL : Atom = metta_const!(chain);
38pub const UNIFY_SYMBOL : Atom = metta_const!(unify);
39pub const DECONS_ATOM_SYMBOL : Atom = metta_const!(decons-atom);
40pub const CONS_ATOM_SYMBOL : Atom = metta_const!(cons-atom);
41pub const FUNCTION_SYMBOL : Atom = metta_const!(function);
42pub const RETURN_SYMBOL : Atom = metta_const!(return);
43pub const COLLAPSE_BIND_SYMBOL : Atom = metta_const!(collapse-bind);
44pub const SUPERPOSE_BIND_SYMBOL : Atom = metta_const!(superpose-bind);
45
46pub const METTA_SYMBOL : Atom = metta_const!(metta);
47pub const CALL_NATIVE_SYMBOL : Atom = metta_const!(call-native);
48pub const CONTEXT_SPACE_SYMBOL : Atom = metta_const!(context-space);
49
50pub const UNIT_ATOM: Atom = metta_const!(());
51pub const UNIT_TYPE: Atom = metta_const!((->));
52
53pub fn error_atom(err_atom: Option<Atom>, err_code: Option<Atom>, message: String) -> Atom {
55 let err_atom = match err_atom {
56 Some(err_atom) => err_atom,
57 None => EMPTY_SYMBOL,
58 };
59 if let Some(err_code) = err_code {
60 Atom::expr([ERROR_SYMBOL, err_atom, err_code, Atom::sym(message)])
61 } else {
62 Atom::expr([ERROR_SYMBOL, err_atom, Atom::sym(message)])
63 }
64}
65
66pub fn atom_is_error(atom: &Atom) -> bool {
68 match atom {
69 Atom::Expression(expr) => {
70 expr.children().len() > 0 && expr.children()[0] == ERROR_SYMBOL
71 },
72 _ => false,
73 }
74}
75
76pub fn atom_error_message(atom: &Atom) -> String {
80 const PANIC_STR: &str = "Atom is not error expression";
81 match atom {
82 Atom::Expression(expr) => {
83 let sym_atom = match expr.children().len() {
84 3 => expr.children().get(2).unwrap(),
85 4 => expr.children().get(3).unwrap(),
86 _ => panic!("{}", PANIC_STR)
87 };
88 atom_to_string(sym_atom)
89 },
90 _ => panic!("{}", PANIC_STR)
91 }
92}
93
94#[cfg(test)]
95mod tests {
96 use super::*;
97
98 #[test]
99 fn unit_type() {
100 assert_eq!(UNIT_ATOM, Atom::expr([]));
101 assert_eq!(UNIT_TYPE, Atom::expr([ARROW_SYMBOL]));
102 }
103}