SICP 4.4.4.5 Ex. 4.71

  • 投稿日:
  • カテゴリ:

Ex. 4.71

どう考えても、delay を使うメリットはない。

delay を使ったところで、ruleの無限ループを回避できるわけではない。結局、強制終了するしかない。

無限ループを起こす壊れたソフトが、途中経過を少しばっか印字したからといって許されるわけがない。(少なくとも私の感覚では。)

現状の query システムは、delay を入れていても rule の無限ループは止まらず、結局ユーザが運用で回避することになっている。(無限ループしないよう質問文を工夫する)

ということであれば、割り切って、4章のqueryシステム全体に散らばっているこの遅延関係のコードをすべてなくせばいい。ものすごくすっきりした易しいqueryシステムのソースになる。そして動作も現状とあんまり大差ない(筈)である。

一応、前向きに考えると、プログラムの下の層で delay を入れて無限ストリームの発覚を先送りにしておくと、無限ストリームへの対処を上の層で取り扱うことが可能になる。(例えば query-driver-loop で10個印字する度に、続行?のプロンプトを出すとか)。将来、このシステムを修理するときのために delay を入れていると考えられないこともない。

or についても同じ理由。A or B の B だけを delay させておけば、Aの無限ストリーム、Bの無限ストリームどちらの場合も、無限ストリームの発覚を先送りにできる。(A or B 内のストリーム結合にinterleave を使っているので)