ruby-japanize 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +16 -0
- data/Gemfile +13 -0
- data/LICENSE.txt +21 -0
- data/README.md +1459 -0
- data/Rakefile +88 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/japanize/base.rb +652 -0
- data/lib/japanize/container.rb +213 -0
- data/lib/japanize/core.rb +194 -0
- data/lib/japanize/enum.rb +127 -0
- data/lib/japanize/errors.rb +79 -0
- data/lib/japanize/globals.rb +109 -0
- data/lib/japanize/io.rb +388 -0
- data/lib/japanize/names.rb +213 -0
- data/lib/japanize/num.rb +319 -0
- data/lib/japanize/process.rb +318 -0
- data/lib/japanize/string.rb +257 -0
- data/lib/japanize/syntax.rb +805 -0
- data/lib/japanize/sys.rb +174 -0
- data/lib/japanize/test_unit.rb +99 -0
- data/lib/japanize/thread.rb +143 -0
- data/lib/japanize/time.rb +82 -0
- data/lib/japanize/version.rb +12 -0
- data/lib/japanize.rb +24 -0
- data/ruby-japanize.gemspec +41 -0
- data/sample/README.md +33 -0
- data/sample/dir.rb +15 -0
- data/sample/eval.rb +48 -0
- data/sample/export.rb +44 -0
- data/sample/fact.rb +17 -0
- data/sample/fib.rb +13 -0
- data/sample/freq.rb +17 -0
- data/sample/fullpath.rb +29 -0
- data/sample/less.rb +19 -0
- data/sample/list.rb +86 -0
- data/sample/list2.rb +22 -0
- data/sample/list3.rb +23 -0
- data/sample/mine.rb +204 -0
- data/sample/mkproto.rb +33 -0
- data/sample/mpart.rb +48 -0
- data/sample/occur.rb +17 -0
- data/sample/occur2.rb +17 -0
- data/sample/philos.rb +57 -0
- data/sample/pi.rb +20 -0
- data/sample/rcs.dat +17 -0
- data/sample/rcs.rb +45 -0
- data/sample/sieve.rb +17 -0
- data/sample/time.rb +14 -0
- data/sample/trojan.rb +18 -0
- data/sample/uumerge.rb +47 -0
- 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
data/sample/fib.rb
ADDED
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
|
+
}
|
data/sample/fullpath.rb
ADDED
@@ -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
|
+
}
|