Implement primitive procedure application

This commit is contained in:
2021-05-20 23:18:19 -04:00
parent f4c58cfa02
commit b0bf78a3bd
5 changed files with 92 additions and 21 deletions

View File

@@ -1,8 +1,6 @@
use crate::lexer::Token;
use crate::lexer::Tokens;
#[derive(Debug)]
pub enum Datum {
Boolean(bool),
@@ -10,6 +8,13 @@ pub enum Datum {
Symbol(String),
List(Vec<Datum>),
Procedure(fn(Vec<Datum>) -> Datum),
None,
}
impl Default for Datum {
fn default() -> Self {
Datum::None
}
}
pub fn parse(tokens: Tokens) -> Datum {
@@ -23,14 +28,14 @@ fn parse_datum(tokens: &Tokens, ix: usize) -> (Datum, usize) {
Token::Boolean(b) => (Datum::Boolean(*b), ix + 1),
Token::Number(n) => (Datum::Number(*n), ix + 1),
Token::LeftRoundBracket => parse_list(tokens, ix + 1),
_ => panic!("Unexpected token {:?}", tokens[ix])
_ => panic!("Unexpected token {:?}", tokens[ix]),
}
}
pub fn parse_list(tokens: &Tokens, mut ix: usize) -> (Datum, usize) {
let mut datums = vec![];
// FIXME: will crash when RightRoundBracket is missing
// FIXME: will crash when RightRoundBracket is missing
while tokens[ix] != Token::RightRoundBracket {
let (datum, new_ix) = parse_datum(tokens, ix);
datums.push(datum);