yhara.jp

Recent Posts

A collision between Yard and FactoryGirl

2016-12-27
Tech

Today I encountered a curious error on running tests of a Rails app.

(snip)/gems/yard-0.8.7.6/lib/yard/globals.rb:16:in `log': wrong number of arguments (given 1, expected 0) (ArgumentError)

Solution

I did not indend to use yard while testing. By checking Gemfile.lock, I found pry-doc was the only gem depends on yard. The error was removed by fixing Gemfile to exclude pry-doc from the "test" group.

(more...)

BiwaSchemeのためにCPS(継続渡し形式)でマージソートを実装した話

2016-12-25
Tech

本記事は言語実装 Advent Calendar 2016の最終日の記事です。話題が多岐に渡っていて楽しいアドベントカレンダーでしたね。前日はEgisonのリーマン幾何学用記法の話でした。

BiwaSchemeは筆者が作っているJavaScriptによるScheme実装です。先月の話ですが、list-sortという関数を修正し、比較に使うScheme関数を受け取れるように改善しました。BiwaSchemeは中間言語方式(VM方式)かつライブラリを全てJSで実装するという方針になっているため、実装に少し工夫が必要でした。本稿ではそのことについて解説します。

中間言語方式

JavaScriptでScheme処理系を実装する場合、いくつかの方針が考えられます。

  1. インタプリタ方式 (S式を一つずつ読み、評価する)
  2. コンパイラ方式 (プログラム全体を等価なJavaScriptに変換する
(more...)

Rubyで競技プログラミング

2016-12-25
Tech

この記事はRuby Advent Calendar 2016の最終日の記事です。

発端

秋に行われたRubyKaigi 2016のあとのAfter partyで、以下のような発表をしました。

内容は、会社の同僚と一緒にRubyでAtCoderをやっているという話でした。AtCoderはオンラインで競技プログラミングができるサイトで、Rubyを含めたさまざまな言語で参加することができ、過去問についても解答を受け付けているため好きなときにチャレンジすることができます。

(more...)

Opalでゲームを作るには(opal-phaser)

2016-12-21
Tech

この記事はOpal Advent Calendar 2016Ruby Game Developing Advent Calendar 2016の21日目の記事です。

OpalはRubyスクリプトをJavaScriptに変換してくれる処理系です。ということは、Opalを使えばRubyを使ってブラウザで動くゲームが作れるはずです。

opal-phaser

opal-phaserはPhaserというブラウザゲーム用ライブラリをOpalから使えるようにしたものです。今回はこれを触ってみたいと思います。

サンプルを動かしてみる

(more...)

Opalのハッシュはどのようにして実装されているのか

2016-12-19
Tech

本記事はOpal Advent Calendar 2016の19日目のエントリです。

今回はOpalのHashクラスの実装について見ていきます。

corelib/runtime.js

opal/corelibは、array.rbやstring.rbなど、組み込みクラスの実装が置かれているディレクトリです。この中に一つだけ、runtime.jsという、拡張子が.jsのファイルがあります。

runtime.jsはコンパイル後のJavaScriptの一部としてそのまま埋め込まれます。クラスの生成定数の探索といった処理系の基礎となる機能が実装されており、Opalの心臓部といえるでしょう。

(more...)

Opalはどうやってmethod_missingを実装しているのか

2016-12-17
Tech

本記事はOpal Advent Calendar 2016の17日目の記事です。

OpalはRubyからJavaScriptへのコンパイラです。今回はRubyの黒魔術の一つであるmethod_missingの実装について見ていきます。

method_missingとは

Module#method_missingは、あるオブジェクトに対して定義されていないメソッドを呼び出したときに走るフックを定義する機能です。

class A
(more...)

Opalはどうやってmethod_missingを実装しているのか

2016-12-17
Tech

本記事はOpal Advent Calendar 2016の17日目の記事です。

OpalはRubyからJavaScriptへのコンパイラです。今回はRubyの黒魔術の一つであるmethod_missingの実装について見ていきます。

method_missingとは

Module#method_missingは、あるオブジェクトに対して定義されていないメソッドを呼び出したときに走るフックを定義する機能です。

class A
(more...)

OpalはどうやってRubyコードをパースするか

2016-12-13
Tech

本記事はOpal Advent Calendar 2016の13日目の記事です。

11日目のエントリではOpalのString以外クラスを読むと書いたのですが、実際読んでみるとあんまり解説することがない(Stringの回と似たような内容になってしまう)ことに気づいたので、今回はパーサを読むことにしました。

パーサはどこにある?

OpalはRubyからJavaScriptへのコンパイラです。コンパイラなのでパーサはホスト側言語(=Ruby)にあれば良い…と思いきや、Opalにはevalがあります。Kernel#evalが呼ばれた場合、Opalプログラムのパースを「実行時に」行う必要があります。このためパーサはJavaScriptかOpal自身で実装されていると予想できます。

ということを念頭に置きつつ、githubでparserで検索してみます。どうもlib/opal/parser.rbがそれのようです。あれ、lib以下ということはRuby用なのか?と一瞬思いましたが、if RUBY_ENGINE == 'opal'という行があるので、RubyでもOpalでも動かせるようにしてあるようです。

(more...)

OpalのStringクラスはどのような実装になっているのか

2016-12-11
Tech

これはOpal Advent Calendar 2016の11日目の記事です。

OpalのAdvent Calendarは今年が初めてということで、Opalのソースを少し読んでみたいと思います。今回はStringクラスです。

string.rb

Opalの組み込みクラスのソースはopal/corelib以下にあります。

https://github.com/opal/opal/blob/7310b27a1c6bec135610e5df5f20753eb349965e/opal/corelib/string.rb

(more...)

Opalはいかにしてrubyspecをいい感じにアレしているのか

2016-12-07
Tech

OpalはJavaScriptで書かれたRuby処理系です。OpalではArray#findといった組み込みライブラリもJavaScriptで再実装しているので、テストが膨大な数になりそうですが、そのあたりはどうしているのでしょうか。

ruby/spec

Rubyにはruby/specというテストスイートがあります。これは、CRubyやJRubyなど複数の処理系間で挙動を揃えるために作られたものです。READMEにあるようにもとはRubySpecという名前でしたが、現在はThe Ruby Spec Suiteというのが正式名称になっています(が、カジュアルには今でもrubyspecといえばこのruby/specを指すことが多いようです)。

Opalはこのrubyspecをテストとして使うことで、テストを0から書く手間を省きつつ、他の処理系との互換性を担保しています。

Opalとrubyspec

(more...)

Posts

(more...)

Articles

(more...)

Category

Ads

About

About the author