2012-02-19 13 views
6

This pageスタックは保持されますか?私にとって最も混乱しているのは、コールスタック、リテックススタック、ネームスタックです。コールスタック?リテストスタック?名前は?正確にこれらを何</p> <ul> <li>datastack</li> <li>retainstack</li> <li>コールスタック</li> <li>namestack</li> <li>catchstack</li> </ul> <p>:継続に保存されたスタックのこれらのタイプについて因子マニュアル交渉の

+0

どのような面白い言葉ですか? +1 – Irfy

答えて

8

私は確かに要因の第一人者だありませんが、その名前は、それらの使用を暗示するように見えることから:

  • datastack:値の通常のプッシュとポップに使用します。 3 4 +はdatastackを使用して '3'を押し、次に '4'を押します。 +を実行すると、データストアから2つの値がポップされ、データストアに返されます(5)。因子(少なくともLinuxの場合)の対話型セッションを実行するすべての相互作用の後、このスタックの内容を出力:

    $> 1 
    --- Data stack: 
    1 
    $> 2 
    --- Data stack: 
    1 
    2 
    $> + 
    --- Data stack: 
    3 
    $> . 
    3 
    $> 
    
  • 呼び出しスタック:それらの成分の言葉を実行しながら単語が実行されている店舗や個々の進歩に使用。あなたが合計のより良いバージョンを定義したと想像してください:: sum' (seq-of-int -- summmation) 0 [ + ] reduce 20 + ;(それはあなたが余分な20を無料で入手するのでより良いです!)。コードを再利用したい場合は、標準的な要素であるreduceという単語を利用しました。実行時にsum'が実行されている間は、実装はreduceとなります。しかし、余分な20を追加する必要があるので、誰かが起動する場所を再度記録しなければなりません。reduceが返されます。これらのノートはコールスタックに格納され、デバッグの実行中に何らかの補助データとともにデバッガが何が起こっているのかを理解するのに役立ちます。

  • retainstack:一種の補助データスタッキングの値を保持するために使用されます。 Forthでは、リターンスタック(Forthのコールスタックと同じ)を乱用して、リテンションスタックとして機能させることができます。このアプローチの問題の1つは、あなたの汚れたハックを掃除せずにあなたの言葉から戻ることは、あなたが間違った場所に飛び込んで一般的な混乱を引き起こすことです。 Forthのランタイムは、あなたの値を見て、単語を呼んで混乱させてしまう素晴らしいノートになると予想します。戻りアドレスに別のスタックを使用することで、Factorはこれを回避できます。

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

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

関連する問題