1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44


use crate::{Identifier, Value};

use alloc::string::{String, ToString};
use alloc::vec::Vec;


pub const MACHINE_NAME: &str = "xasm";


#[derive(Clone, Debug, PartialEq, PartialOrd, Eq, Ord)]
pub enum Error {
    InvalidFunctionName,
}

pub trait Compile<T: Target> {
    fn compile(self) -> Result<String, Error>;
}


pub trait Target {
    fn quote(name: impl ToString) -> String {
        format!("\"{}\"", name.to_string())
    }
    fn push(value: impl ToString) -> String;
    fn load(value: impl ToString) -> String;
    fn store(value: impl ToString) -> String;
    fn number(value: impl ToString) -> String;
    fn string(value: impl ToString) -> String;
    fn copy(value: impl ToString) -> String;
    fn func(value: impl ToString) -> String;
    fn foreign_func(value: impl ToString) -> String;
    fn while_loop(condition: impl ToString, body: impl ToString) -> String;
    fn if_then_else(
        condition: impl ToString,
        then_fn: impl ToString,
        else_fn: impl ToString) -> String;
    fn call(func: impl ToString) -> String;
    fn method_call(method_name: impl ToString) -> String;
    fn assign(pointer_value: impl ToString) -> String;
    fn dotname(head: Value, tail: Vec<Identifier>) -> String;
    fn indexname(head: Value, tail: Vec<Value>) -> String;
}