はじめに タイトルにもあるようにRubyのbuiltin(正式名称を知らないので呼び出し方法から拝借)というものを使ってRuby自体をRuby(とC)で実装してみた話です。 内容としてはRuby自体の実装に興味のある方向けの話になります。 builtinって? builtinとはRuby(とC)でRuby自体を実装するというものです(正式な名前は今のところないみたい?)。以下のように__builtin_<Cで定義した関数名>をRubyのコードから呼び出すことでRubyとCを使い、より簡単にRubyの実装を行うことができます。 たとえば、Hash#deleteはCで以下のように実装されています。 static VALUE rb_hash_delete_m(VALUE hash, VALUE key) { VALUE val; rb_hash_modify_check(hash); val =
Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide" Copyright © 2001 by Addison Wesley Longman, Inc. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/)). Distribution of substantively modified versions of this d
概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Stop including Enumerable, return Enumerator instead | Arkency Blog 原文公開日: 2014/01/08 著者: Robert Pankowecki サイト: Arkency Blog 画像は元サイトからの引用です。 自分のクラスにEnumerableモジュールをincludeする人をむやみやたらと見かけます。しかし私としては多くの場合、Enumerableで使えるeach_with_indexやらtake_whileやらminmaxといったメソッドを自分のクラスの中で使えるようにすることがそのクラスの責務の中心にあるとは考えにくいのです。 私ならそのような場合、Java方式でやるのが好みです。つまり、コレクションでEnumerableのさまざまな便利メソッドのどれ
Rubyの拡張ライブラリの作り方¶ ↑ Rubyの拡張ライブラリの作り方を説明します. 基礎知識¶ ↑ Cの変数には型があり,データには型がありません.ですから,た とえばポインタをintの変数に代入すると,その値は整数として取 り扱われます.逆にRubyの変数には型がなく,データに型がありま す.この違いのため,CとRubyは相互に変換しなければ,お互いの データをアクセスできません. RubyのデータはVALUEというCの型で表現されます.VALUE型のデー タはそのデータタイプを自分で知っています.このデータタイプと いうのはデータ(オブジェクト)の実際の構造を意味していて,Ruby のクラスとはまた違ったものです. VALUEからCにとって意味のあるデータを取り出すためには VALUEのデータタイプを知る VALUEをCのデータに変換する の両方が必要です.(1)を忘れると間違った
C++側で定義されているクラスをmrubyに持ち込む方法を調べた。参考にしたのはmruby-time/time.cやmruby/C構造体組み込みを読む - Code Reading Wiki。正しいかどうかは保証できないけれど、一応ちゃんと動いているようです。 C++側になにかクラス class Hoge { public: Hoge(int x) : x_(x) { std::cout << "Hoge::ctor()" << std::endl; } virtual ~Hoge() { std::cout << "Hoge::dtor()" << std::endl; } int x() const { return x_; } private: int x_; }; があったとして、これをmruby側から扱いたい場合には、DATA型を使うといいようだ: #include <mruby
mrubyに任意の型のC言語の関数を登録するためのバインダを作りました。 mrubybind - Binding library for mruby/C++ 使い方は簡単で、mrubybind.hをインクルードしてMrubyBindというクラスのインスタンスを生成する。そして、あるC言語の関数foobarがあったとき、 #include "mrubybind.h" void init(mrb_state* mrb) { mrubybind::MrubyBind b(mrb); b.bind("foobar", foobar); } とすれば、mrubyからその登録した名前で呼び出すことができる。mruby側から渡した引数が自動的にCの関数に渡り、その関数からの戻り値がmruby側に戻る。関数をバインドした後はMrubyBindのオブジェクトは捨ててしまってokです。 以下は実装の説明。 m
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く