Skip to content

Commit 6fef41d

Browse files
author
梶塚太智
committed
Update main.rs
1 parent c80998b commit 6fef41d

File tree

1 file changed

+25
-37
lines changed

1 file changed

+25
-37
lines changed

src/main.rs

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl Executor {
178178
}
179179
}
180180

181-
/// メモリを表示
181+
/// メモリの変数を表示
182182
fn show_variables(&mut self) {
183183
self.log_print(format!(
184184
"メモリ内部の変数 {{ {} }}\n",
@@ -191,6 +191,7 @@ impl Executor {
191191
));
192192
}
193193

194+
// スタック内部を表示
194195
fn show_stack(&mut self) {
195196
self.log_print(format!(
196197
"Stack〔 {} 〕",
@@ -204,6 +205,7 @@ impl Executor {
204205

205206
/// 構文解析
206207
fn analyze_syntax(&mut self, code: String) -> Vec<String> {
208+
// タブや改行・全角スペースを半角スペースに変換する
207209
let code = code.replace(['\n', '\t', '\r', ' '], " ");
208210

209211
let mut syntax = Vec::new();
@@ -258,37 +260,29 @@ impl Executor {
258260

259261
/// プログラムを評価する
260262
fn evaluate_program(&mut self, code: String) {
261-
// トークンを整える
263+
// 構文解析してトークン列にする
262264
let syntax: Vec<String> = self.analyze_syntax(code);
263265

264266
for token in syntax {
265-
// スタック内部を表示する
266-
self.show_stack();
267+
self.show_stack(); // スタック内部を表示する
267268
self.log_print(format!(" ← {}\n", token));
268269

269-
// 数値に変換できたらスタックに積む
270+
// 加工用の文字ベクタ
271+
let chars: Vec<char> = token.chars().collect();
272+
270273
if let Ok(i) = token.parse::<f64>() {
274+
// 数値に変換できたらスタックに積む
271275
self.stack.push(Type::Number(i));
272-
continue;
273-
}
274-
275-
// 論理値をスタックに積む
276-
if token == "true" || token == "false" {
276+
} else if token == "true" || token == "false" {
277+
// 論理値をスタックに積む
277278
self.stack.push(Type::Bool(token.parse().unwrap_or(true)));
278-
continue;
279-
}
280-
281-
// 文字列をスタックに積む
282-
let chars: Vec<char> = token.chars().collect();
283-
if chars[0] == '(' && chars[chars.len() - 1] == ')' {
279+
} else if chars[0] == '(' && chars[chars.len() - 1] == ')' {
280+
// 文字列をスタックに積む
284281
self.stack
285282
.push(Type::String(token[1..token.len() - 1].to_string()));
286-
continue;
287-
}
288-
289-
// リストを処理
290-
if chars[0] == '[' && chars[chars.len() - 1] == ']' {
291-
let old_len = self.stack.len();
283+
} else if chars[0] == '[' && chars[chars.len() - 1] == ']' {
284+
// リストをスタックに積む
285+
let old_len = self.stack.len(); // 本来のスタックの大きさ
292286
let slice = &token[1..token.len() - 1];
293287
let token: Vec<_> = slice.split_whitespace().map(|x| x.to_string()).collect();
294288
self.evaluate_program(
@@ -298,29 +292,23 @@ impl Executor {
298292
.collect::<Vec<_>>()
299293
.join(" "),
300294
);
295+
// スタックの増加分をリストの要素にする
301296
let mut list = Vec::new();
302297
for _ in old_len..self.stack.len() {
303298
list.push(self.pop_stack());
304299
}
305-
list.reverse();
300+
list.reverse(); // スタックから取り出したのは逆なので反転させる
306301
self.stack.push(Type::List(list));
307-
continue;
308-
}
309-
310-
// 変数を読み込む
311-
if let Some(i) = self.memory.get(&token) {
302+
} else if let Some(i) = self.memory.get(&token) {
303+
// 変数を読み込む
312304
self.stack.push(i.clone());
313-
continue;
314-
}
315-
316-
// コメントを処理
317-
if token.contains('#') {
305+
} else if token.contains('#') {
306+
// コメントを処理
318307
self.log_print(format!("※ コメント「{}」\n", token.replace('#', "")));
319-
continue;
308+
} else {
309+
// コマンドを実行する
310+
self.execute_command(token);
320311
}
321-
322-
// コマンドを実行する
323-
self.execute_command(token);
324312
}
325313

326314
// 実行後のスタックを表示

0 commit comments

Comments
 (0)