在Forth编程语言中,“local variable”是什么意思?

8
在 C 语言中,局部变量存在于函数内部并包含如下的值:
void main(){
    int a = 5;
    int b = 9;
}

在Gforth手册中,他们这样描述本地变量
: swap { a b -- b a }
  b a ;
1 2 swap .s 2drop

但似乎这是一个接收两个参数ab的函数。

另一个关于Forth语言的教程展示了一个变量,如下:

variable a
3 a !    ( ! to store the value )

那么,哪个是正确的?


可能需要更新您的术语。在Forth中,“本地变量”有明确定义;它是您在{...}中声明的变量,在定义结束时超出范围。您提到的另一个示例不是本地变量。 - tripleee
对的。variable 声明一个全局变量。在标准的Forth中,你甚至不能在一个词定义内部放置 variable 声明,所以两者之间没有太多混淆的空间。 - Mark Reed
1个回答

10
在Forth中,局部变量由以下语法描述(另请参见13.6.2.2550 {:): {: args[| vals][––outs]:} 其中argsvalsouts的每个都代表以空格分隔的名称(方括号中的部分是可选的)。这些名称的解释如下:
- args名称用于从数据栈初始化局部变量,其中堆栈顶部分配给args中最右侧的名称; - vals名称用于未初始化的局部变量; - outs名称被忽略(它们仅用于文档目的,如果有的话)。
Gforth使用{ ... }符号表示本地变量作为标准的另一种选择。
因此,可以将swap定义为:
: swap {: a b :} b a ;

它从堆栈中获取两个值到本地变量ab,然后以相反的顺序将它们放回堆栈。
使用未初始化的本地变量的示例:
: exch ( x2 addr -- x1 ) {: a | x1 :}
  a @ to x1 a ! x1
;

可选的-- ...部分可以模拟堆栈图表,即将本地变量的声明和单词的堆栈图表合并在一起。例如:

: umin {: u2 u1 -- u2|u1 :} u2 u1 u< if u2 else u1 then ;

如果没有特别优化,本地变量的性能略低于一些堆栈调整。


关于“本地变量的性能略低于一些堆栈操作”的问题:你能量化一下吗?你有一些测量数据吗?测试是在什么系统上进行的? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接