Ruby

Suggestion: Proc#curry

カリー化きたー。応援してます。標準に入らないかなぁ。 (追記) 入ったぽいです。

関数leaf-countのCPS変換

http://practical-scheme.net/docs/cont-j.htmlから関数leaf-countのCPS変換をRubyでやってみました。やっぱりこんがらがるなぁ。 def leaf_count(tree) if tree.is_a?(Array) leaf_count(tree[0]) + leaf_count(tree[1]) else 1 end end p leaf_count([1, […

CPS変換

継続渡し形式(CPS)変換とは何か? - 言語ゲームをRubyで写経してみました。Rubyでは末尾再帰が最適化されないので、わざわざCPS変換で書く意味はないと思います。しかしCPS変換で書かれたプログラムってすんなりと理解できるものなのでしょうか? 僕にはまだ…

Hati - Rubyで作る8bit CPUエミュレータ 0.1aリリース

先日参加したびわこ開発合宿#2の成果をリリースしました。ダウンロードはこちらからお願いします。 Google Code Archive - Long-term storage for Google Code Project Hosting. 主な追加機能・要素は、mygame等を使ったIOまわりの実装、Rubyの言語内DSLを使…

Haskell Hackathon

Route 477(2008-01-21) うわー、関西会場があるんだったら参加したいです! 限られた時間でHaskellはとてもできないので、どの辺を作るか的をしぼった方がよさそうですね。例えば、型推論まわりとかLazyな評価器とか。。。 僕はLazyな評価器の辺が興味があり…

Compiling to Gcode

早速、G-machine COSC406 Compiler Implementation Techniques p.16-18のCompiling to GcodeをRubyで実装すると、こんな感じかな? def comp_sc(f, xs, e) # p [:comp_sc, f, xs, e] xs1 = xs.inject([{}, 0]) {|(h, i), x| h[x] = i; [h, i + 1] }.first co…

この間作ったリングバッファを軽くベンチマークしてみました

リングバッファを作ってみました - 趣味的にっき ベンチマークのコードは以下。 require 'benchmark' Benchmark.bm(12) do |x| x.report('RingBuffer') do buf = RingBuffer.new(10000) 100000.times do |i| buf << i end end x.report('Array') do buf = Ar…

Rubyでアセンブラ書きたい

Sassy - Scheme で書かれた x86 アセンブラ - higepon blog Schemeで実装されたx86アセンブラです。僕もRubyで書いてみたいなぁ。

cutagem

[ruby] cutagem - 生活。 おー。newgemはいろんなファイルができてシンプルじゃないなぁと思っていました。そのうち僕も試してみます。

リングバッファを作ってみました

固定長の配列をぐるぐる使い回すデータ構造を実装してみました。真面目にindexで次の格納場所を管理しています。配列をpush、shiftするだけの素朴な実装と性能がどれくらい違うのでしょう。そのうち確認しようと思います。 あと、Arrayだと[]メソッドにRange…

ショートな課題でジャムプログラミングの問題を解いてみました

第22回 Ruby/Rails勉強会@関西のセッションでやった問題を僕も解いてみました。問題はこちらです。

第22回 Ruby/Rails勉強会@関西に参加しました

日本Rubyの会 公式Wiki - KansaiWorkshop22

関数を返す関数っていつ使うの

Route 477(2008-01-10) 釈迦に説法のような気もしますが、力尽きていらっしゃるようなので。 まず普通にstring_ltを実装してみます。で、これの文字列の比較部分だけを変更して、その他の部分を共有する方法について考えてみます。 def string_lt(*strs) (1 …

Hati - Rubyで作る8bit CPUエミュレータ

Rubyで8ビットCPUを作る - 趣味的にっきをベースにもうちょっと作り込んでみたいなぁと思って、Google Codeにプロジェクトを申請してみました。安直過ぎるような気もしますが、名前はhati(はち)です。内容はまだまだこれからです。 Google Code Archive - Lo…

第22回 Ruby/Rails勉強会@関西の案内が公開されています

日本Rubyの会 公式Wiki - KansaiWorkshop22 残念ながら所用のため懇親会には参加できません。勉強会のみの参加です。皆さま、よろしくお願いします。

文字列の繰り返し

文字列の繰り返し - 冬通りに消え行く制服ガールは✖夢物語にリアルを求めない。 - subtech Rubyで書くとこんな感じでしょうか? あれば便利そうです。 class String def repeat(n, sep = '') return '' if n < 1 Array.new(n, self).join(sep) end end p 'ho…

Rubyで8ビットCPUを作る

Perl で 8ビット CPU を作る - naoyaのはてなダイアリー octopusをRubyで実装してみました。IO関係、オプションまわりの処理は省略しています。できるだけRubyらしいプログラムを目指してみました。あんまりトリッキーな実装はしていません。

[]=メソッドの返り値

Rubyでは、=メソッドを自分で定義できるのですが、どうもメソッドの中でreturnした値は無視されるぽいです。そういうもの? んー、=メソッドの中でエラーが発生したら例外で返すべきか。ちなみにRubyのバージョンは、ruby-1.8.6-111[i386-mswin32]です。なお…

ビット配列をクラスライブラリにしてみました

エラトステネスの篩とビット配列 - 趣味的にっきの続きです。 使い易いようにビット配列をクラスにしてみました。配列の長さが足りないときは自動的に拡張するようにしています。インデックスに負数を入れると例外が発生するようにしています(これはRubyぽく…

エラトステネスの篩とビット配列

UNIX Magazine 2000/01のPERL ADVISOR 26には、エラトステネスの篩で素数を求める際に、素数かどうかを覚えておくためのビット配列を使って省メモリ化している例が載っています。よく知らないのですが、Perlではvec演算子を利用すればビット配列を直接扱うこ…

8ビット CPU を作る

Perl で 8ビット CPU を作る - naoyaのはてなダイアリー うわー、Rubyで作ってみたい欲がわいてきました。その内着手すること。

はてなダイアリーライター(ruby版)

がリリースされました。ぱちぱち。 [ruby] はてなダイアリーライター(ruby版)をリリースしました。 - 生活。 僕もWindows版の製作に少しだけ協力しています。 ここ10ヶ月くらい開発があまり進んでいなかったのですが、それをやりかけにせず「リリースとして…

チャーチ数

チャーチ数を使うとλを使って自然数を表すことができます。詳しくは、ラムダ計算ABCを参照してください。 で。以下の関数curried_lambdaを使うと、 def curried_lambda(n = -1, xs = [], &f) n = f.arity if n < 0 if n == 0 f[*xs] else lambda {|x| cur…

Ruby 1.9.0リリース

ついにでました。ホントにお疲れ様でした。 Ruby 1.9.0 is released これに合わせてるりまもリリースされています。 「Rubyリファレンスマニュアル刷新計画」1.9.0リリース

名前付き無名関数

lambdaを生成する関数を多用すると、pで出力したlambdaが一体何をするlambdaなのかわかりにくくなる場合があります(通常lambdaをinspectするとファイル名と行番号は表示されるのですが、lambdaを生成する関数経由で生成すると同じファイル名、行番号になって…

ちょー簡略版unlambda

このところSKIコンビネータで遊んでいたのですが、そういえばSKIコンビネータをベースとしたunlambdaって関数型言語があったなぁ思い出しました。ということでちょー簡略版のunlambdaを実装してみました。組込み関数は.x、r、i、k、sのみ実装しています。 re…

るびま

でてます。あとで読みます。

SKIコンビネータでSKK = I(Ruby版)そのよん

ブロックの引数の数から入れ子の回数がわかるので、nlambdaの引数nは別にわざわざ指定しなくてもいいことに気が付きました。 それはそれとして、Proc#arityのarityの語源って何なんでしょ? 他言語でも引数の数を表現するのにarityって使っているみたいなん…

Binding.of_caller

[ruby-dev:32622] binding of caller おー、これは。ついにきたー。取り込まれるといいなぁ。

SKIコンビネータでSKK = I(Ruby版)そのさん

関数適用の演算子をProcクラスに追加してみました。とりあえずこんなところにしておこうと思います。 def nlambda(n, xs = [], &f) if n <= 0 f[*xs] else lambda {|x| nlambda(n - 1, xs + [x], &f) } end end class Proc def *(x) self[x] end end I = nla…