如何使用一个单词,在另一个单词的定义中解析其输入?

问题描述 投票:0回答:1

假设有一个词

string
,其工作原理如下:
64 string var$
var$
执行的结果是分配内存的第一个字节的地址和'0'来反映64字节的已使用空间被分配给一个字符串。现在你可以像这样使用它,
s" Hallo" var$ $!
,这会返回内存的起始地址和存储在那里的字符串长度“5”。

现在的问题是,像这样定义一个词:

: HelloWorld 64 string HW$ s" HelloWorld!" HW$ $! ;

不起作用,因为

HW$
是对一个(未定义的)单词进行评估的。

我怎样才能摆脱这个困境?

我用 ESP32Forth 尝试了我之前描述的方法,但它不起作用,这导致了我的问题。

forth
1个回答
0
投票

拥有本地字符串的典型方法是使用动态内存分配和本地变量。

一个小图书馆:

: 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
;
© www.soinside.com 2019 - 2024. All rights reserved.