在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暴露中,我看到代码将三个字符串放在堆栈上,然后将字符串添加到堆栈顶部与它下面的字符串,然后将新字符串再次添加到堆栈上与底部的字符串。
为什么这段代码在最后一个+位上有下溢?有办法解决这个问题吗?
第二个代码段将"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",而是附加在"hi"后面,所以下一个+place
在堆栈上有正确的参数,并按预期工作。