2007-01-01から1年間の記事一覧

構文解析(1)

最近,構文解析が流行っているらしい.rakeっぽく作ればいけるかも?と適当に作ってみた.まったく理解していないけど一応動くものは出来たっぽい?中国語の部屋状態.四則演算はるびまのsyntax.rbそっくりになってしまった.そして判りにくい.こんなんなら…

間接的にメソッドを呼び出す

def foo(x) p ["foo", x] end send( :foo, "send") #=> ["foo", "send"] v = "foo" send( :"#{v}", "send-v") #=> ["foo", "send-v"] m = method( :foo) m.call("method") #=> ["foo", "method"] p = lambda {|x| foo(x)} p.call("proc") #=> ["foo", "proc"…

クロージャ

def test() c = 0 a = Proc.new {|e| p [e,c]} c = 1 b = Proc.new {|e| p [e,c]} return a,b end a,b = test a[7] => [7, 1] b[8] => [8, 1] 関数a,bはcを共有するのか. 自分でクロージャを実装するとしたら,a,bで別々のcを持つようにするのか?と考えて…

三項演算子

三項演算子?:の正しい書き方自分の場合,式が短いとき,たとえばa=(flag)?2:3;とかでわざわざ分けないのは当然として, 長くなるようなら condition ? ture_expr : false_expr; って3行にすることが多いかも. condition? ture_expr : false_expr; 式の形状…

速度を測る(2)

http://d.hatena.ne.jp/iken0/20070712を1.9でも試してみた.2番目のW.times x2のやつで4.359secから1.406secまで短縮.Procを使わないやつで1.0secジャストになった.

速度を測る

ruby向きではない? W = 400 def update(as) as.each_with_index {|row,y| row.each_with_index{|c,x| yield( c, x,y) } } end def get_time() Process.times.utime end a = Array.new(W) { Array.new( W, 0)} old = get_time() 10.times { # 時間をはかるた…

アホなことをしたのでメモ

環境: ruby 1.8.5 i386-mswin32 ruby/SDL 1.3.0SDL.initを呼ぶ前に p SDL::WM.captionするとrubyごと落ちる.初めて[BUG]を見れた.まだの人は是非.(これを直すにはそこらじゅうのメソッドで初期化したかチェックしなきゃいけなくなるんだろうか?だとした…

リンクリストの探索

ポインタの無いrubyでどうやってリストを実現するのか?とgoogleに聞いてみたところ,ルート探索(2) - バリケンのRuby日記 - Rubyistを教えてくれた.ハッシュか配列に一意なキーを入れてそれで検索すればいいのか. #!ruby -Ks route_map = { :A => [:B, :D…

構造体を保存する

fname = 'words.dat' base = "BCDFGHJKLMNPQRSTVWXYZ" (1..rand(5)+10).inject(words=[]) {|w,i| w << (0..rand(10)+5).inject(str="") {|x,i| x << base[rand(base.size)] } } p words #=> "BJXNRN", "KTVRCZFZXJKCQZ", "NLDLHTMHF", "LGZRCSFGGTT", "KHNRN…

二重ループ(2)

callccを使いこなせないとダメらしいので,二重ループ - ロバの耳にcallccを突っ込んでみる.これでbreakしても二重ループから脱出しない.逆にreturnでも二重ループから脱出出来ない訳だが….でもそれもcallccで解決. def twin_loop(a,b) c = nil begin a.…

デストラクタ

class TestDestructor @@refcount = 0 @@filelist = [] # TestDestructorが開いているファイルのリスト def initialize _set_finalizer(nil) @@refcount+=1 end def _set_finalizer( data) ObjectSpace.undefine_finalizer(self) ObjectSpace.define_finaliz…

xmlファイルを読む

test.xml: <test> <head version="1.2.0" size="512"> </head> <foo index="0"> foobar0 </foo> <foo index="1" h="1"> foobar1 </foo> </test> require 'rexml/document' file = File.new( "test.xml" ) doc = REXML::Document.new file p doc.elements["test/head"].attributes["version"] #=> "1.2.0" p doc.elements["t…

xlsファイルを読む

暫定版 require 'win32ole' class OpenCalc def initialize @document = nil begin @manager = WIN32OLE.new("com.sun.star.ServiceManager") @desktop = @manager.createInstance("com.sun.star.frame.Desktop") rescue puts "OpenOfficeがインストールされ…

リアルハカーな人々のruby日記を見てると.ほとんど毎日のように知らないテクが出てくる.一体どれだけ俺の知らない機能があるというのか.

gresreg

#!ruby -Ks require "optparse" # エラーメッセージを表示して終了する def disp_error_exit( str) $stderr.puts str exit(2) end # fnameを上書きする def save_file( fname, strs) tmpname = fname + '.tmp' bakname = fname + '.bak' open( tmpname, 'w')…

二重ループ

def twin_loop(a,b) a.each {|x| b.each {|y| yield(x,y) }} end と書いてみたが, twin_loop(ARGF, rexs) {|l,x| if x =~ l puts "#{ARGF.filename} #{ARGF.file.lineno}:#{l}" flag_found = true break end } は ARGF.each {|l| rexs.each {|x| if x =~ l …

クリップボードを操作する

require "win32/clipboard" include Win32 str = Clipboard.data # クリップボードからデータを取得 str.upcase! Clipboard.set_data( str) # クリップボードに転送 p str # クリップボードのデータを消去 Clipboard.empty win32/clipboardはhttp://rubyforg…

おもいついた

a = str.scan(/.{1,4}/) # タブ幅4 a = a.map {|x| x.sub(/ +\z/,"\t") } puts a.join('') 相変わらず元の文字列にタブが混じっていると意図通りに動作しない.あと日本語が混じっててもダメそうな気が.タブを空白に,空白をタブに変える - ロバの耳にコピ…

手続き的

相変わらず,perl cookbookの内容をrubyで書き直す練習をしているんだけれど,手続き的な記述しか出来ないとかなり負けた気分になる. たとえばこんなコード: tab_size = 4 str = "test test test" a = str.split(/( +)/) p = 0 a = a.map {|x| if x !~ /( …

語彙

gaucheは左手という意味じゃなくて,不器用を意味していたのか.

多次元配列,多重配列

def nd_array( arg, init=0) lm = arg.size - 1 route = lambda {|x| Array.new( arg[x]) { (x

配列の内容をシャッフル

class Array def swap!(a,b) self[a], self[b] = self[b], self[a] self end def shuffle!() (1..size-1).each {|n| swap!( n, rand(n+1))} self end end a = (1..10).map {|x| x} p a.shuffle! #=> [6, 8, 7, 3, 10, 9, 4, 5, 2, 1] このコードはcくさいな…

循環リスト

class Array def circle_head() ret = self.shift() self.push(ret) ret end def circle_tail() ret = self.pop() self.unshift(ret) ret end end c = [1,4,6,8,9] 5.times { p c.circle_head()} 5.times { p c.circle_tail()} c/c++だったら,配列+どこを見…

配列をソート

p [1,2,2,3,4,6,1,3,7,8,9].sort #=> [1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9] # 指定の方法でソート a = [['xx', 16], ['yy', 8], ['xx', 10], [ 'zz', 12]] p a.sort #=> [["xx", 10], ["xx", 16], ["yy", 8], ["zz", 12]] p a.sort {|x, y| x[1] <=> y[1] } #=…

条件を満たす要素をすべて見つける

a = [1,2,2,3,4,6,1,3,7,8,9] p a.delete_if {|x| (x % 2)==0 } #=> [1, 3, 1, 3, 7, 9] p a #=> [1, 3, 1, 3, 7, 9] a = [1,2,2,3,4,6,1,3,7,8,9] p a.find_all {|x| (x % 2)==0 } #=> [2, 2, 4, 6, 8] p a #=> [1, 2, 2, 3, 4, 6, 1, 3, 7, 8, 9] p %w[red…

テストを通る最初の要素(の位置)を取得する

a = [1,2,2,3,4,6,1,3,7,8,9] p a.index(3); #=> 3 p a.index(5); #=> nil # bで始まる単語を探す b = %w[red green blue white black] p b.find() {|x| x=~/\Ab/} #=> "blue" 1.9以降では p b.index {|x| x=~/\Ab/} こういう書き方で,位置を取れるらしい.…

配列の複数の要素を処理する

配列から取り出す.基本編. a = [1,2,3,4,5,6,7,8,9] p a.shift #=>1 前から p a.pop #=>9 後ろから p a #=> [2, 3, 4, 5, 6, 7, 8] # 指定箇所から,指定個数取り出す a = [1,2,3,4,5,6,7,8,9] p a.slice!(3,3) p a 追加は,unshiftとpush2つ同時に取り出…

備忘録目次 - ロバの耳 逆引きRubyや他のblogが,#=>と書いていたので,# =>を#=>に変えてみたが,リファレンスのほうは# =>と#=>を混在させてるな.別にどっちでもいいのか?

インデックスでアクセス

(1..5).inject(a = []) {|x,y| x << (rand()*100).to_i} a.size.times {|x| p a[x]} a.each_index {|x| p a[x]}

配列を逆順にする

a = (1..10).map {|x| x } p a.reverse 参照:ファイルを行単位で逆向きに読む - ロバの耳