ステップ実行eval開発中(1)

とりあえず手続き類は問題無く動くようになった。
しかし、マクロとspecial formの評価時に割り込み処理を入れるのが難しい。
マクロとspecial formには割り込み処理を入れない事にすると、当初に想定していた利用方法の大半が駄目になってしまう為、この部分は実装しておきたい。

  • 具体的には、マクロ展開やspecial formが(手続きの実行を含まずに)無限ループする場合があると問題になるので、割り込み処理を入れて、特定ステップ以上かかったらevalを中断できるようにしたい、という事。


実装方法は色々と考えた。

  1. 真面目に、evalにかける前に自前でマクロとspecial formを展開/実行する。
    • マクロの方はmacroexpand-1があるのでそれなりに簡単そうだが、special formも同時に考慮する事を考えると頭が痛くなる。quasiquoteのunquoteとか。
      • 自前でScheme処理系をSchemeで書くのに近い作業になる……SICPの後半の方でこんな問題があった気がする(自力で解いてない)。
        • ちょっとSICP読み直したかったが、会社のはどっかいってしまったらしく、見付からなかった。amazon注文は今「通常3〜5週間以内に発送」。7&Yは今「品切れ」。英語版ならオンラインで読める、が……。
        • 来週に紀伊国屋辺りで探そう。
      • とりあえず、この方法で実装するとしても、今回のgauche.nightが終わってからにする(他人のコードを見て参考にする気マンマン)。
  2. 無限ループする可能性のある特定special formは、ステップ実行eval用モジュール(環境)に束縛する段階で、こっそり割り込み処理を実行するマクロとして束縛する。マクロはmacroexpand-1を使って自前で展開する。
    • マクロという事は、実行前に「本物のspecial form」と「割り込み処理を行うproc」に展開される事になる。つまり、ステップ実行eval用モジュール空間内に「本物のspecial form」を(束縛として)持ち込む必要がある。しかし、この「本物のspecial form」の方の束縛が悪用者にバレるとセキュリティホールになり、DoS(無限ループ)可能になってしまう。
      • あまりいい解決方法ではないが、束縛の名前をランダムに生成して隠す事にする。
      • この時に問題になるのは、Gaucheが提供する、束縛テーブルを参照する系の手続きの存在と、エラーメッセージ。対策は今は考えない事にする。


「最終的には、真面目にspecial formを実装する」という約束で、とりあえずspecial formは隠し束縛で実装する事にする。
マクロは自前で展開する。