2

Rosetta コードから、Forth で文字列を連結する方法として以下を使用しています。

s" hello" pad place
pad count type
s"  there!" pad +place
pad count type

このコードを使用して、複数の文字列を連結できるようにしたいと考えています。ただし、Gforth では次のように失敗します。

s" hi " pad place 
s" hello " pad place
s" world" pad 
+place
pad +place
pad count type

私の基本的な Forth エクスポージャーから、スタックに 3 つの文字列を置き、スタックの一番上の文字列をその下の文字列に追加し、スタックの新しい文字列を一番下の文字列に再度追加するというコードが見えます。

このコードが最後の +place でアンダーフローするのはなぜですか? これを回避する方法はありますか?

4

1 に答える 1

2

2 番目のスニペットは、「hi」をメモリの場所padにコピーしてから、「hello」を同じ場所にコピーします (「hi」を上書きします)。

+placeしたがって、最初に試してみるとaddr u、スタックから「world」の参照が取得され、「world」が「hello」に追加されます。だから試したら

s" hi " pad place 
s" hello " pad place
s" world" pad +place

//Display the string at pad
pad count type

君は見るべきだhello world ok

この時点で、すべてのplace単語+placeは、スタック上のすべての文字列参照を使い果たしています。実行するだけでこれを確認するには

s" hi " pad place 
s" hello " pad place
s" world" pad 
+place

//Check the stack
.s

空のスタックが表示されます。

もう一度使用すると、表すpadアドレスがスタックにプッシュされます。padそのため、次+placeのスタックにはコピーするための文字列参照がないため、失敗します。

これを修正するには、代わりにこのようなものが必要です

s" hi " pad place 
s" hello " pad +place
s" world" pad +place
pad count type

このコードでは、「hello」は「hi」を上書きせずに追加されるため、next+placeはスタックに正しい引数を持ち、期待どおりに動作します。

于 2014-03-12T19:46:05.020 に答える