Initial version of environment model
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
use crate::lexer::Token;
|
||||
use crate::lexer::Tokens;
|
||||
|
||||
#[derive(Debug)]
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Datum {
|
||||
Boolean(bool),
|
||||
Number(i64),
|
||||
@@ -11,6 +11,10 @@ pub enum Datum {
|
||||
Unspecified,
|
||||
}
|
||||
|
||||
pub fn make_symbol(s: &str) -> Datum {
|
||||
Datum::Symbol(s.to_string())
|
||||
}
|
||||
|
||||
impl Default for Datum {
|
||||
fn default() -> Self {
|
||||
Datum::Unspecified
|
||||
@@ -35,12 +39,14 @@ fn parse_datum(tokens: &Tokens, ix: usize) -> (Datum, usize) {
|
||||
pub fn parse_list(tokens: &Tokens, mut ix: usize) -> (Datum, usize) {
|
||||
let mut datums = vec![];
|
||||
|
||||
// FIXME: will crash when RightRoundBracket is missing
|
||||
while tokens[ix] != Token::RightRoundBracket {
|
||||
while ix < tokens.len() && tokens[ix] != Token::RightRoundBracket {
|
||||
let (datum, new_ix) = parse_datum(tokens, ix);
|
||||
datums.push(datum);
|
||||
ix = new_ix;
|
||||
}
|
||||
if ix == tokens.len() {
|
||||
panic!("PARSE_LIST -- missing closing bracket {:?}", tokens)
|
||||
}
|
||||
|
||||
(Datum::List(datums), ix + 1)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user