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 的基本了解中,我看到代码是将三个字符串放在堆栈上,然后将字符串附加到堆栈顶部并在其下方添加字符串,然后将新字符串再次附加到堆栈底部的字符串中。

为什么此代码在最后一个 + 位置下溢?有没有解决的办法?

4

1 回答 1

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代表的地址推送到堆栈中。所以 next+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 回答