【Ruby】Rubyソースコード完全解説
■topic summary
study about this site -> Rubyソースコード完全解説
ちょっと難しかった。。
以下、学んだことなど。
Stringのインスタンス変数
現実にruby 1.2まではgeneric_iv_tblが導入されておらず、従って StringやArrayではインスタンス変数を使うことはできなかったのだが、それで もたいして問題にはなっていなかった。
http://loveruby.net/ja/rhg/book/object.html
Stringクラスのインスタンス変数?
やってみよう。
class String alias org_initialize initialize def initialize(str, num) super() self << str @num = num end def howmany @num end end a = String.new("hoge", 1) p a p a.howmany #<= 1
なるほど。
Rubyに++(インクリメンタル)がない理由
+=があるなら++もあるのかな、と思いきや++はない。なぜだろうか。 Rubyでは代入は言語処理系が扱うものである。一方メソッドはライブラリが実 行するものである。この二つ、即ち変数世界とオブジェクト世界、をきっ ぱり分けるというのはRubyの重要な特徴である。++を導入するとその区別が 壊れてしまいかねない。というのが++のない理由だ。
へー。
パーサーから見た「ぶら下がりelse問題」
ぶらさがり elseもシフトしておけばうまくいく。そういうわけでyaccもその流れに従い shift/reduce conflictが起きたときにはデフォルトでシフトを選ぶようになっ ている。
http://loveruby.net/ja/rhg/book/yacc.html
以前にelse if問題を考えたことがあった。
少し違う(あの問題はシンタックシュガーなので)けど、
改めてパーサーで何が行われているのかをみてみよう。
ふむふむ。
パーサーでは還元・が行われている。
「ぶら下がりelse問題」は、
この2つの動作がどちらも行える可能性があるとき
エラーにするのか、どちらかを優先するのか、という問題。
ここで用語の整理。
シフト(shift)
⇒「かたまり」に詰めていく
還元(reduce)
⇒現在の「かたまり」を終端記号に変換し「かたまり」を空にする。
もう一度再掲すると、
ぶらさがり elseもシフトしておけばうまくいく。そういうわけでyaccもその流れに従い shift/reduce conflictが起きたときにはデフォルトでシフトを選ぶようになっている。
http://loveruby.net/ja/rhg/book/yacc.html
「かたまり」につめるほうを優先する。
なるほど。
「非結合」
nonassocの代表格は比較演算子だろう。 a == b == c # パースエラー a <= b <= c # パースエラー
なるほどー。
優先順位が同じ==演算子を複数書くとエラーになるのは
非結合だからなのか。