Ruby

Emacsのruby-modeのシンボルの色付けがおかしい件

インスタンス変数やクラス変数,グローバル変数,定数のシンボルを書こうとすると,シンボルの色付けにならない.はてなの色付けはちゃんとやってくれるけど. :Foo :@foo :@@foo :$foo :Foo= 以下のように応急処置した.もっといい方法があるかもしれない.…

るびまゴルフ第4回

るびま 解った気がする.2個目のほうは,これより短くなるということなんだろうか.

anarchy golf - numof 1 bits in 0 to 255

anarchy golf - numof 1 bits in 0 to 255 33バイトで頑張ったなぁと思ってたら,kskさんのコードがcoolすぎて感動した.美しい.これぞgolf. なんかleonidさんがもっと短いのいれてるけどそっちは見てない.2回戦始まるなぁ.

デフォルトブロックはまだか!引数の話

def f(&b=proc{|x| x }) b end 予想はしてたけど,こんな感じのことはどうやら書けない. -:1: syntax error, unexpected '=', expecting ')' def f(&b=proc{|x| x }) ^そこで,こうした. def f(&b) b ||= proc {|x| x } end 引数といえば,引数が0個の時と…

代数的データ型がほしくて

作った. # 前略 Maybe = algebraic(:nothing, :just, Object) def foo(y) puts match(y) { _(:just) {|x| "Just #{x}" } _ { "Nothing" } } end foo Maybe.new(:just, 42) foo Maybe.new(:nothing) Just 42 NothingCool!

Proc#iterateてのを考えた.

Haskellのiterateにインスパイアされて. class Proc def iterate(init) if block_given? loop { yield(init) init = call(init) } else to_enum(:iterate, init) end end end p proc {|x| x + 1 }.iterate(0).take(10) # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]…

to_procで生成したProcにブロックが渡されない?

p :select.to_proc.call([1,2,3]) {|x| x.odd? } # => #<Enumerable::Enumerator:0x574cc> な,なんだってー! class Symbol def to_proc proc {|obj, *args, &block| obj.send(self, *args, &block) } end end p :select.to_proc.call([1,2,3]) {|x| x.odd? } # => [1, 3] ブロックがブロッ</enumerable::enumerator:0x574cc>…

Cでリストライブラリ製作

car,cdr,append,reverse辺りまで作った所.でもinspectだけはRubyで書いた. irb:0> a = List.new(1,2,3) => (1 2 3) irb:0> b = List.new(a,a,a) => (#0=(1 2 3) #0# #0#) irb:0> b.cdr = b => #0=((1 2 3) . #0#) irb:0> List.new(a,b,b) => (#0=(1 2 3) #…

Cで拡張ライブラリ(2)

Rubyのバージョンを上げたからか,いつのまにかmakeが通るようになっていた.Macだと,拡張子が.soじゃなくて.oで出来上がるみたい.Rubyの拡張ライブラリの書き方は,Rubyのソースを展開したディレクトリにあるREADME.EXT.jaやhttp://i.loveruby.net/w/Ruby…

irbの設定(2)

前の日記の訂正. :PROMPT_Nはインデントが深くなってる時に呼ばれるみたい.継続行については:PROMPT_Cであってる. require "irb/completion" IRB.conf[:PROMPT][:KAKI] = Hash.new {|ht, key| key.inspect }.merge({ :PROMPT_I => "%N:%i> ", :PROMPT_N =…

特異クラスのsuperclass

特異クラスのスーパークラスのスーパークラスは,特異クラスのスーパークラス自身? irb:0> class Object; def metaclass; class << self; self; end; end; end => nil irb:0> metaclass => #<Class:#<Object:0x38950>> irb:0> p self main => nil irb:0> metaclass.superclass => #<Class:#<Class:#<Object:0x38950>></class:#<class:#<object:0x38950></class:#<object:0x38950>…

irbの設定ファイル

irbの設定ファイルなるものが存在すると知ったので,早速カスタマイズしてみた. ~/.irbrcというファイルに書くといいらしい.で,作ろうと思ったら既にあったので中を見てみると, require "irb/completion" おお,もうなんか書いてある.どうやら,これで…

Ruby1.8.7挙動クイズ(2)

好評につき第2弾.以下のコードはそれぞれどのような挙動をするか? def foo yield end p method(:foo).call { 3 } def foo yield end p method(:foo).to_proc.call { 3 }

Symbol#pa

[123, 456, 789].map {|i| i.to_s } [123, 456, 789].map(&:to_s) Symbol#to_procを初めて見た時は喜んでた.確かにこれは素晴らしいけど,じゃあto_sに引数を渡したい時は…? [123, 456, 789].map {|i| i.to_s(16) } &:to_sで書いてて,後から↑みたいに直さ…

Ruby1.8.7挙動クイズ

以下のコードはそれぞれどのような挙動をするか? def foo yield end p foo {|&b| b } def bar &b b.call end p bar {|&b| b }

いろいろインストール

なんとなく,miにRubyモードを入れてみた.普段はCarbon Emacs使ってるんだけどね.golfの時には,Emacsだと最後に改行が自動挿入されるからmiも使ってたりする.Emacsの設定をすればいいのかもしれないけど. Rubyのバージョンを1.8.6のままにしておいたの…

IOクラスの素朴な疑問

なんで入力と出力が同じクラスなの?

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

$_の長さが~/$/で得られることと,引数無しpが何も出力しないことを知ったので,4/12の日記より短くなった.39byte. #!ruby -pal $><<[$.,$F.size,~/$/,p]*" "

演算子とブロック

演算子はブロックを受け取れないようだ.勿論,メソッド形式で呼び出せば,ブロックを渡すことができる.Procにブロックを渡す時は,callで呼ぶべきなのかな.

Ruby1.8.7の新機能@いくつか実装してみた

今まで,Schemeで (take (circular-list 1 2 3) 10) とか書いてたことが,Rubyで [1,2,3].cycle.take(10) と書けるようになった.これは嬉しい. Object#tapも早速乱用. module Enumerable def group_by Hash.new {[]}.tap {|ht| each {|i| ht[yield(i)] <<…

Ruby1.8.7の新機能

Ruby 1.8.7ではRuby 1.9からのbackportがとても多い。つまり、Ruby 1.9のあのメソッドがRuby 1.8でも使えるようになったということだ!! http://d.hatena.ne.jp/rubikitch/20080508/ruby187 これは凄い!まず何より,1.8でブロックがブロックを受け取れるよ…

attr_accessorとinstance_variable_get

attr_accessorに渡すのは:var instance_variable_getに渡すのは:@var これおかしいよね?instance_variable_getも:varでいってほしいなぁ. attr〜は定義するメソッド名を表すシンボルで,instance〜はインスタンス変数名のシンボルだという意味なのかもしれ…

1.8では,define_methodでブロックを受け取るメソッドは定義できない?

define_method(:foo) {|*args, &block| #何か処理 } と書きたいんだけど,syntax errorになってしまう.define_methodではブロックを受け取るメソッドは定義できないのかなぁ. define_method(:foo) {|*args| block = proc rescue nil #何か処理 } これでで…

FixnumとSymbolのインスタンスはfreezeできない?

p 1.freeze.frozen? # => false p :foo.freeze.frozen? # => false なんか嫌だなぁ. class Fixnum attr_accessor :a end 3.a = 5 p 3.a # => 5 インスタンス変数持てるのか.知らなかった.じゃあなんでfreeze情報は保存されないんだろう? よく考えたら,i…

るびまゴルフ第3回

問題解いてみた.

Struct#membersが文字列の配列を返すのはどうなの?

Hoge = Struct.new(:foo, :bar, :baz) p Hoge.members # => ["foo", "bar", "baz"] Struct.newに渡したのはシンボルなのに,Struct#membersで文字列の配列が返ってくる.ここはシンボルの配列が返ってきて欲しいものじゃないのかなぁ?こういう時こそシンボ…

unfoldとブロックと多値

RubyでListライブラリの続き. unfoldを作ってみたんだけど,procを3つも渡さないといけないので面倒.Rubyは1つしかブロックが渡せないからなぁ. unfold(proc {|i| i == 10}, proc {|i| i * 2}, proc {|i| i + 1}, 0) # => (0 2 4 6 8 10 12 14 16 18) そ…

Cで拡張ライブラリ

を書こうとしたんだけど,makeでよく解らんエラー出たので後回しにして,RubyでListライブラリを書くことに.carやcdrを使ってScheme的に書けるようにするのが目標.

関数オブジェクトとMethod/UnboundMethodオブジェクト

foo = new Object(); foo.hoge = function () {print(this)}; fuga = foo.hoge piyo = function () {foo.hoge()}; fuga.call(foo) piyo() このfugaとpiyoは違うんだよね.JavaScript的には当然なんだろうけど.ただの関数オブジェクトだから. どっちかとい…

無限リストの代替

ただ単に,無限の範囲を扱えればいい場合はRangeでOK. p (1..(1/0.0)).each {|i| break i if i * i > 1000} でも,例えば3or5の倍数の無限リストみたいなのが欲しいときは,この方法では無理っぽい. Infinityを表す定数が見つからなかった.どなたかご存知…