forth - "local variable"在 Forth 编程语言中是什么意思?

标签 forth gforth

在 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 中,局部变量由以下语法描述(另见 13.6.2.2550 {:):

{: 参数 [ | 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 ;

如果不进行特殊优化,局部变量的性能会比一些堆栈杂耍略差。

关于forth - "local variable"在 Forth 编程语言中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71696206/

相关文章:

macos - 将 JonesForth 移植到 macOS v10.15 (Catalina)

stack - 如何在 Forth(或 Factor)中编写应用程序?

c - gforth 使用字符串调用 C 函数 printf

forth - 可以在 Forth 中调用外部程序吗?

forth - 用数字填充数组时出现问题

arrays - Forth 中大整数减法的错误算法

algorithm - 如何实现维基百科的素性测试算法?

exception-handling - 异常帧与返回堆栈上的其他数据有何区别?

c - 如何显式压入/弹出到 C 返回堆栈?

lisp - Common Lisp 宏和 Forth 元编程能力的比较