風来日記

はてなダイアリーリファラを詳細に記録してくれているが故に、d.y.d.からのアクセスが急増しているのもわかってしまって、脇に逸れるのがプレッシャー…。
それでも逸れるのが人間だ。そうに違いない。
もう何年も経ってしまいましたが、GB版の風来のシレン2「砂漠の魔城」、ようやっと最果てに到達しました。GBとはいえ、99階潜るのは集中力要りますので、少しずつ慎重に進めて何日もかけました。疲れた。

続きを読む

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"が入力された式の引数として巻き込まれないように括弧。
まずブロックを丁寧にやるべきなのでしょうが、中置演算子の優先順位の括弧がそのままデータ構造になってしまっているのを見たあたりで微妙にやる気なし。中置演算子や括弧は構文糖で内部では全部前置記法に直されていたらかっこよかったのに。

C++0x

新バージョンの年の下一桁を埋めておく文字は何故C/C++はxでAdaはyなのか、という疑問はさておき*1C++に疎い小生かなり時代遅れでC++の改定の話を知りましたのでメモを残そうとしたら、これがいつもの癖で好き勝手書いてみたくなりましたので書きます。
墓下で狂勇者を眺めてるような気分でお読みください、いやむしろ読むな。

*1:あ、16進数にかけてる?まあどうでもいいです。

続きを読む