7

Factorマニュアルのこのページでは、継続で格納されるこれらのタイプのスタックについて説明しています。

  • データスタック
  • スタックを保持
  • コールスタック
  • namestack
  • キャッチスタック

これらのスタックは正確に何を保持しますか?私にとって最も紛らわしいのは、callstack、retainstack、namestackの3つです。

4

1 に答える 1

9

私は確かに因子の第一人者ではありませんが、それらの名前はそれらの使用を暗示しているように思われるため:

  • datastack : 通常の値のプッシュとポップに使用されます。3 4 +データスタックを使用して「3」をプッシュし、次に「4」をプッシュします。「+」を実行すると、データスタックから 2 つの値がポップされ、答えの 5 がデータスタックにプッシュされます。factor の対話型セッションを実行すると (少なくとも Linux では)、対話のたびにこのスタックの内容が出力されます。

    $> 1
    --- Data stack:
    1
    $> 2
    --- Data stack:
    1
    2
    $> +
    --- Data stack:
    3
    $> .
    3
    $>
    
  • callstack : 実行中の単語と、その構成要素の単語が実行されている間の個々の進行状況を保存するために使用されます。sum: のより良いバージョンを定義したと想像してください: sum' ( seq-of-int -- summmation ) 0 [ + ] reduce 20 + ;(追加の 20 を無料で取得できるため、より優れています!)。コードを再利用したいのでreduce、標準要素に付属する言葉を利用しました。ランタイムの実行中sum'に、 の実装が呼び出されreduceます。しかし、まだ 20 を追加する必要があるため、reduce戻ってきたときにどこから再起動するかを誰かが記録する必要があります。これらのメモは、デバッガーが何が起こっているのかを理解するのに役立つ、デバッグ実行中の補助データと共にコールスタックに保存されます。

  • keepstack : 一種の補助的なデータスタックで値を保持するために使用されます。Forth では、retainstack として機能するためにリターン スタック (Forth のコールスタックの類似物) を悪用できます。このアプローチの問題の 1 つは、汚れたハックをクリーンアップせずに言葉から戻ると、間違った場所にジャンプして一般的な大混乱を引き起こすことです。Forth のランタイムはあなたの値を見て、単語を呼び出して混乱したときにそれが作成する素敵なメモであると期待します。リターン アドレスに別のスタックを使用することで、Factor はこれを回避できます。

  • namestack :動的変数の実装に必要なデータを保持するために使用されます。スタックを使用することで、サブルーチンの実行中に新しい名前で古い名前を非表示にし、バインディングをポップして古い名前を復元することができます。

  • catchstack : 例外処理をサポートするために使用されます。スタックを使用することで、サブルーチンは例外用の独自の専門ハンドラーを登録し、既定の動作をシャドウできます。次に、単語が戻ったら、スタックからポップすることで古いハンドラーを簡単に復元できます。

于 2012-07-06T19:13:15.270 に答える