Ruby
カリー化きたー。応援してます。標準に入らないかなぁ。 (追記) 入ったぽいです。
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)変換とは何か? - 言語ゲームをRubyで写経してみました。Rubyでは末尾再帰が最適化されないので、わざわざCPS変換で書く意味はないと思います。しかしCPS変換で書かれたプログラムってすんなりと理解できるものなのでしょうか? 僕にはまだ…
先日参加したびわこ開発合宿#2の成果をリリースしました。ダウンロードはこちらからお願いします。 Google Code Archive - Long-term storage for Google Code Project Hosting. 主な追加機能・要素は、mygame等を使ったIOまわりの実装、Rubyの言語内DSLを使…
Route 477(2008-01-21) うわー、関西会場があるんだったら参加したいです! 限られた時間でHaskellはとてもできないので、どの辺を作るか的をしぼった方がよさそうですね。例えば、型推論まわりとかLazyな評価器とか。。。 僕はLazyな評価器の辺が興味があり…
早速、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…
Sassy - Scheme で書かれた x86 アセンブラ - higepon blog Schemeで実装されたx86アセンブラです。僕もRubyで書いてみたいなぁ。
[ruby] cutagem - 生活。 おー。newgemはいろんなファイルができてシンプルじゃないなぁと思っていました。そのうち僕も試してみます。
固定長の配列をぐるぐる使い回すデータ構造を実装してみました。真面目にindexで次の格納場所を管理しています。配列をpush、shiftするだけの素朴な実装と性能がどれくらい違うのでしょう。そのうち確認しようと思います。 あと、Arrayだと[]メソッドにRange…
第22回 Ruby/Rails勉強会@関西のセッションでやった問題を僕も解いてみました。問題はこちらです。
日本Rubyの会 公式Wiki - KansaiWorkshop22
Route 477(2008-01-10) 釈迦に説法のような気もしますが、力尽きていらっしゃるようなので。 まず普通にstring_ltを実装してみます。で、これの文字列の比較部分だけを変更して、その他の部分を共有する方法について考えてみます。 def string_lt(*strs) (1 …
Rubyで8ビットCPUを作る - 趣味的にっきをベースにもうちょっと作り込んでみたいなぁと思って、Google Codeにプロジェクトを申請してみました。安直過ぎるような気もしますが、名前はhati(はち)です。内容はまだまだこれからです。 Google Code Archive - Lo…
日本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…
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演算子を利用すればビット配列を直接扱うこ…
Perl で 8ビット CPU を作る - naoyaのはてなダイアリー うわー、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 is released これに合わせてるりまもリリースされています。 「Rubyリファレンスマニュアル刷新計画」1.9.0リリース
lambdaを生成する関数を多用すると、pで出力したlambdaが一体何をするlambdaなのかわかりにくくなる場合があります(通常lambdaをinspectするとファイル名と行番号は表示されるのですが、lambdaを生成する関数経由で生成すると同じファイル名、行番号になって…
このところSKIコンビネータで遊んでいたのですが、そういえばSKIコンビネータをベースとしたunlambdaって関数型言語があったなぁ思い出しました。ということでちょー簡略版のunlambdaを実装してみました。組込み関数は.x、r、i、k、sのみ実装しています。 re…
でてます。あとで読みます。
ブロックの引数の数から入れ子の回数がわかるので、nlambdaの引数nは別にわざわざ指定しなくてもいいことに気が付きました。 それはそれとして、Proc#arityのarityの語源って何なんでしょ? 他言語でも引数の数を表現するのにarityって使っているみたいなん…
[ruby-dev:32622] binding of caller おー、これは。ついにきたー。取り込まれるといいなぁ。
関数適用の演算子を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…