【问题标题】:What does "local variable" mean in the Forth programming language?Forth 编程语言中的“局部变量”是什么意思?
【发布时间】:2022-06-15 19:32:09
【问题描述】:

在 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 中有很好的定义;这是您在{ ... } 中声明的变量,它在定义末尾超出范围。您的另一个示例不是局部变量。

标签: forth gforth


【解决方案1】:

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

{: args [ | vals ] [ –– outs ] :}

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

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

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 ;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2011-03-03
    相关资源
    最近更新 更多