summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--eval.c4
-rw-r--r--node.h4
-rw-r--r--parse.y15
-rw-r--r--sample/occur2.rb2
-rw-r--r--sample/ruby-mode.el2
-rw-r--r--sample/sieve.rb2
-rw-r--r--spec140
-rw-r--r--version.h4
9 files changed, 91 insertions, 87 deletions
diff --git a/ChangeLog b/ChangeLog
index 35d02ea..838091a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Feb 9 16:18:37 1995 Yukihiro Matsumoto (matz@ix-02)
+
+ * parse.y: protectをbeginに変更.begin..endは例外処理だけでなく,
+ 文括弧としても働くことになった.
+
Wed Feb 1 19:48:24 1995 Yukihiro Matsumoto (matz@ix-02)
* string.c(str_replace): 置き換える文字列の長さが等しい時メモリコ
diff --git a/eval.c b/eval.c
index 1e00de9..fa61e47 100644
--- a/eval.c
+++ b/eval.c
@@ -788,7 +788,7 @@ rb_eval(node)
}
return result;
- case NODE_PROT:
+ case NODE_BEGIN:
PUSH_TAG();
switch (state = EXEC_TAG()) {
case 0:
@@ -1933,7 +1933,7 @@ rb_call(class, recv, mid, argc, argv, func)
Fatal("unexpected redo");
break;
case TAG_RETRY:
- Fatal("retry outside of protect clause");
+ Fatal("retry outside of resque clause");
break;
case TAG_RETURN:
result = last_val;
diff --git a/node.h b/node.h
index 8137995..f98be64 100644
--- a/node.h
+++ b/node.h
@@ -26,7 +26,7 @@ enum node_type {
NODE_WHILE2,
NODE_ITER,
NODE_FOR,
- NODE_PROT,
+ NODE_BEGIN,
NODE_AND,
NODE_OR,
NODE_NOT,
@@ -187,7 +187,7 @@ typedef struct RNode {
#define NEW_WHILE2(c,b) newnode(NODE_WHILE2,c,b,Qnil)
#define NEW_FOR(v,i,b) newnode(NODE_FOR,v,b,i)
#define NEW_ITER(v,i,b) newnode(NODE_ITER,v,b,i)
-#define NEW_PROT(b,ex,en) newnode(NODE_PROT,b,ex,en)
+#define NEW_BEGIN(b,ex,en) newnode(NODE_BEGIN,b,ex,en)
#define NEW_REDO() newnode(NODE_REDO,Qnil,Qnil,Qnil)
#define NEW_BREAK() newnode(NODE_BREAK,Qnil,Qnil,Qnil)
#define NEW_CONT() newnode(NODE_CONTINUE,Qnil,Qnil,Qnil)
diff --git a/parse.y b/parse.y
index 7c84221..7dabc5d 100644
--- a/parse.y
+++ b/parse.y
@@ -90,6 +90,10 @@ static void setup_top_local();
DEF
UNDEF
INCLUDE
+ BEGIN
+ RESQUE
+ ENSURE
+ END
IF
THEN
ELSIF
@@ -99,10 +103,6 @@ static void setup_top_local();
WHILE
FOR
IN
- PROTECT
- RESQUE
- ENSURE
- END
REDO
BREAK
CONTINUE
@@ -762,18 +762,17 @@ primary : literal
value_expr($4);
$$ = NEW_FOR($2, $4, $6);
}
- | PROTECT
+ | BEGIN
compexpr
resque
ensure
END
{
if ($3 == Qnil && $4 == Qnil) {
- Warning("useless protect clause");
$$ = $2;
}
else {
- $$ = NEW_PROT($2, $3, $4);
+ $$ = NEW_BEGIN($2, $3, $4);
}
}
| LPAREN compexpr rparen
@@ -1312,6 +1311,7 @@ static struct kwtable {
"__LINE__", _LINE_, EXPR_END,
"alias", ALIAS, EXPR_FNAME,
"and", AND, EXPR_BEG,
+ "begin", BEGIN, EXPR_BEG,
"break", BREAK, EXPR_END,
"case", CASE, EXPR_BEG,
"class", CLASS, EXPR_BEG,
@@ -1329,7 +1329,6 @@ static struct kwtable {
"module", MODULE, EXPR_BEG,
"nil", NIL, EXPR_END,
"or", OR, EXPR_BEG,
- "protect", PROTECT, EXPR_BEG,
"redo", REDO, EXPR_END,
"resque", RESQUE, EXPR_BEG,
"retry", RETRY, EXPR_END,
diff --git a/sample/occur2.rb b/sample/occur2.rb
index 899294e..8cd5acb 100644
--- a/sample/occur2.rb
+++ b/sample/occur2.rb
@@ -3,7 +3,7 @@
freq = {}
while gets()
for word in $_.split(/\W+/)
- protect
+ begin
freq[word] = freq[word] + 1
resque
freq[word] = 1
diff --git a/sample/ruby-mode.el b/sample/ruby-mode.el
index 7f97e71..4396b10 100644
--- a/sample/ruby-mode.el
+++ b/sample/ruby-mode.el
@@ -8,7 +8,7 @@
;;;
(defconst ruby-block-beg-re
- "class\\|module\\|def\\|if\\|unless\\|case\\|while\\|until\\|for\\|protect"
+ "class\\|module\\|def\\|if\\|unless\\|case\\|while\\|until\\|for\\|begin"
)
(defconst ruby-block-mid-re
diff --git a/sample/sieve.rb b/sample/sieve.rb
index eaf4e33..640cc32 100644
--- a/sample/sieve.rb
+++ b/sample/sieve.rb
@@ -5,7 +5,7 @@ max = max.to_i
print "1"
for i in 2 .. max
- protect
+ begin
for d in sieve
fail if i % d == 0
end
diff --git a/spec b/spec
index b7c374d..fb5d046 100644
--- a/spec
+++ b/spec
@@ -67,13 +67,13 @@ tab), CR(carriage return),改頁(form feed)である.改行(newline)は明ら
予約語は以下の通りである
- alias else in resque when
- and elsif include retry while
- break end module return yield
- case ensure nil self __END__
- class fail or super __FILE__
- continue for protect then __LINE__
- def if redo undef
+ alias def if resque when
+ and else in retry while
+ begin elsif include return yield
+ break end module self __END__
+ case ensure nil super __FILE__
+ class fail or then __LINE__
+ continue for redo undef
予約語はクラス名,メソッド名,変数名などに用いることはできない.
@@ -303,7 +303,7 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
括弧の中には単なる式だけではなく,式の並び(=プログラム)を置くことが出
来る.
- `(' 式 `;' 式... `)'
+ `(' 式 `;' 式.. `)'
式の並びの値は最後に評価した式の値である.つまりの値は最後に評価した式
の値になる.
@@ -317,7 +317,7 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
配列はArrayクラスのインスタンスである.配列を生成する式は以下の形式で
ある.
- `[' 式, ... `]'
+ `[' 式, .. `]'
それぞれの式を評価した結果を含む配列を返す.要素数が0の空配列を生成す
るためには空の配列式
@@ -336,7 +336,7 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
の連想配列はDict(辞書)クラスのインスタンスである.詳細はクラスDictの項
を参照されたい.連想配列を生成する連想配列式は以下の形式である.
- `{' 式 `=>' 式... `}'
+ `{' 式 `=>' 式.. `}'
それぞれの式を評価した結果をキーと値とする連想配列オブジェクトを返す.
要素数が0の連想配列を生成するためには空の連想配列式
@@ -356,7 +356,7 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
オブジェクトにメッセージを送る基本的な構文がメッセージ式であり,その基
本形式は以下の通りである.
- 式1 `.' メソッド名 `(' 引数1... [`,' `*' 引数n ]`)'
+ 式1 `.' メソッド名 `(' 引数1.. [`,' `*' 引数n ]`)'
式1を評価して得られるオブジェクトの,識別子で指定されるメソッドを呼び
出す.一番最後の引数が`*'に続く(単一の)式である場合,その式を評価した
@@ -403,7 +403,7 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
出す.引数として与えられた変数の値を変更しても,渡されるのは元の引数の
値である.
- super`(' 引数... `)'
+ super`(' 引数.. `)'
引数とともにスーパークラスの同名のメソッドを呼び出す.一番最後の引数が
`*'に続く場合は通常のメソッド呼び出しと同様に展開して渡される.
@@ -430,7 +430,7 @@ module式を用いる.代入式は演算子形式をとっているが,メソッドではないの
配列要素への代入
- 式1`[' 式2... `]' `=' 式n
+ 式1`[' 式2.. `]' `=' 式n
式1を評価して得られるオブジェクトに,式2から式nまでを引数として,"[]="
というメソッドを呼び出す.
@@ -470,7 +470,7 @@ module式を用いる.代入式は演算子形式をとっているが,メソッドではないの
同時に複数の変数に代入を行なうことができる.その形式は以下の通りである.
- 左辺 `,' [左辺 `,' ...] [`*' 左辺]= 式 [, 式...]
+ 左辺 `,' [左辺 `,'..] [`*' 左辺]= 式 [, 式..]
右辺の式が一つしかない場合は,その値を配列として(必要ならばto_aメソッ
ドで配列に変換して),要素をそれぞれ左辺に代入する.それ以外の場合には,
@@ -510,9 +510,9 @@ module式を用いる.代入式は演算子形式をとっているが,メソッドではないの
<=> == != =~ !~
&&
||
- .. ...
+ .. ...
::
- =(代入) 自己代入(+=, -=, ..)
+ =(代入) 自己代入(+=, -=,..)
and
or
弱 if修飾子 while修飾子
@@ -534,13 +534,13 @@ module式を用いる.代入式は演算子形式をとっているが,メソッドではないの
式1. 演算子 ()
-配列(連想配列を含む)の要素の参照(式1 `[' 式2... `]')
+配列(連想配列を含む)の要素の参照(式1 `[' 式2.. `]')
- 式1. `[]' (式2...)
+ 式1. `[]' (式2..)
-配列要素の代入( 式1 `[' 式2... `]' `=' 式n)
+配列要素の代入( 式1 `[' 式2.. `]' `=' 式n)
- 式1. `[]=' (式2...)
+ 式1. `[]=' (式2..)
それ以外の2項演算子(式 演算子 式)
@@ -552,11 +552,11 @@ module式を用いる.代入式は演算子形式をとっているが,メソッドではないの
** IF
if 式1 [then]
- 式1
+ 式..
[elsif 式2 [then]
- 式2 ]...
+ 式.. ]..
[else
- 式n ]
+ 式.. ]
end
条件判断式.式1が真の場合に式1を評価する.それ以外の場合は式2を評価す
@@ -577,10 +577,10 @@ ifの条件判断部の式では文字列と正規表現リテラルは式「$_=~ リテラル」の
** CASE
case 式0
- [when 式1 [, 式2]... [then]
- 式1 ]...
+ [when 式1 [, 式2].. [then]
+ 式.. ]..
[else
- 式n ]
+ 式.. ]
end
条件分岐,CのswitchよりもPascalのcaseに似ている.breakで脱出することも
@@ -662,7 +662,7 @@ orの両辺の式では文字列と正規表現リテラルは式「$_=~ リテラル」の省略で
** WHILE
while 式
- 式
+ 式..
end
式を評価した値が真の間,式を繰り返し実行する.while式の値はnilである.
@@ -690,7 +690,7 @@ whileの条件判断部の式では文字列と正規表現リテラルは式「$_=~ リテラル」
イテレータとは制御構造(特にループ)の抽象化のために用いられるメソッドの
一種である.イテレータの呼び出しは以下の構文で行なわれる.
- 式 `{' 変数... `|' 式... `}'
+ 式 `{' 変数.. `|' 式.. `}'
「式」をブロックとして設定し,「式」のメソッドをイテレータとして評価す
る.「式」のトップレベルのメソッドだけがイテレータとして呼び出され,
@@ -722,7 +722,7 @@ Enumerableモジュールのgrepメソッドのようにイテレータとして呼ばれた時と
** YIELD
- yield `(' [式 [`,' 式...]])
+ yield `(' [式 [`,' 式..]])
yield
イテレータの中でブロックの呼び出しを行なう.yieldを実行したメソッドが
@@ -740,27 +740,27 @@ yieldの引数の括弧は曖昧でない限り省略できる.
failの引数の括弧は曖昧でない限り省略できる.
-** PROTECT
+** BEGIN
-処理中に予期しない事態が発生した時には例外が発生する.Rubyでは例外を途
-中で捕捉して,再試行したり,後処理を行なったりすることができる.
+複数の式をまとめるためにbegin式がある.begin式の形式は以下の通りである.
- protect
- 式1
+ begin
+ 式..
[resque
- 式2 ]
+ 式.. ]
[ensure
- 式3]
+ 式..]
end
-式1を実行し,その実行中に例外が発生すればresque節で指定された式2を実行
-する.更にensure節が存在する時はprotect式を終了する前に必ず(正常終了時
-だけでなく,例外, return, break, continue, redoなどによる脱出でも)式3
-を実行する.
+begin式の値は一番最後に評価された式の値である.begin式の処理中に発生し
+た時に例外はresque節で捕獲することが出来る.この場合の値はresque部で最
+後に評価した式の値である.更にensure節が存在する時はbegin式を終了する
+前に必ず(正常終了時だけでなく,例外, return, break, continue, redoなど
+による脱出でも)ensure節の式を評価する.
** RETURN
- return [式[`,' 式...]]
+ return [式[`,' 式..]]
式の値を戻り値としてメソッドの実行を終了する.式が2つ以上与えられた時
には,それらを要素とする配列をメソッドの戻り値とする.式が一つもない場
@@ -788,9 +788,9 @@ redoはループ条件のチェックを行なわず,現在の繰り返しをやり直す.
retry
-protect式のresque節で使い,protect式を始めから実行する.例外処理を行なっ
-てから再試行するのに使う.resque節以外でretryが用いられた場合例外が発
-生する.
+begin式のresque節で使い,begin式を始めから実行する.例外処理を行なって
+から再試行するのに使う.resque節以外でretryが用いられた場合例外が発生
+する.
** クラス定義
@@ -820,7 +820,7 @@ protect式のresque節で使い,protect式を始めから実行する.例外処理を行なっ
ド定義はネストできないので,メソッド定義式中ではメソッド定義式を再び呼
び出せない.
- def メソッド名 [`(' 引数 [`,' 引数...][`,' `*'引数 ] `)']
+ def メソッド名 [`(' 引数 [`,' 引数..][`,' `*'引数 ] `)']
定義実体
end
@@ -845,7 +845,7 @@ protect式のresque節で使い,protect式を始めから実行する.例外処理を行なっ
メソッド定義にはもう一つ特異メソッドの定義がある.特異メソッドとはある
特定のオブジェクトに固有のメソッドである.形式は以下の通りである.
- def 式 `.' メソッド名 [`(' 引数 [`,' 引数...][`,' `*'引数 ] `)']
+ def 式 `.' メソッド名 [`(' 引数 [`,' 引数..][`,' `*'引数 ] `)']
定義実体
end
@@ -867,7 +867,7 @@ protect式のresque節で使い,protect式を始めから実行する.例外処理を行なっ
他のモジュールをインクルードする構式は以下の通りである.
- include モジュール名 [`,' モジュール名...]
+ include モジュール名 [`,' モジュール名..]
現在の定義中のクラスまたはモジュール(トップレベルではObjectクラス)に指
定したモジュールをインクルードする.
@@ -977,7 +977,7 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての
メソッドがイテレータとして呼び出された時に真,そうでない時に偽
を返す述語.
- kill(signal, pid...)
+ kill(signal, pid..)
pidで指定されたプロセスにシグナルを送る.シグナルはシグナル番
号か名前で指定する.負の値を持つシグナル(あるいはシグナル名の
@@ -1094,7 +1094,7 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての
は`$_'の値を更新する.その他の詳細に関してはStringクラスのsub
メソッドの解説を参照のこと.
- syscall(num, arg...)
+ syscall(num, arg..)
numで指定された番号のシステムコールを実行する.第2引数以降をシ
ステムコールの引数として渡す.引数は文字列または整数でなければ
@@ -1104,7 +1104,7 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての
コマンドを実行し,その終了ステータスを返す.
- trap(command, signal...)
+ trap(command, signal..)
signalの割り込みがかかった時にcommandを実行する.signalはシグ
ナル名かシグナルの番号.commandとして"SIG_IGN"または"IGNORE"を
@@ -1234,11 +1234,11 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての
られるメソッドは大抵真の値として%TRUEを返すようにはなっている
が).つまり
- if some.method() then .. else .. end
+ if some.method() then ... else ... end
- if some.method() == %TRUE then .. else .. end
+ if some.method() == %TRUE then ... else ... end
は完全には同義ではない.%FALSEに関しては,このような問題は生じ
ない.
@@ -1247,7 +1247,7 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての
** Array(クラス)
-数字を添字とした配列のクラスである.生成は一般的には配列式``[...]''で
+数字を添字とした配列のクラスである.生成は一般的には配列式``[..]''で
行なわれる.
SuperClass: Object
@@ -1429,7 +1429,7 @@ Methods:
Single Methods:
- Array[item...]
+ Array[item..]
引数を要素とする配列を生成する.
@@ -1482,7 +1482,7 @@ SuperClass: Object
Methods:
- call(arg[, ...])
+ call(arg[,..])
ブロックを実行する.
@@ -1514,7 +1514,7 @@ Private Methods:
Methods:
- new(...)
+ new(..)
クラスのインスタンスを生成する.多くの場合このメソッドはサブク
ラスの特異メソッドによってオーバーライドされ,クラスによって引
@@ -1788,7 +1788,7 @@ Methods:
Single Methods:
- Dict[key, value...]
+ Dict[key, value..]
奇数番目の引数をkey,偶数番目の引数をvalueとする辞書を生成する.
@@ -2088,12 +2088,12 @@ Single Methods:
filenameの最終ステータス変更時刻を返す.
- chmod(mode, path, file...)
+ chmod(mode, path, file..)
ファイルのパーミッションを変更する(cf chmod(2)).変更したファ
イル数を返す.fileにはワイルドカードも許す.
- chown(owner, group, file...)
+ chown(owner, group, file..)
ファイルの所有者とグループを変更する(cf chown(2)).nilか-1を指
定することによって所有者やグループを現在のまま変えないでおくこ
@@ -2135,12 +2135,12 @@ Single Methods:
"directory","characterSpecial","blockSpecial","fifo",
"link","socket"のうちのいずれか一つである.
- unlink(file...)
+ unlink(file..)
ファイルを削除する.ディレクトリの削除にはDir.rmdirを使うこと.
fileにはワイルドカードも許す.
- utime(atime, mtime, file...)
+ utime(atime, mtime, file..)
ファイルのアクセス時刻をatimeに,修正時刻をmtimeに設定する.
atime,mtimeは数またはTimeクラスのインスタンスでなければならな
@@ -2389,7 +2389,7 @@ Single Methods:
** Glob(クラス)
-ワイルドカードのクラス.ワイルドカードのリテラルは<...>という形式であ
+ワイルドカードのクラス.ワイルドカードのリテラルは<..>という形式であ
る.正規表現とほぼ同じように使えるが,こちらは機能が少ない.ただし,ワ
イルドカードの展開機能がある.
@@ -3363,7 +3363,7 @@ Methods:
print(i, "\n");
end
- これはa, b, c, .. aa, .. az, baまでを各行に出力する.
+ これはa, b, c, ... aa, ... az, baまでを各行に出力する.
気を付けなければいけないのは,この終了判定は大小関係ではなく
@@ -3412,7 +3412,7 @@ Single Methods:
本ドキュメント内で,構造体を表現するためには以下の形式を使う.
struct 構造体名
- メンバ ...
+ メンバ...
end
しかし,プログラム中でこの形式で構造体を生成するわけではない.
@@ -3440,7 +3440,7 @@ Methods:
Single Methods:
- new(name, member::value...)
+ new(name, member::value..)
nameという名前を持つ構造体を生成する.memberは構造体のメンバを
表す文字列であり,valueはその値である.生成された構造体はメン
@@ -3596,10 +3596,10 @@ Methods:
時刻をformat文字列に従って文字列に変換した結果を返す.format
文字列として指定できるものは 以下の通りである.
- %A 曜日の名称(Sunday, Monday,...)
- %a 曜日の省略名(Sun, Mon,...)
- %B 月の名称(January, February,...)
- %b 月の省略名(Jan, Feb,...)
+ %A 曜日の名称(Sunday, Monday,..)
+ %a 曜日の省略名(Sun, Mon,..)
+ %B 月の名称(January, February,..)
+ %b 月の省略名(Jan, Feb,..)
%c 時刻表現(cf ctime(3))
%d 十進数での日(01-31)
%H 24時間制の時(00-23)
@@ -3802,7 +3802,7 @@ PRIMARY : LITERAL
| for ITER_VAR in EXPR TERM
COMPEXPR
end
- | protect
+ | begin
COMPEXPR
[resque COMPEXPR]
[ensure COMPEXPR]
diff --git a/version.h b/version.h
index d24ad99..d8dfe80 100644
--- a/version.h
+++ b/version.h
@@ -1,2 +1,2 @@
-#define RUBY_VERSION "0.65"
-#define VERSION_DATE "95/02/08"
+#define RUBY_VERSION "0.66"
+#define VERSION_DATE "95/02/09"