ImmutableList gem とは

Immutable な LinkedList を Ruby で使うためのライブラリです。

C-Extension なので、Rubyで実装したものに比べて動作が高速です。

Ruby の Array は 配列で実装されているため、 長いリストでの先頭への要素を追加(cons)や連結(append)が とても遅いという問題を解決しようと思って作りました。

用途としては、Rubyで再帰を使って関数型言語風にプログラムを組むことを想定しています。

Immutable List Gem (KLab ALM版) from Sho Hosoda

導入方法

RubyGems で公開したので、次のようにターミナルで入力するだけで導入できます。

$ gem install immutable_list

Read more


追記 10⁄7 RubyGemsとして公開。クラス名はImmutableListに変更。 RubyGems.org README(GitHub) 10⁄22 クラス名が変わったり、この記事では説明不足の部分があったので、記事を書き直しました。 Rubyで関数型プログラミングをするための ImmutableList Gem を公開 はじめに RubyのC拡張として LinkedList (連結リスト) を実装しました。 Ruby の Array は 配列で実装されているため、長いリストでの先頭への要素を追加(cons)や連結(append)が非常に遅いのをなんとかしたいと思いました。 用途としては、Rubyで再帰を使って関数型言語風にプログラムを組むことを想定しています。 ソースコードはGitHubに置きました。 gam0022/linkedlist (GitHub) 車輪の再発明じゃないの? gem search linked_list で調べてみたところ、次の2つのgemが見つかりました。 circular_linked_list (0.0.1) linked_list (1.0.0) しかし、どちらも Ruby で実装されていたので、Cの拡張として実装し直す意味はあるのではないかと思います。 使用例 OCaml の List に影響を受けて実装したので、次のようなメソッドがあります。 cons head tail rev_append rev append length nth また、Ruby風の名前の文字列や配列への変換、空リストの判定をするメソッドもあります。 inspect(to_s) to_a empty? 動作確認 以下のような動作をします。 require ‘linkedlist’ p LinkedList.

Read more


ぼっちupcamp #upcamp に参加しようと思ったのですが、 諸事情により行けなくなったので、一人で何か作ってました。 Ruby の 処理系の動作の改良(改悪)をしていました。 Ruby は git clone https://github.com/ruby/ruby.git で落としたものを使いました。 Thread#join で タイムアウトしたときに例外を発生させる Thread#joinは、 スレッド self の実行が終了するまで、カレントスレッドを停止させるメソッドです。 limit を指定して、limit 秒過ぎても自身が終了しない場合、nil を返します。 今回は、limit 秒を過ぎてタイムアウトした場合、 例外Timeout を発生させるように改造しました。 正直、自分でもネタをミスった感がありますが、 すこしはタイムアウトした場合の処理が楽に書けるようになる気がします。 従来のRubyの Thread#join でタイムアウトを処理する まず、従来のRubyの Thread#join でタイムアウトを処理する場合のコード例を示します。 Thread#joinの返り値が nilのときにタイムアウトしたと分かるので、 このように書けると思います。 begin t = Thread.start { # 1秒で終わらない処理 while true 1 end } isTimeout = (t.join(1) == nil) rescue ThreadError puts "theread error" ensure puts "timeout error" if isTimeout t.kill end # => "timeout error" 改造したRubyの Thread#join でタイムアウトを処理する 今回の改造によって、次のようにRubyのコードをスッキリさせることができます。

Read more