Forth 编程语言中的“局部变量”是什么意思?

Tan*_*ita 8 forth gforth

在 C 中,局部变量存在于函数内部并包含如下值:

void main(){
    int a = 5;
    int b = 9;
}
Run Code Online (Sandbox Code Playgroud)

在 Gforth 手册中,他们这样描述局部变量:

: swap { a b -- b a }
  b a ;
1 2 swap .s 2drop
Run Code Online (Sandbox Code Playgroud)

但它似乎是一个带有两个参数ab的函数。

另一个关于 Forth 语言的教程显示了一个像这样的变量:

variable a
3 a !    ( ! to store the value )
Run Code Online (Sandbox Code Playgroud)

那么,哪一个是正确的呢?

ruv*_*vim 10

在 Forth 中,局部变量由以下语法描述(另请参见13.6.2.2550{:):

\n

{: 参数[| ] [\xe2\x80\x93\xe2\x80\x93 输出] :}

\n

其中argsvalsouts中的每一个都表示以空格分隔的名称(方括号中的部分是可选的)。这些名称解释如下:

\n
    \n
  • args名称适用于从数据堆栈初始化的局部变量,堆栈顶部分配给args中最右边的名称;
  • \n
  • vals名称适用于未初始化的本地名称;
  • \n
  • outs名称将被忽略(它们仅用于文档目的(如果有))。
  • \n
\n

Gforth 使用{ ... }局部符号作为标准符号的替代。

\n

所以,swap可以定义为:

\n
: swap {: a b :} b a ;\n
Run Code Online (Sandbox Code Playgroud)\n

它将堆栈中的两个值放入局部变量中ab然后以相反的顺序将它们放回堆栈中。

\n

使用未初始化的局部变量的示例:

\n
: exch ( x2 addr -- x1 ) {: a | x1 :}\n  a @ to x1 a ! x1\n;\n
Run Code Online (Sandbox Code Playgroud)\n

可选-- ... 部分允许模仿堆栈图,即将局部变量的声明和一个字的堆栈图结合起来。例如:

\n
: umin {: u2 u1 -- u2|u1 :} u2 u1 u< if u2 else u1 then ;\n
Run Code Online (Sandbox Code Playgroud)\n

如果没有特殊的优化,局部变量的性能会比一些堆栈杂耍的性能稍差。

\n