@@ -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