ruby-japanize 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +16 -0
  3. data/Gemfile +13 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +1459 -0
  6. data/Rakefile +88 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/lib/japanize/base.rb +652 -0
  10. data/lib/japanize/container.rb +213 -0
  11. data/lib/japanize/core.rb +194 -0
  12. data/lib/japanize/enum.rb +127 -0
  13. data/lib/japanize/errors.rb +79 -0
  14. data/lib/japanize/globals.rb +109 -0
  15. data/lib/japanize/io.rb +388 -0
  16. data/lib/japanize/names.rb +213 -0
  17. data/lib/japanize/num.rb +319 -0
  18. data/lib/japanize/process.rb +318 -0
  19. data/lib/japanize/string.rb +257 -0
  20. data/lib/japanize/syntax.rb +805 -0
  21. data/lib/japanize/sys.rb +174 -0
  22. data/lib/japanize/test_unit.rb +99 -0
  23. data/lib/japanize/thread.rb +143 -0
  24. data/lib/japanize/time.rb +82 -0
  25. data/lib/japanize/version.rb +12 -0
  26. data/lib/japanize.rb +24 -0
  27. data/ruby-japanize.gemspec +41 -0
  28. data/sample/README.md +33 -0
  29. data/sample/dir.rb +15 -0
  30. data/sample/eval.rb +48 -0
  31. data/sample/export.rb +44 -0
  32. data/sample/fact.rb +17 -0
  33. data/sample/fib.rb +13 -0
  34. data/sample/freq.rb +17 -0
  35. data/sample/fullpath.rb +29 -0
  36. data/sample/less.rb +19 -0
  37. data/sample/list.rb +86 -0
  38. data/sample/list2.rb +22 -0
  39. data/sample/list3.rb +23 -0
  40. data/sample/mine.rb +204 -0
  41. data/sample/mkproto.rb +33 -0
  42. data/sample/mpart.rb +48 -0
  43. data/sample/occur.rb +17 -0
  44. data/sample/occur2.rb +17 -0
  45. data/sample/philos.rb +57 -0
  46. data/sample/pi.rb +20 -0
  47. data/sample/rcs.dat +17 -0
  48. data/sample/rcs.rb +45 -0
  49. data/sample/sieve.rb +17 -0
  50. data/sample/time.rb +14 -0
  51. data/sample/trojan.rb +18 -0
  52. data/sample/uumerge.rb +47 -0
  53. metadata +164 -0
data/sample/export.rb ADDED
@@ -0,0 +1,44 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # メソッドの可視性
6
+ # 出力:
7
+ # 甲乙
8
+ # 甲
9
+
10
+ 組(:甲) {
11
+ 公開 :整形して印字
12
+ 定義(:丙) {
13
+ 印字 "丙\n"
14
+ }
15
+ 秘密 :丙
16
+
17
+ 定義(:丁) {
18
+ 印字 "丁の中で"
19
+ 丙()
20
+ }
21
+ }
22
+
23
+ 定義(:甲乙) {
24
+ 印字 "甲乙\n"
25
+ }
26
+
27
+ ある甲 = 甲.新規
28
+ #甲.秘密 :整形して印字
29
+ 組(:甲) {
30
+ 公開 :甲乙 # 甲乙の可視性を再定義
31
+ }
32
+ ある甲.甲乙
33
+ ある甲.整形して印字 "%s\n", 甲
34
+
35
+ ある甲.丁
36
+
37
+ 組(:乙, 原型: 甲) {
38
+ 定義(:丁) {
39
+ super() # superは日本語化できなかった
40
+ 丙()
41
+ }
42
+ }
43
+
44
+ 乙.新規.丁
data/sample/fact.rb ADDED
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ 定義(:階乗) {|ある数|
6
+ もし条件が{ ある数 == 0 }.であるなら{
7
+ 1
8
+ }.でなければ{
9
+ 階乗 = 1
10
+ ある数.降順(1) {|数|
11
+ 階乗 *= 数
12
+ }
13
+ 階乗
14
+ }.である
15
+ }
16
+
17
+ 印字 階乗(スクリプトの引数[0].整数に変換), "\n"
data/sample/fib.rb ADDED
@@ -0,0 +1,13 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ 定義(:フィボナッチ数) {|ある数|
6
+ もし条件が{ ある数 < 2 }.であるなら{
7
+ ある数
8
+ }.でなければ{
9
+ フィボナッチ数(ある数 - 2) + フィボナッチ数(ある数 - 1)
10
+ }.である
11
+ }
12
+
13
+ 印字 フィボナッチ数(20), "\n"
data/sample/freq.rb ADDED
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # 単語の出現回数を一覧で表示する
6
+ # 使い方: ruby freq.rb ファイル..
7
+ 行 = 無値 # 繰り返しの条件がスコープを作るので、あらかじめ局所変数を初期化しておく必要がある
8
+ 出現回数 = 連想配列.新規(0)
9
+ この条件なら{ 行 = 行を取得 }.繰り返す{
10
+ 行.走査(/[[:word:]]+/) {|単語|
11
+ 出現回数[単語] += 1
12
+ }
13
+ }
14
+
15
+ 出現回数.キーの一覧.整列.個別に{|単語|
16
+ 印字 単語, " -- ", 出現回数[単語], "\n"
17
+ }
@@ -0,0 +1,29 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # ls-lRのファイル名を完全なパスに変換
6
+
7
+ ファイルへの経路 = 無値 # 肯否分岐がスコープを作るので、あらかじめ局所変数を初期化しておく
8
+ もし条件が{ スクリプトの引数[0] =~ /-p/ }.であるなら{
9
+ スクリプトの引数.先頭から取り出す
10
+ ファイルへの経路 = スクリプトの引数.先頭から取り出す
11
+ }.である
12
+
13
+ もし条件が{ ファイルへの経路 == 無値 }.であるなら{
14
+ ファイルへの経路 = ""
15
+ }.もし条件が{ ファイルへの経路 !~ %r|/$| }.であるなら{
16
+ ファイルへの経路 += "/"
17
+ }.である
18
+
19
+ 行 = 無値 # 繰り返しの条件がスコープを作るので、あらかじめ局所変数を初期化しておく
20
+ この条件なら{ 行 = 行を取得 }.繰り返す{
21
+ この値が{
22
+
23
+ }.もし{ /:$/ }.であるなら{
24
+ ファイルへの経路 = 行.末尾を切り落す.末尾を切り落す + "/"
25
+ }.もし{ /^total/ }.か{ /^d/ }.であるなら{
26
+ }.もし{ /^(.*\d )(.+)$/ }.であるなら{|正規表現が最後に一致した結果| # 条件分岐は $~ にアクセスできないので、結果を手続きの引数で受け取る
27
+ 印字(正規表現が最後に一致した結果[1], ファイルへの経路, 正規表現が最後に一致した結果[2], "\n")
28
+ }
29
+ }
data/sample/less.rb ADDED
@@ -0,0 +1,19 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ 日本語の定数 :伸長コマンド, "/usr/bin/zcat"
6
+ 日本語の定数 :閲覧コマンド, "/usr/bin/less"
7
+
8
+ あるファイル = スクリプトの引数.取り出す
9
+ 選択肢の一覧 = もし条件が{ スクリプトの引数.長さ == 0 }.であるなら{ "" }.でなければ{ スクリプトの引数.結合(" ") }.である
10
+
11
+ もし条件が{ あるファイル =~ /\.(Z|gz)$/ }.であるなら{
12
+ 外部のプログラムを上書き実行する(整形("%s %s | %s %s", 伸長コマンド, あるファイル, 閲覧コマンド, 選択肢の一覧))
13
+ }.もし条件が{ あるファイル == 無値 }.であるなら{
14
+ 外部のプログラムを上書き実行する(整形("%s %s", 閲覧コマンド, 選択肢の一覧))
15
+ }.でなければ{
16
+ 印字(整形("%s %s %s", 閲覧コマンド, 選択肢の一覧, あるファイル), "\n")
17
+ 外部のプログラムを上書き実行する(整形("%s %s %s", 閲覧コマンド, 選択肢の一覧, あるファイル))
18
+ }.である
19
+ 終了()
data/sample/list.rb ADDED
@@ -0,0 +1,86 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # 連結リストの例
6
+
7
+ 組(:私家版の要素) {
8
+ # 物の初期化は 組#新規 から呼ばれる
9
+ 定義(:初期化) {|項目|
10
+ # @変数 は生成物の変数、宣言は不要
11
+ @情報 = 項目
12
+ @次 = 無値
13
+ }
14
+
15
+ 定義(:情報) {
16
+ @情報
17
+ }
18
+
19
+ 定義(:次) {
20
+ @次
21
+ }
22
+
23
+ # この操作は ``物.次 = 値'' で起動される
24
+ 定義(:次=) {|新しい要素|
25
+ @次 = 新しい要素
26
+ }
27
+ }
28
+
29
+ 組(:私家版のリスト) {
30
+ 定義(:リストに追加する) {|ある物|
31
+ 要素 = 私家版の要素.新規(ある物)
32
+ もし条件が{ @先頭 }.であるなら{
33
+ @末尾.次 = 要素
34
+ }.でなければ{
35
+ @先頭 = 要素
36
+ }.である
37
+ @末尾 = 要素
38
+ }
39
+
40
+ 定義(:個別に) {|&塊|
41
+ 要素 = @先頭
42
+ この条件なら{ 要素 }.繰り返す{
43
+ 塊[要素]
44
+ 要素 = 要素.次
45
+ }
46
+ }
47
+
48
+ # この操作は物を文字列に変換する。
49
+ # 再定義すると印字に影響する。
50
+ 定義(:文字列に変換) {
51
+ ある文字列 = "<私家版のリスト:\n"
52
+ 個別に{|要素|
53
+ # ``ある文字列 = ある文字列 + 要素.情報.文字列に変換 + "\n"''の短縮形
54
+ ある文字列 += 要素.情報.文字列に変換 + "\n"
55
+ }
56
+ ある文字列 += ">"
57
+ ある文字列
58
+ }
59
+ }
60
+
61
+ 組(:点) {
62
+ 定義(:初期化) {|x, y|
63
+ @x = x; @y = y
64
+ 自分
65
+ }
66
+
67
+ 定義(:文字列に変換) {
68
+ 文字列に整形("%d@%d", @x, @y)
69
+ }
70
+ }
71
+
72
+ # 大域変数の名前は`$'で始まる
73
+ $リスト1 = 私家版のリスト.新規
74
+ $リスト1.リストに追加する(10)
75
+ $リスト1.リストに追加する(20)
76
+ $リスト1.リストに追加する(点.新規(2, 3))
77
+ $リスト1.リストに追加する(点.新規(4, 5))
78
+ $リスト2 = 私家版のリスト.新規
79
+ $リスト2.リストに追加する(20)
80
+ $リスト2.リストに追加する(点.新規(4, 5))
81
+ $リスト2.リストに追加する($リスト1)
82
+
83
+ # 操作の引数の前後の括弧は曖昧でなければ省略できる
84
+ 印字 "リスト1:\n", $リスト1, "\n"
85
+ 印字 "リスト2:\n", $リスト2, "\n"
86
+
data/sample/list2.rb ADDED
@@ -0,0 +1,22 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # 連結リスト(?)の例 -- 短縮版
6
+
7
+ 組(:点) {
8
+ 定義(:初期化) {|x, y|
9
+ @x = x; @y = y
10
+ 自分
11
+ }
12
+
13
+ 定義(:文字列に変換) {
14
+ 文字列に整形("%d@%d", @x, @y)
15
+ }
16
+ }
17
+
18
+ リスト1 = [10, 20, 点.新規(2, 3), 点.新規(4, 5)]
19
+ リスト2 = [20, 点.新規(4, 5), リスト1]
20
+ 印字("リスト1:\n", リスト1.結合("\n"), "\n")
21
+ 印字("リスト2:\n", リスト2.結合("\n"), "\n")
22
+
data/sample/list3.rb ADDED
@@ -0,0 +1,23 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # 連結リスト(?)の例 -- 短縮版
6
+ # 検査を使う
7
+
8
+ 組(:点) {
9
+ 定義(:初期化) {|x, y|
10
+ @x = x; @y = y
11
+ 自分
12
+ }
13
+
14
+ 定義(:文字列に変換) {
15
+ 文字列に整形("%d@%d", @x, @y)
16
+ }
17
+ }
18
+
19
+ リスト1 = [10, 20, 点.新規(2, 3), 点.新規(4, 5)]
20
+ リスト2 = [20, 点.新規(4, 5), リスト1]
21
+ 印字("リスト1: ", リスト1.検査, "\n")
22
+ 印字("リスト2: ", リスト2.検査, "\n")
23
+
data/sample/mine.rb ADDED
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ require 'japanize'
5
+
6
+ 組(:ゲーム盤) {
7
+ 定義(:消去) {
8
+ 印字 "\e[2J"
9
+ }
10
+
11
+ 定義(:位置) {|横, 縦|
12
+ 整形して印字 "\e[%d;%dH", 縦 + 1, 横 * 2 + 1
13
+ }
14
+
15
+ 定義(:色付きの文字列) {|色の番号, ある文字列|
16
+ 整形して印字 "\e[%dm%s\e[0m", 色の番号, ある文字列
17
+ }
18
+
19
+ 定義(:配置) {|横, 縦, 色の番号, ある文字列|
20
+ 位置(横, 縦); 色付きの文字列(色の番号, ある文字列) # 引数の 色の番号 を使ってないバグを直した
21
+ 位置(0, @縦幅); 印字 "残り:", @印の残数, "/", @未開の残数, " "
22
+ 位置(横, 縦)
23
+ }
24
+
25
+ 秘密 :消去, :位置, :色付きの文字列, :配置
26
+
27
+ # 日本語の定数の実態はクラスメソッドなので、インスタンスメソッドから
28
+ # 参照するときは 生成元:: を付ける必要がある
29
+ 日本語の定数 :登場人物, [ "・", "1", "2", "3", "4", "5", "6", "7", "8", "★", "●", "@@" ]
30
+ 日本語の定数 :配色, [ 46, 43, 45 ] # 既定, 開いた, 終わった
31
+
32
+ 定義(:初期化) {|縦幅, 横幅, 爆弾の数|
33
+ @縦幅 = 縦幅; @横幅 = 横幅; @爆弾の数 = 爆弾の数
34
+ 最初からやり直す
35
+ }
36
+
37
+ 定義(:最初からやり直す) {
38
+ 乱数の種を設定
39
+ @横の現在地 = 0; @縦の現在地 = 0; @印の残数 = @爆弾の数
40
+ @終わった = 偽値
41
+ @情報 = 配列.新規(@縦幅 * @横幅)
42
+ @状態 = 配列.新規(@縦幅 * @横幅)
43
+ @未開の残数 = @縦幅 * @横幅
44
+ @未開の残数.回{|数| @情報[数] = 0 }
45
+ @爆弾の数.回{
46
+ 循環{|制御|
47
+ 位置 = 乱数(@未開の残数 - 1)
48
+ もし条件が{ @情報[位置] == 0 }.であるなら{
49
+ @情報[位置] = 1
50
+ 制御.終わる
51
+ }.である
52
+ }
53
+ }
54
+ 消去; 位置(0, 0)
55
+ @縦幅.回{|縦| 位置(0, 縦); 色付きの文字列(生成元::配色[0], 生成元::登場人物[0] * @横幅) }
56
+ 位置(@横の現在地, @縦の現在地)
57
+ }
58
+
59
+ 定義(:印を付ける) {
60
+ 領域{|制御|
61
+ もし条件が{ @状態[@横幅 * @縦の現在地 + @横の現在地] != 無値 }.であるなら{ 制御.戻る }.である
62
+ @状態[@横幅 * @縦の現在地 + @横の現在地] = :印
63
+ @印の残数 -= 1
64
+ @未開の残数 -= 1
65
+ 配置(@横の現在地, @縦の現在地, 生成元::配色[1], 生成元::登場人物[9])
66
+ }
67
+ }
68
+
69
+ 定義(:開く) {|横=@横の現在地, 縦=@縦の現在地|
70
+ # 爆弾があればゲームオーバー
71
+ 領域{|制御|
72
+ もし条件が{ @状態[@横幅 * 縦 + 横] == :開 }.であるなら{ 制御.戻る }.である # 意味の無い戻り値を消した
73
+ もし条件が{ @状態[@横幅 * 縦 + 横] == 無値 }.であるなら{ @未開の残数 -= 1 }.である
74
+ もし条件が{ @状態[@横幅 * 縦 + 横] == :印 }.であるなら{ @印の残数 += 1 }.である
75
+ @状態[@横幅 * 縦 + 横] = :開
76
+ もし条件が{ 取得(横, 縦) == 1 }.であるなら{ @終わった = 真値 }.である
77
+ 数 = 数える(横, 縦)
78
+ 配置(横, 縦, 生成元::配色[1], 生成元::登場人物[数])
79
+ もし条件が{ 数 != 0 }.であるなら{ 制御.戻る }.である
80
+ もし条件が{ 横 > 0 && 縦 > 0 }.であるなら{ 開く(横 - 1, 縦 - 1) }.である
81
+ もし条件が{ 縦 > 0 }.であるなら{ 開く(横, 縦 - 1) }.である
82
+ もし条件が{ 横 < @横幅 - 1 && 縦 > 0 }.であるなら{ 開く(横 + 1, 縦 - 1) }.である
83
+ もし条件が{ 横 > 0 }.であるなら{ 開く(横 - 1, 縦 ) }.である
84
+ もし条件が{ 横 < @横幅 - 1 }.であるなら{ 開く(横 + 1, 縦 ) }.である
85
+ もし条件が{ 横 > 0 && 縦 < @縦幅 - 1 }.であるなら{ 開く(横 - 1, 縦 + 1) }.である
86
+ もし条件が{ 縦 < @縦幅 - 1 }.であるなら{ 開く(横, 縦 + 1) }.である
87
+ もし条件が{ 横 < @横幅 - 1 && 縦 < @縦幅 - 1 }.であるなら{ 開く(横 + 1, 縦 + 1) }.である
88
+ 位置(@横の現在地, @縦の現在地)
89
+ }
90
+ }
91
+
92
+ 定義(:取得) {|横, 縦|
93
+ # (横,縦)の位置の爆弾の数(0または1)を返す
94
+ もし条件が{ 横 < 0 }.であるなら{
95
+ 0
96
+ }.もし条件が{ 横 >= @横幅 }.であるなら{
97
+ 0
98
+ }.もし条件が{ 縦 < 0 }.であるなら{
99
+ 0
100
+ }.もし条件が{ 縦 >= @縦幅 }.であるなら{
101
+ 0
102
+ }.でなければ{
103
+ @情報[縦 * @横幅 + 横]
104
+ }.である
105
+ }
106
+
107
+ 定義(:数える) {|横, 縦|
108
+ # (横,縦)に隣接する爆弾の数を返す
109
+ [ 取得(横 - 1, 縦 - 1), 取得(横, 縦 - 1), 取得(横 + 1, 縦 - 1),
110
+ 取得(横 - 1, 縦 ), 取得(横 + 1, 縦 ),
111
+ 取得(横 - 1, 縦 + 1), 取得(横, 縦 + 1), 取得(横 + 1, 縦 + 1)
112
+ ].合計
113
+ }
114
+
115
+ 定義(:終わる) {|勝った|
116
+ 中断する
117
+ もし条件が{ 勝った }.でなければ{
118
+ 位置(@縦の現在地, @横の現在地); 印字 生成元::登場人物[11]
119
+ }.である
120
+ 位置(0, @縦幅)
121
+ もし条件が{ 勝った }.であるなら{
122
+ 印字 "*** 勝ちました !! ***"
123
+ }.でなければ{
124
+ 印字 "*** 負けました ***"
125
+ }.である
126
+ }
127
+
128
+ 秘密 :取得, :数える, :終わる # 外部から参照しない操作を秘密に変えた
129
+
130
+ 定義(:終わったか?) {
131
+ # 終了処理も呼び出す
132
+ 余りが無い = (@印の残数 + @未開の残数 == 0)
133
+ もし条件が{ @終わった || 余りが無い }.であるなら{
134
+ 終わる(余りが無い)
135
+ 真値
136
+ }.でなければ{
137
+ 偽値
138
+ }.である
139
+ }
140
+
141
+ 定義(:中断する) {
142
+ # 盤面を全て見せる
143
+ @縦幅.回{|縦|
144
+ 位置(0, 縦)
145
+ @横幅.回{|横|
146
+ 色付きの文字列(もし条件が{ @状態[縦 * @横幅 + 横] == :印 }.であるなら{ 生成元::配色[1] }.でなければ{ 生成元::配色[2] }.である,
147
+ もし条件が{ 取得(横, 縦) == 1 }.であるなら{ 生成元::登場人物[10] }.でなければ{ 生成元::登場人物[数える(横, 縦)] }.である)
148
+ }
149
+ }
150
+ }
151
+
152
+ 定義(:下へ進む) {
153
+ もし条件が{ @縦の現在地 < @縦幅 - 1 }.であるなら{ @縦の現在地 += 1; 位置(@横の現在地, @縦の現在地) }.である
154
+ }
155
+
156
+ 定義(:上へ進む) {
157
+ もし条件が{ @縦の現在地 > 0 }.であるなら{ @縦の現在地 -= 1; 位置(@横の現在地, @縦の現在地) }.である
158
+ }
159
+
160
+ 定義(:左へ進む) {
161
+ もし条件が{ @横の現在地 > 0 }.であるなら{ @横の現在地 -= 1; 位置(@横の現在地, @縦の現在地) }.である
162
+ }
163
+
164
+ 定義(:右へ進む) {
165
+ もし条件が{ @横の現在地 < @横幅 - 1 }.であるなら{ @横の現在地 += 1; 位置(@横の現在地, @縦の現在地) }.である
166
+ }
167
+ }
168
+
169
+ あるゲーム盤 = ゲーム盤.新規(10, 10, 10)
170
+ 外部のコマンドを実行する("stty raw -echo")
171
+ 領域{|制御|
172
+ 制御.本処理{
173
+ 循環{|制御|
174
+ この値が{
175
+ 標準入力.文字を取得
176
+ }.もし{ ?n }.であるなら{ # new game
177
+ あるゲーム盤.最初からやり直す
178
+ }.もし{ ?m }.であるなら{ # mark
179
+ あるゲーム盤.印を付ける
180
+ }.もし{ ?j }.であるなら{
181
+ あるゲーム盤.下へ進む
182
+ }.もし{ ?k }.であるなら{
183
+ あるゲーム盤.上へ進む
184
+ }.もし{ ?h }.であるなら{
185
+ あるゲーム盤.左へ進む
186
+ }.もし{ ?l }.であるなら{
187
+ あるゲーム盤.右へ進む
188
+ }.もし{ ?\s }.であるなら{
189
+ あるゲーム盤.開く
190
+ }.もし{ ?q }.か{ ?\C-c }.であるなら{ # quit game
191
+ あるゲーム盤.中断する
192
+ 制御.終わる
193
+ }.である
194
+ もし条件が{ あるゲーム盤.終わったか? }.であるなら{
195
+ もし条件が{ 標準入力.文字を取得 == ?q }.であるなら{ 制御.終わる }.である
196
+ あるゲーム盤.最初からやり直す
197
+ }.である
198
+ }
199
+ }
200
+ 制御.後始末{
201
+ 外部のコマンドを実行する("stty -raw echo")
202
+ }
203
+ }
204
+ 印字 "\n"
data/sample/mkproto.rb ADDED
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ $/ = 無値
6
+ 行 = 無値 # 繰り返しの条件がスコープを作るので、あらかじめ局所変数を初期化しておく必要がある
7
+ この条件なら{ 行 = 行を取得 }.繰り返す{|制御|
8
+ もし条件が{ /^((void|VALUE|int|char *\*|ID|struct \w+ *\*|st_table *\*) *)?\n(\w+)\(.*\)\n\s*((.+;\n)*)\{/ =~ 行 }.であるなら{
9
+ 行 = $'
10
+ 整形して印字 "%s %s(", $2, $3
11
+ 引数の一覧 = []
12
+ $4.分割(/;\n\s*/).個別に{|引数|
13
+ 引数.全置換!(/ +/, ' ')
14
+ もし条件が{ 引数 =~ /,/ }.であるなら{
15
+ 型 = 無値 # 肯否分岐がスコープを作るので、あらかじめ局所変数を初期化しておく必要がある
16
+ もし条件が{ 引数 =~ /(([^*]+) *\** *\w+),/ }.であるなら{
17
+ 型 = $2.空白を削る
18
+ 引数の一覧.付け足す $1.空白を削る
19
+ 引数 = $'
20
+ }.でなければ{
21
+ 型 = ""
22
+ }.である
23
+ この条件なら{ 引数.置換!(/(\** *\w+)(,|$)/, "") && $~ }.繰り返す{
24
+ 引数の一覧.付け足す 型 + " " + $1.空白を削る
25
+ }
26
+ }.でなければ{
27
+ 引数の一覧.付け足す 引数.空白を削る
28
+ }.である
29
+ }
30
+ 整形して印字 "%s);\n", 引数の一覧.結合(', ')
31
+ 制御.やり直す
32
+ }.である
33
+ }
data/sample/mpart.rb ADDED
@@ -0,0 +1,48 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # 複数に分割する
6
+ # 使い方: mpart.rb [-行数] ファイル..
7
+
8
+ 行数 = 1000
9
+
10
+ もし条件が{ スクリプトの引数[0] =~ /^-(\d+)$/ }.であるなら{
11
+ 行数 = $1.整数に変換
12
+ スクリプトの引数.先頭から取り出す
13
+ }.である
14
+
15
+ 元の名前 = スクリプトの引数[0]
16
+ 拡張子 = "part"
17
+
18
+ 分割 = 1
19
+ 行 = 0
20
+
21
+ ファイルの行 = 0
22
+ (入力ファイル = ファイルを開く(元の名前)).個別に{
23
+ ファイルの行 = ファイルの行 + 1
24
+ }
25
+ 入力ファイル.閉じる
26
+
27
+ 分割数 = ファイルの行 / 行数 + 1
28
+
29
+ 出力ファイル = 無値 # 繰り返しや肯否分岐がスコープを作るので、あらかじめローカル変数を初期化しておく必要がある
30
+ (入力ファイル = ファイルを開く(元の名前)).個別に{|内容|
31
+ もし条件が{ 行 == 0 }.であるなら{
32
+ 出力ファイル = ファイルを開く(文字列に整形("%s.%s%02d", 元の名前, 拡張子, 分割), "w")
33
+ 整形して印字(出力ファイル, "%s part%02d/%02d\n", 元の名前, 分割, 分割数)
34
+ 出力ファイル.書く("BEGIN--cut here--cut here\n")
35
+ }.である
36
+ 出力ファイル.書く(内容)
37
+ 行 = 行 + 1
38
+ もし条件が{ 行 >= 行数 && ! 入力ファイル.終端か? }.であるなら{
39
+ 出力ファイル.書く("END--cut here--cut here\n")
40
+ 出力ファイル.閉じる
41
+ 分割 = 分割 + 1
42
+ 行 = 0
43
+ }.である
44
+ }
45
+ 出力ファイル.書く("END--cut here--cut here\n")
46
+ 出力ファイル.閉じる
47
+
48
+ 入力ファイル.閉じる
data/sample/occur.rb ADDED
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # 単語の出現回数を一覧で表示する
6
+ # 使い方: ruby occur.rb ファイル..
7
+ 行 = 無値 # 繰り返しの条件がスコープを作るので、あらかじめ局所変数を初期化しておく必要がある
8
+ 出現回数 = 連想配列.新規(0)
9
+ この条件なら{ 行 = 行を取得 }.繰り返す{
10
+ 行.分割(/[^[:word:]]+/).個別に{|単語|
11
+ 出現回数[単語] += 1
12
+ }
13
+ }
14
+
15
+ 出現回数.キーの一覧.整列!.個別に{|単語|
16
+ 印字 単語, " -- ", 出現回数[単語], "\n"
17
+ }
data/sample/occur2.rb ADDED
@@ -0,0 +1,17 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ # 単語の出現回数を一覧で表示する
6
+ # 使い方: ruby occur2.rb ファイル..
7
+ 出現回数 = {}
8
+ スクリプトの入力.行毎に{|行|
9
+ 行.分割(/[^[:word:]]+/).個別に{|単語|
10
+ 出現回数[単語] ||= 0
11
+ 出現回数[単語] += 1
12
+ }
13
+ }
14
+
15
+ 出現回数.キーの一覧.整列!.個別に{|単語|
16
+ 整形して印字("%s -- %d\n", 単語, 出現回数[単語])
17
+ }
data/sample/philos.rb ADDED
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ #
6
+ # 食事する哲学者の問題 - スレッドの例
7
+ #
8
+
9
+ 乱数の種を設定
10
+ #乱数の種を設定
11
+ 日本語の定数 :人数, 9 # 哲学者の人数
12
+ $分岐の一覧 = []
13
+ (0..人数-1).個別に{|番号|
14
+ $分岐の一覧[番号] = スレッド::相互排他制御.新規
15
+ }
16
+ $状態 = "-o"*人数
17
+
18
+ 定義(:待つ) {
19
+ 休止 乱数(20)/10.0
20
+ }
21
+
22
+ 定義(:考える) {|番号|
23
+ 待つ
24
+ }
25
+
26
+ 定義(:食べる) {|番号|
27
+ 待つ
28
+ }
29
+
30
+ 定義(:哲学者) {|番号|
31
+ この条件なら{ 真値 }.繰り返す{|制御|
32
+ 考える 番号
33
+ $分岐の一覧[番号].獲得
34
+ もし条件が{ ! $分岐の一覧[(番号+1)%人数].可能なら獲得 }.であるなら{
35
+ $分岐の一覧[番号].解放
36
+ 制御.次へ進む
37
+ }.である
38
+ $状態[番号*2] = ?|
39
+ $状態[(番号+1)%人数*2] = ?|
40
+ $状態[番号*2+1] = ?*
41
+ 印字 $状態, "\n"
42
+ 食べる(番号)
43
+ $状態[番号*2] = ?-
44
+ $状態[(番号+1)%人数*2] = ?-
45
+ $状態[番号*2+1] = ?o
46
+ 印字 $状態, "\n"
47
+ $分岐の一覧[番号].解放
48
+ $分岐の一覧[(番号+1)%人数].解放
49
+ }
50
+ }
51
+
52
+ (0..人数-1).個別に{|番号|
53
+ スレッド.開始(番号) {|数| 哲学者(数) }
54
+ 休止 0.1
55
+ }
56
+
57
+ 休止
data/sample/pi.rb ADDED
@@ -0,0 +1,20 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'japanize'
4
+
5
+ k, a, b, a1, b1 = 2, 4, 1, 12, 4
6
+
7
+ 循環{
8
+ # 次の近似
9
+ p, q, k = k * k, 2 * k + 1, k + 1
10
+ a, b, a1, b1 = a1, b1, p * a + q * a1, p * b + q * b1
11
+
12
+ d = a / b
13
+ d1 = a1 / b1
14
+ この条件なら{ d == d1 }.繰り返す{
15
+ 印字 d
16
+ 標準出力.書き込む
17
+ a, a1 = 10 * (a % b), 10 * (a1 % b1)
18
+ d, d1 = a / b, a1 / b1
19
+ }
20
+ }