せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【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   # パースエラー

 
なるほどー。
優先順位が同じ==演算子を複数書くとエラーになるのは
非結合だからなのか。