我正在尝试将字符串值存储到变量中。要定义变量,我使用:
: define CREATE 0 , ;
define x
我可以使用
轻松地将整数/浮点值存储到x
10 x !
或
10.0e x f!
要访问它,我使用@
或f@
。现在我正在尝试存储一个字符串值:
s" hello world" x !
这个问题是它将两个值推送到堆栈(因为它是一个计数字符串),但x !
只会将项目存储在顶部,这是字符串的长度。这是危险的,因为堆栈内容可能在引用x
时被修改,使得地址不直接低于长度(坏!),因此type
将失败。所以我的问题是,有没有办法将值(地址和长度)存储到x
?或者是否有一个不同的数据类型/操作数可以让我实现这个目标?
感谢任何帮助。
答案 0 :(得分:3)
你需要做的很多事情都非常类似于你已经完成的事情。
如果您想在使用它创建的内容中存储两个值,则需要不同版本的define
;
: 2define create 0 , 0 , ;
在一个单词的开头加上两个是一个约定,它表示它与没有这两个单词的单词做同样的事情,而是在双单元格的东西上做。
要使用它,你会写:
2define 2x
//Write something to 2x
s" Hello world!" 2x 2!
//Retrieve it and print
2x 2@ type
值得注意的是s"
返回的地址不能保证在程序的持续时间内持续,并且可能会被稍后使用的s"
覆盖,以查看制作字符串的方法保证持续查看此答案https://stackoverflow.com/a/8748192/547299的变量(它有点长,但有一个名为string
的单词的定义,这可能是说明性的。)
答案 1 :(得分:1)
不要卡在“!”上。这更有效......
: 2x S" Hello World!" ;
另外,定义对浮点数不安全,可能是
: define CREATE 0 f, does> f@ ;
\ 3.1459e0 define pi
\ pi f. 3.1459 ok
答案 2 :(得分:1)
Gforth正是为此目的准备了一个$! ( c-addr u addr -- )
字。
给定一个字符串和一个地址,它会将字符串复制到一个新的字符串中
ALLOCATEd空格并将字符串存储在地址中。如果是地址
已经存储了一个字符串,该字符串将被释放。
所以:
define x
s" hello world" x $!
x $@ type \ hello world
你也可以使用带有计数字符串和单词的固定缓冲区
PLACE和+ PLACE,具有$!
相同的堆栈图片。等价
以上(虽然有字符限制):
256 buffer: x
s" hello world" x place
x count type \ hello world
s" !" x +place
x count type \ hello world!