mirror of
https://github.com/azur1s/bobbylisp.git
synced 2024-10-16 02:37:40 -05:00
refactor: remove messy implementation
This commit is contained in:
parent
aa433b7787
commit
8382f0b5af
|
@ -21,7 +21,6 @@ Hello, World!
|
||||||
```
|
```
|
||||||
|
|
||||||
## <img src="https://raw.githubusercontent.com/azur1s/bobbylisp/master/assets/icon.png" width="25"> Progress:
|
## <img src="https://raw.githubusercontent.com/azur1s/bobbylisp/master/assets/icon.png" width="25"> Progress:
|
||||||
- [X] Lexer & Parser
|
TODO:
|
||||||
- [ ] Syntax checker & Type checker
|
- Quote, Quasiquote, etc.
|
||||||
- [ ] Interpreter
|
- Optimizing
|
||||||
- [X] Compiler
|
|
||||||
|
|
|
@ -46,12 +46,7 @@ impl Compiler {
|
||||||
for c in cdr {
|
for c in cdr {
|
||||||
result.append(&mut self.compile(c, depth + 1)?);
|
result.append(&mut self.compile(c, depth + 1)?);
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
"list" => {
|
|
||||||
let mut joined = Vec::new();
|
|
||||||
for c in cdr { joined.push(c); }
|
|
||||||
result.append(&mut self.compile_quoted(&joined)?);
|
|
||||||
}
|
|
||||||
"if" => {
|
"if" => {
|
||||||
// TODO: Remove .clone()
|
// TODO: Remove .clone()
|
||||||
let mut cond = self.compile(cdr[0].clone(), depth + 1)?;
|
let mut cond = self.compile(cdr[0].clone(), depth + 1)?;
|
||||||
|
@ -211,40 +206,4 @@ impl Compiler {
|
||||||
|
|
||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn compile_quoted(&mut self, atom: &Vec<Sexpr>) -> Result<Vec<Instr>, String> {
|
|
||||||
let mut result = Vec::new();
|
|
||||||
|
|
||||||
// Vec<Sexpr> -> Vec<Type>
|
|
||||||
let mut types = Vec::new();
|
|
||||||
for a in atom {
|
|
||||||
types.push(sexpr_to_type(a)?);
|
|
||||||
}
|
|
||||||
|
|
||||||
result.push(Instr::Push {
|
|
||||||
value: Type::Array(types),
|
|
||||||
label: self.next_label(),
|
|
||||||
});
|
|
||||||
|
|
||||||
Ok(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn sexpr_to_type(sexpr: &Sexpr) -> Result<Type, String> {
|
|
||||||
match sexpr {
|
|
||||||
Int(i) => Ok(Type::Int(*i)),
|
|
||||||
Float(f) => Ok(Type::Float(*f)),
|
|
||||||
Str(s) => Ok(Type::String(s.clone())),
|
|
||||||
Boolean(b) => Ok(Type::Boolean(*b)),
|
|
||||||
Symbol(s) => Ok(Type::String(s.to_string())),
|
|
||||||
Cons(car, cdr) => {
|
|
||||||
let mut array = Vec::new();
|
|
||||||
array.push(sexpr_to_type(car)?);
|
|
||||||
for item in cdr {
|
|
||||||
array.push(sexpr_to_type(item)?);
|
|
||||||
}
|
|
||||||
Ok(Type::Array(array))
|
|
||||||
},
|
|
||||||
_ => unimplemented!(),
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -58,7 +58,8 @@ impl Parser {
|
||||||
match self.peek() {
|
match self.peek() {
|
||||||
Some(s) => match s.as_str() {
|
Some(s) => match s.as_str() {
|
||||||
")" => Err(format!("Unexpected ')' at position {}", self.position)),
|
")" => Err(format!("Unexpected ')' at position {}", self.position)),
|
||||||
"'" => { self.next(); self.parse_quote_sequence(")")},
|
// TODO: Handle quote and that stuff.
|
||||||
|
"'" => { unimplemented!() },
|
||||||
"(" => self.parse_sequence(")"),
|
"(" => self.parse_sequence(")"),
|
||||||
_ => self.parse_atom(),
|
_ => self.parse_atom(),
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
(print "Hello, hello world!")
|
(print "Hello, world!")
|
Loading…
Reference in a new issue