1
- use opener;
2
1
use rand:: seq:: SliceRandom ;
3
2
use regex:: Regex ;
4
3
use std:: collections:: HashMap ;
@@ -13,45 +12,41 @@ use std::time::{Duration, SystemTime, UNIX_EPOCH};
13
12
fn main ( ) {
14
13
// コマンドライン引数を読み込む
15
14
let args = env:: args ( ) . collect :: < Vec < _ > > ( ) ;
16
- if args . len ( ) > 2 {
17
- // ファイルを開く
18
- if let Ok ( code ) = get_file_contents ( args [ 2 ] . clone ( ) ) {
19
- // 実行モードを判定する
20
- if args[ 1 ] . contains ( "d" ) {
15
+ // ファイルを開く
16
+ if let Ok ( code ) = get_file_contents ( args [ 1 ] . clone ( ) ) {
17
+ // 実行モードを判定する
18
+ if args . len ( ) > 2 {
19
+ if args[ 2 ] . contains ( "- d" ) {
21
20
let mut executor = Executor :: new ( Mode :: Debug ) ;
22
21
executor. evaluate_program ( code) ; //デバッグ実行
23
22
} else {
24
23
let mut executor = Executor :: new ( Mode :: Script ) ;
25
24
executor. evaluate_program ( code) ; // スクリプト実行
26
25
}
27
- } else {
28
- println ! ( "エラー! ファイルが見つかりません" )
29
- }
30
- } else if args. len ( ) > 1 {
31
- // ファイルを開く
32
- if let Ok ( code) = get_file_contents ( args[ 1 ] . clone ( ) ) {
26
+ } else if args. len ( ) > 1 {
27
+ // ファイルを開く
33
28
let mut executor = Executor :: new ( Mode :: Script ) ; //デフォルト値はスクリプト実行
34
29
executor. evaluate_program ( code) ;
35
30
} else {
36
- println ! ( "エラー! ファイルが見つかりません" )
37
- }
38
- } else {
39
- // タイトルを表示する
40
- println ! ( "Stack プログラミング言語" ) ;
41
- let mut executor = Executor :: new ( Mode :: Debug ) ;
42
- // REPL実行
43
- loop {
44
- let mut code = String :: new ( ) ;
31
+ // タイトルを表示する
32
+ println ! ( "Stack プログラミング言語" ) ;
33
+ let mut executor = Executor :: new ( Mode :: Debug ) ;
34
+ // REPL実行
45
35
loop {
46
- let inputed = input ( "> " ) ;
47
- code += & format ! ( "{inputed}\n " ) ;
48
- if inputed. is_empty ( ) {
49
- break ;
36
+ let mut code = String :: new ( ) ;
37
+ loop {
38
+ let inputed = input ( "> " ) ;
39
+ code += & format ! ( "{inputed}\n " ) ;
40
+ if inputed. is_empty ( ) {
41
+ break ;
42
+ }
50
43
}
51
- }
52
44
53
- executor. evaluate_program ( code)
45
+ executor. evaluate_program ( code)
46
+ }
54
47
}
48
+ } else {
49
+ println ! ( "エラー! ファイルが見つかりません" )
55
50
}
56
51
}
57
52
@@ -65,7 +60,7 @@ fn get_file_contents(name: String) -> Result<String, Error> {
65
60
66
61
/// 標準入力を受け取る
67
62
fn input ( prompt : & str ) -> String {
68
- print ! ( "{}" , prompt. to_string ( ) ) ;
63
+ print ! ( "{}" , prompt) ;
69
64
io:: stdout ( ) . flush ( ) . unwrap ( ) ;
70
65
let mut result = String :: new ( ) ;
71
66
io:: stdin ( ) . read_line ( & mut result) . ok ( ) ;
@@ -132,10 +127,10 @@ impl Type {
132
127
/// 論理値を取得
133
128
fn get_bool ( & mut self ) -> bool {
134
129
match self {
135
- Type :: String ( s) => s . len ( ) != 0 ,
130
+ Type :: String ( s) => !s . is_empty ( ) ,
136
131
Type :: Number ( i) => * i != 0.0 ,
137
132
Type :: Bool ( b) => * b,
138
- Type :: List ( l) => l . len ( ) != 0 ,
133
+ Type :: List ( l) => !l . is_empty ( ) ,
139
134
}
140
135
}
141
136
@@ -205,11 +200,7 @@ impl Executor {
205
200
206
201
/// 構文解析
207
202
fn analyze_syntax ( & mut self , code : String ) -> Vec < String > {
208
- let code = code
209
- . replace ( "\n " , " " )
210
- . replace ( "\t " , " " )
211
- . replace ( "\r " , " " )
212
- . replace ( " " , " " ) ;
203
+ let code = code. replace ( [ '\n' , '\t' , '\r' , ' ' ] , " " ) ;
213
204
214
205
let mut syntax = Vec :: new ( ) ;
215
206
let mut buffer = String :: new ( ) ;
@@ -319,8 +310,8 @@ impl Executor {
319
310
}
320
311
321
312
// コメントを処理
322
- if token. contains ( "#" ) {
323
- self . log_print ( format ! ( "※ コメント「{}」\n " , token. replace( "#" , "" ) ) ) ;
313
+ if token. contains ( '#' ) {
314
+ self . log_print ( format ! ( "※ コメント「{}」\n " , token. replace( '#' , "" ) ) ) ;
324
315
continue ;
325
316
}
326
317
@@ -518,14 +509,13 @@ impl Executor {
518
509
// 正規表現で検索
519
510
"regex" => {
520
511
let pt = self . pop_stack ( ) . get_string ( ) ;
521
- let patern: Regex ;
522
- match Regex :: new ( pt. as_str ( ) ) {
523
- Ok ( i) => patern = i,
512
+ let patern: Regex = match Regex :: new ( pt. as_str ( ) ) {
513
+ Ok ( i) => i,
524
514
Err ( _) => {
525
515
self . log_print ( "エラー! 正規表現が不正です\n " . to_string ( ) ) ;
526
516
return ;
527
517
}
528
- }
518
+ } ;
529
519
530
520
let text = self . pop_stack ( ) . get_string ( ) ;
531
521
@@ -649,7 +639,7 @@ impl Executor {
649
639
let index = self . pop_stack ( ) . get_number ( ) as usize ;
650
640
let mut list = self . pop_stack ( ) . get_list ( ) ;
651
641
if list. len ( ) > index {
652
- list. remove ( index as usize ) ;
642
+ list. remove ( index) ;
653
643
self . stack . push ( Type :: List ( list) ) ;
654
644
} else {
655
645
self . log_print ( "エラー! インデックス指定が範囲外です\n " . to_string ( ) ) ;
@@ -922,10 +912,8 @@ impl Executor {
922
912
if let Err ( e) = fs:: remove_dir ( name) {
923
913
self . log_print ( format ! ( "エラー! {e}\n " ) )
924
914
}
925
- } else {
926
- if let Err ( e) = fs:: remove_file ( name) {
927
- self . log_print ( format ! ( "エラー! {e}\n " ) )
928
- }
915
+ } else if let Err ( e) = fs:: remove_file ( name) {
916
+ self . log_print ( format ! ( "エラー! {e}\n " ) )
929
917
}
930
918
}
931
919
@@ -937,7 +925,7 @@ impl Executor {
937
925
entry
938
926
. ok ( )
939
927
. and_then ( |e| e. file_name ( ) . into_string ( ) . ok ( ) )
940
- . map ( |x| Type :: String ( x ) )
928
+ . map ( Type :: String )
941
929
} )
942
930
. collect ( ) ;
943
931
self . stack . push ( Type :: List ( value) ) ;
0 commit comments