假设有一个词
string
,其工作原理如下:64 string var$
,var$
执行的结果是分配内存的第一个字节的地址和'0'来反映64字节的已使用空间被分配给一个字符串。现在你可以像这样使用它,s" Hallo" var$ $!
,这会返回内存的起始地址和存储在那里的字符串长度“5”。
现在的问题是,像这样定义一个词:
: HelloWorld 64 string HW$ s" HelloWorld!" HW$ $! ;
不起作用,因为
HW$
是对一个(未定义的)单词进行评估的。
我怎样才能摆脱这个困境?
我用 ESP32Forth 尝试了我之前描述的方法,但它不起作用,这导致了我的问题。
拥有本地字符串的典型方法是使用动态内存分配和本地变量。
一个小图书馆:
: str@ ( addr.str -- addr.data u.len )
dup cell+ swap @
;
: str! ( addr.data u.len addr.str -- ) >r
dup r@ cell- @ u> abort" string buffer overflow"
dup r@ ! \ store the length
r> cell+ swap ( addr.data addr.buffer u.len )
2dup + 0 swap c! \ place zero at the end to make ASCIIZ
move \ store data
;
: new-string ( u.size -- addr.str )
dup 2 cells + char+ allocate throw tuck ! cell+ ( addr.str )
dup 0 0 rot str!
;
: free-string ( addr.str -- )
cell- free throw
;
使用示例:
: HelloWorld ( -- )
{: | hw :}
64 new-string to hw
s" HelloWorld!" hw str!
hw str@ cr type cr
hw free-string
;