#include <mruby.h>
#include <mruby/proc.h>
#include <compile.h>
static mrb_value
oppailib_oppaifunc(mrb_state *mrb, mrb_value self) {
static int i = 0;
puts(i++ % 2 == 0 ?
" _ おっ \n"
" ( ゜∀゜) \n"
" ( ⊂彡 \n"
" | | \n"
" し ⌒J \n" :
" _ ∩ おっ \n"
" ( ゜∀゜)彡 ぱい\n"
" ( | \n"
" | | \n"
" し ⌒J \n");
return self;
}
int
main() {
int n;
mrb_state* mrb;
struct mrb_parser_state* st;
struct RClass *oppailib;
char* code =
"require 'Oppai' \n"
"Oppai.oppai().oppai().oppai().oppai() \n";
mrb = mrb_open();
oppailib = mrb_define_module(mrb, "Oppai");
mrb_define_class_method(mrb, oppailib, "oppai", oppailib_oppaifunc, ARGS_REQ(1));
st = mrb_parse_string(mrb, code);
n = mrb_generate_code(mrb, st->tree);
mrb_pool_close(st->pool);
mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
}
/* vim:set et ts=2 sts=2 sw=2 tw=0: */
ruby のAPIと若干形が異なるので、既存コードとか移植する人はいろいろあるかも。2012/04/20
mruby で自前の組み込み関数を呼び出してみた。
FizzBuzzに並んで有名な教育向けな題材、Acme::Oppaiです。
mruby(Lightweight Ruby) をプログラムに組み込んでみる
たぶんこれからガチャガチャ変わるので参考にはならない。まぁネタなので。あと殆ど tools/mruby の下にある物と同じ。
またAPIとか整理されてないので、コンパイルにはソースディレクトリを参照に含めたりする必要がある。
まぁ一般的な奴ですね。これからいろいろ出来る様になるんだろうけど、Lightweight を歌ってるのでどの辺が線引きなのか難しそう。
MinGW32 だと以下の様にしてビルド出来た。
またAPIとか整理されてないので、コンパイルにはソースディレクトリを参照に含めたりする必要がある。
#include <mruby.h>
#include <mruby/proc.h>
#include <compile.h>
int
main() {
int n;
mrb_state* mrb;
struct mrb_parser_state* st;
char* code =
"[1,2,3].each {|x| " \
" p x " \
"} ";
mrb = mrb_open();
st = mrb_parse_string(mrb, code);
n = mrb_generate_code(mrb, st->tree);
mrb_pool_close(st->pool);
mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
}
/* vim:set et ts=2 sts=2 sw=2 tw=0: */
mrb_open()
で状態遷移マシンを作り、文字列をパースして構文木を作る(mrb_parse_string()
)。yaccによるAST。その構文木からジャンプ命令等の実行コードを吐いて(mrb_generate_code()
)実行する(mrb_run()
)。まぁ一般的な奴ですね。これからいろいろ出来る様になるんだろうけど、Lightweight を歌ってるのでどの辺が線引きなのか難しそう。
MinGW32 だと以下の様にしてビルド出来た。
gcc -Iinclude -Isrc foo.c lib/ritevm.lib
2012/04/12
最近気に入ってるVimのキーマップ
Vimが他のエディタに比べて劣ると思われている一つに、ノーマルモードとインサートモードの行き来にオーバーヘッドがあるのでは無いかという主張。カーソルキー使ってる人は、ぜひこれでjkjkの練習でもして下さい。
まぁ確かに、移動する為にはノーマルモードに戻らなければならないし、例えば
まだお試し期間だけど、しばらく使ってみる。
まぁ
まぁ確かに、移動する為にはノーマルモードに戻らなければならないし、例えば
<script>_</script>
で _
にカーソルが合った場合、改行すると
<script>
_</script>
こうなってしまう。本来ここにjavascriptのコードを書こうと思ったら
<script>
_
</script>
こうなるのが正しい訳で、この形にしようと思うと
- 改行
- もう一度改行
- ノーマルモードに戻ってkで上に行ってiでインサートモード
<c-e>
に何も割り当ててなかったのでこんなのを追加してみた。
inoremap <c-e><c-h> <left>
inoremap <c-e><c-l> <right>
inoremap <c-e><c-k> <up>
inoremap <c-e><c-j> <down>
inoremap <c-e>O <esc>O
inoremap <c-e>o <esc>o
inoremap <c-e><c-e> <esc>A
inoremap <c-e><c-a> <esc>I
インサートモードのまま上下左右、上方改行挿入、下方改行挿入、行末移動、行頭移動が行える。2シーケンスを要するけど、ぶっちゃけ2シーケンス以上必要な場所への移動ならノーマルモードに戻っても大差無いなーと思った。まだお試し期間だけど、しばらく使ってみる。
<c-o>
使えばいいじゃんって話なんですが、まったくその通り。いかんなemacs病か。まぁ
<c-e><c-a>
と<c-e><c-e>
だけは片手で使えて便利かも。