Skip to content

Commit b3649f2

Browse files
committed
Review comments
1 parent cc7f36f commit b3649f2

File tree

1 file changed

+32
-35
lines changed

1 file changed

+32
-35
lines changed

forth/src/lib.rs

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#![feature(try_trait)]
2-
use std::{collections::HashMap, option::NoneError};
3-
use Command::*;
2+
use std::collections::HashMap;
43
use Operator::*;
54

65
pub type Value = i32;
@@ -16,7 +15,7 @@ enum Operator {
1615

1716
#[derive(Debug)]
1817
enum Command {
19-
Dropp, // collides with Rust keyword
18+
Drop, // collides with Rust keyword
2019
Dup,
2120
Swap,
2221
Over,
@@ -31,12 +30,6 @@ pub enum Error {
3130
InvalidWord,
3231
}
3332

34-
impl From<NoneError> for Error {
35-
fn from(_error: NoneError) -> Error {
36-
Error::StackUnderflow
37-
}
38-
}
39-
4033
#[derive(Default, Debug)]
4134
pub struct Forth {
4235
text: String,
@@ -53,12 +46,13 @@ impl Forth {
5346
}
5447

5548
fn filter_words(&mut self) {
56-
self.text = self.text.chars().fold(String::new(), |acc, chr| {
49+
self.text = self.text.chars().fold(String::new(), |mut acc, chr| {
5750
if chr.is_whitespace() || chr.is_control() {
58-
acc + &' '.to_string()
51+
acc.push(' ');
5952
} else {
60-
acc + &chr.to_string()
53+
acc.push(chr)
6154
}
55+
acc
6256
})
6357
}
6458

@@ -69,7 +63,7 @@ impl Forth {
6963
self.eval_digits();
7064
self.eval_operators()?;
7165
self.eval_word_declarations()?;
72-
self.eval_word()?;
66+
self.eval_word();
7367
self.eval_commands()?;
7468
}
7569
Ok(())
@@ -83,8 +77,8 @@ impl Forth {
8377

8478
fn eval_operators(&mut self) -> ForthResult {
8579
while let Some(operator) = self.parse_operator() {
86-
let value2 = self.stack.pop()?;
87-
let value1 = self.stack.pop()?;
80+
let value2 = self.pop_stack()?;
81+
let value1 = self.pop_stack()?;
8882
match operator {
8983
Plus => self.stack.push(value1 + value2),
9084
Minus => self.stack.push(value1 - value2),
@@ -101,43 +95,42 @@ impl Forth {
10195
}
10296

10397
fn eval_word_declarations(&mut self) -> ForthResult {
104-
while let Some(Word((key, value))) = self.parse_word_delcaration()? {
98+
while let Some(Command::Word((key, value))) = self.parse_word_declaration()? {
10599
self.words.insert(key, value);
106100
}
107101
Ok(())
108102
}
109103

110-
fn eval_word(&mut self) -> ForthResult {
104+
fn eval_word(&mut self) {
111105
if let Some(value) = self.parse_word() {
112106
self.text = value;
113107
}
114-
Ok(())
115108
}
116109

117110
fn eval_commands(&mut self) -> ForthResult {
118111
while let Some(command) = self.parse_command()? {
119112
match command {
120-
Swap => {
121-
let value2 = self.stack.pop()?;
122-
let value1 = self.stack.pop()?;
113+
Command::Swap => {
114+
let value2 = self.pop_stack()?;
115+
let value1 = self.pop_stack()?;
123116
self.stack.push(value2);
124117
self.stack.push(value1);
125118
}
126-
Dropp => {
127-
self.stack.pop()?;
119+
Command::Drop => {
120+
self.pop_stack()?;
128121
}
129-
Dup => {
130-
let last = *(self.stack.iter().last()?);
122+
Command::Dup => {
123+
let last = *(self.stack.iter().last().ok_or(Error::StackUnderflow)?);
131124
self.stack.push(last);
132125
}
133-
Over => {
134-
let value2 = self.stack.pop()?;
135-
let value1 = self.stack.pop()?;
126+
Command::Over => {
127+
let value2 = self.pop_stack()?;
128+
let value1 = self.pop_stack()?;
136129
self.stack.push(value1);
137130
self.stack.push(value2);
138131
self.stack.push(value1);
139132
}
140-
Word((key, value)) => {
133+
Command::Word((key, value)) => {
141134
self.words.insert(key, value);
142135
}
143136
}
@@ -213,26 +206,26 @@ impl Forth {
213206
match head.as_str() {
214207
"drop" => {
215208
self.text = tail;
216-
Ok(Some(Dropp))
209+
Ok(Some(Command::Drop))
217210
}
218211
"dup" => {
219212
self.text = tail;
220-
Ok(Some(Dup))
213+
Ok(Some(Command::Dup))
221214
}
222215
"swap" => {
223216
self.text = tail;
224-
Ok(Some(Swap))
217+
Ok(Some(Command::Swap))
225218
}
226219
"over" => {
227220
self.text = tail;
228-
Ok(Some(Over))
221+
Ok(Some(Command::Over))
229222
}
230223
digits if digits.parse::<u32>().is_ok() => Ok(None),
231224
_ => Err(Error::UnknownWord),
232225
}
233226
}
234227

235-
fn parse_word_delcaration(&mut self) -> Result<Option<Command>, Error> {
228+
fn parse_word_declaration(&mut self) -> Result<Option<Command>, Error> {
236229
let input = self.text.clone();
237230
if !input.starts_with(':') {
238231
return Ok(None);
@@ -266,7 +259,7 @@ impl Forth {
266259
.collect();
267260
self.text = rest.trim_left().to_string();
268261

269-
Ok(Some(Word((key.to_lowercase(), value))))
262+
Ok(Some(Command::Word((key.to_lowercase(), value))))
270263
}
271264

272265
fn parse_word(&self) -> Option<String> {
@@ -284,4 +277,8 @@ impl Forth {
284277
.get(&head.to_lowercase())
285278
.and_then(|value| Some(value.to_string() + tail))
286279
}
280+
281+
fn pop_stack(&mut self) -> Result<i32, Error> {
282+
self.stack.pop().ok_or(Error::StackUnderflow)
283+
}
287284
}

0 commit comments

Comments
 (0)