RebolコンソールをRebolで記述
Rebolのコンソールウィンドウは便利といえば便利なのですが、コマンドプロンプト上で動くインタプリタが欲しい気分のときもあります。
eval相当のdoがあるのですからあっさり書ける…と思いきや。
REBOL []
take1: func [x y][x]
forever [
prin ">> " a: input
ok: false
unset 'r
error? try [
r: do join join [take1] (bind to-block rejoin ["(" :a ")"] 'a) [ok: true]
]
either not ok [
print "error!"
][
if value? 'r [prin "== " probe r]
]
]
...>rebol -wq shell.r >> 1 + 1 == 2 >> rejoin ["x" "y" "z"] == "xyz" >> print 100 100 >> z: 1 error! >> :z error!
bindが無いと組み込み関数が使えません。
変数は、bindでもだめでした。もっとブロックの評価ルールに詳しくならないと駄目なのでしょうね。
"error? try"は、printのように値を持たない(ということは無いのでしょうが関数には渡せても変数には代入できない特殊な値がある様子です)式が渡されると、rに結果を受け取っているところでエラーですのでその対策。また成否はrへ代入を行う前の時点で判断しています。"ok: true"が入力された式の引数として巻き込まれないように括弧。
まずブロックを丁寧にやるべきなのでしょうが、中置演算子の優先順位の括弧がそのままデータ構造になってしまっているのを見たあたりで微妙にやる気なし。中置演算子や括弧は構文糖で内部では全部前置記法に直されていたらかっこよかったのに。