Ruby

parser generator書いてみた(2)

一昨日書いたparser generatorだけど,設計上の問題があることがわかってたのと,Ruby Library Report 【第 6 回】 正規表現と構文解析を見つけたので何か書く. 読みにくい 書きやすいのだが読みにくい感は否めない.tdp4rのように演算子を使う書き方を検討…

parser generator書いてみた

現状こんな感じで書ける. lexer = Lexer.new("x + 4 * 5", /[ \t\n\r\v]+/) { token(:operator, /[+]/) {|ma| ma[0].to_sym } token(:operator2, /[*]/) {|ma| ma[0].to_sym } token(:integer, /[0-9]+/) {|ma| ma[0].to_i } token(:identifier, /[a-z]+/) …

StringScannerからMatchDataがとれない

indexで参照するには代替手段が用意されてるけど,名前で後から参照することができないようだ. s = StringScanner.new("hoge") s.scan(/.(?<k>.)/) p s[1] # => "o" p s[:k] # => -:4:in `[]': can't convert Symbol into Integer (TypeError)</k>

1.9のCurses::Window#getchがStringを返したりFixnumを返したりする

英字キーだとString,Returnや矢印キーではFixnumが返ってくる.1.8ではどちらもFixnum. バグじゃね?どっちかに統一すべきだろ…と思ってたらこんなソース. /* def getch */ static VALUE curses_getch(VALUE obj) { int c; rb_read_check(stdin); curses_…

ruby-modeのインデントがおかしい

埋め込みドキュメントとかいろいろおかしいところがあったと思うけど,演算子のaliasでおかしくなるのをみつけた. aliasの次の行のインデントがずれる. alias hoge + # ずれる alias hoge == # ずれる alias hoge :+ # ずれない alias hoge :== # ずれる a…

Time#_loadがやたら重い

1000個で6秒程かかる.to_iしてMarshal.dumpなら0.01秒くらい.タイムゾーンとかインスタンス変数とかなくなるけど.って精度が下がるか. それにしてもかかりすぎじゃない? require 'benchmark' class C def initialize(sec) @t = Time.at(sec) end def _d…

バージョンによってリテラルが返すオブジェクトが違う件について

Ruby1.9になって文字コードの数値リテラル(?aとか)が文字列リテラルになったのがどうしても納得できない. バージョンアップでリテラルの意味が変わるなんて,これ以上の驚きはそうそう無いと思う. 今は数値(97とか)を生で埋め込んでるけど分かりにくくて仕…

RBTreeを1.9.1に対応させてみた

RBTree 0.2.1が1.8.xでしか動かないみたいなので,1.9.1で動くようにしてみた. RStringやRArrayのメンバをマクロを通してアクセスするようにして,rb_inspecting_pやrb_protect_inspectを使っている所をrb_exec_recursveを使うようにした. testは大体通っ…

以前書いた自作拡張ライブラリを1.9.1で使おうとしたらrubyが落ちた

You may encounter a bug of Ruby interpreterとか出てきて焦ったけど,ruby19 extconf.rbして,.oファイル消してmakeしたら1.9.1で動くようになった(1.8.7では動かなくなった). 単に互換性がないのね. CレベルでのStringやArrayの扱い方が変わったみたい…

1.9.1の$0がps(1)に反映されない

1.8.7ではps(1)に反映されたのに,1.9.1では反映されなかった. http://redmine.ruby-lang.org/issues/show/214 バグ?ソースを読む限りではMacの場合だけわざわざmallocして頑張ってコピーしているように見えるけど… 細かい所で挙動の違う所が多いなぁ.

nicovideo.rbをruby1.9.1で動かす

いろいろ間違ってる気がするけど,とりあえず(マイリストの取得については)こういうことをすれば動いた. module Nicovideo class Page original_register_getter = instance_method(:register_getter) define_method(:register_getter) {|params| original_…

nicovideo.rbがよくわからない

Nicovideo::MyList#initializeとかでregister_getterを呼んでるけど,これだとメソッドがNicovideo::Pageに定義される.あと,オブジェクトを生成する度に再定義される気がする.これは意図した挙動じゃないんじゃ?

1.8.7と1.9.1の挙動クイズ

今度のは難しいぞ! 継承は関係なかったので問題を修正. (1) class A def initialize eval "def f() 3 end" end end p A.new.f (2) class A private def initialize eval "def f() 3 end" end end p A.new.f

Ruby1.9挙動クイズ

ねんがんの デフォルトひきすうをてにいれたぞ! (1) proc {|x = 3| x } (2) proc {|x = 3 + 4| x } (3) ->(x = 3 + 4) { x }

ruby1.8と1.9共存下でのrubygems

$ gem --version 1.3.5 $ ruby19 -S gem --version 1.3.1うひょー $ sudo ruby19 -S gem update --system $ sudo ruby19 -S gem install nicovideoなんか2重にインストールしてるみたいで,なんか勿体無いなぁ.

nicovideo gem バグっぽいんだけど

http://coderepos.org/share/browser/lang/ruby/nicovideo_gem/trunk/lib/nicovideo/mylist.rbの22行目, attr_reader :myliset_id は attr_reader :mylist_id の間違いじゃないかと思うんだけど,どこに言えばいいのやら….

RubyでニコニコのAPI叩くためにいろいろインストール

時系列 マイリスト取れるらしい.*1 gem install nicovideoでなんかできるらしい.*2 sudo gem install nicovideoしてみたが,gemのversionが低いと言われ,gem update --system gemがやたら重い. 今度こそsudo gem install nicovideo→インストールはできた…

Rubyがすこしわかるようになった気がするらしい

レポート課題で行列計算が必要だったのでいつものようにRubyで書いた. http://d.hatena.ne.jp/varutsu7/20090721/1248203955 ソース載せてる人が居るので俺の落書きコードも晒してみる. require 'matrix' require 'mathn' mat_h = Matrix[ [0, 1/2, 1/4, 0…

ブロックが一つしか渡せなくて困る

unfold系は2-3個ブロック受け取りたいよね.まぁ,構文上・実装上の制限があるんだろうけど….構文上困るのはyield辺りかな.Proc生成せずに名前付けて(または番号で)yieldできると嬉しいんじゃないかなぁ. Schemeとかだと生成コストがどうのってのはインラ…

ruby1.9をインストール(ruby1.8.7と共存)

MacOSX(10.5.7)にインストール. ./configure --enable-shared --enable-pthread --program-suffix=19 make make test sudo make install 何故か今度はmake testが通った.前回. $ ruby19 -v ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-darwin9.7.0…

ruby1.8.7がBus Error

$ ruby bus_error.rb bus_error.rb:5: [BUG] Bus Error ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.6.1] Abort trapbus_error.rbの中身: def f yield end f(&:a) OSはMac 0S X(10.5.7). バグ報告しようと思ったけど,やり方がよく分からないの…

Ruby1.9.1をコンパイルしようとした

$ ./configure --enable-shared --enable-pthread --with-readline-dir=/usr/local (略) configure: WARNING: unrecognized options: --with-readline-dir$ make test (略) #225 test_io.rb:11:in `<top (required)>': begin require "io/nonblock" r, w = IO.pipe w.nonbloc</top>…

module_functionの色付け

module_functionのmoduleの部分だけ青くなって気持ち悪い.最近のruby-modeはこうなのか… とりあえず応急処置した. (modify-syntax-entry ?_ "w" ruby-mode-syntax-table)

シンボルの色付けを修正(2)

前回の日記ではまだおかしかったのでまた修正. (add-hook 'ruby-mode-hook '(lambda () (add-to-list 'ruby-font-lock-keywords '("\\(?:^\\|[^:]\\)\\(:\\(\\(\\$\\|@\\|@@\\)[_a-zA-Z][_a-zA-Z0-9]*\\|[A-Z][_a-zA-Z0-9]*[!?=]?\\)\\)" 1 font-lock-const…

シンボルの色付け修正

前の日記ではFoo::Barの色がおかしくなるので,修正した. :foo :Foo :Foo= :@foo :@@foo :$foo Foo::Bar (add-hook 'ruby-mode-hook '(lambda () (add-to-list 'ruby-font-lock-keywords '("\\(^\\|[^:]\\):\\(\\(\\$\\|@\\|@@\\)[_a-zA-Z][_a-zA-Z0-9]*\\|…

RubyCocoaがよくわからない

Leopardだと最初から入っているので,require 'osx/cocoa'すればいいと書いてあるんだが,no such file to loadとなってしまう. 明らかにロードパスの通っている所にosx/cocoaなんてないので,それっぽいのをロードパスに追加して irb -I /System/Library/F…

るびまゴルフ第5回(2)

現状.10B,20B.

uniq words

20bytes.るびまゴルフの方もそれに会わせて短くなった.

シンボル:Foo=のinspect

p :Foo= # => :"Foo=" あれ,要らないダブルクォートが.

るびまゴルフ第5回

http://jp.rubyist.net/magazine/?0025-RubiMaGolf 現状.