ruby-japanize 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }