ちゃんと馬場くんからのreturn valueが取れるようになった。

BabaScriptはコンピュータが得意な事はコンピュータが実行し、人間が得意な処理は馬場くんが実行するプログラム言語です。
メタプログラミングでRubyを拡張して人間への命令を送るための構文を追加し、人間を関数と同等に扱えるようにするスマホアプリと連動させます。
世界一柔軟で好意的に解釈してくれるプログラム言語BabaScriptを作りました

% gem install babascript
% baba --help


こういうのが実行できるようになった。

sample.bb
res = かず助に行きたい人の出欠取ってください
puts res # => "6人です"
loop do
num = res.to_i
if num > 0
puts では予約してください("#{num}人")
exit
else
res = 残念・・その次の週はどうですか?
puts res
end
end

% baba sample.bb

日本語で書いた部分が馬場くんが実行する関数として呼び出され、馬場くんから結果が返ってくるまでブロックされるようになりました。



rubyでもbabascriptからの命令を受けれるツールも追加した(開発に便利なので)
baba-vmコマンドでterminalでbabaになれる。


実装

インフラに使っているWeb版LindaRubyクライアントを拡張した。

今までread/take命令はコールバック登録するしかなかったが、コールバック関数を登録しなかった場合はタプルが得られるまでブロックするようにした。
EM::defer do
loop do
tuple = ts.take [1,2]
puts "blocking take #{tuple}"
end
end
コールバック関数を登録すれば今までどおり非同期に動く。なかなか良い仕様だと思う。