我看到有人救第四源代码文件与扩展.4th,.fth,.frt和.f.哪个是Forth源代码文件最常用的文件扩展名?
在 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)
但它似乎是一个带有两个参数a和b的函数。
另一个关于 Forth 语言的教程显示了一个像这样的变量:
variable a
3 a ! ( ! to store the value )
Run Code Online (Sandbox Code Playgroud)
那么,哪一个是正确的呢?
我在接受Chuck Moore采访时看到,他说:
操纵该堆栈的单词是DUP,DROP和OVER周期.没有,SWAP很方便你想要它,但它不是机器指令.
所以我试图SWAP仅仅实现DUP,DROP而且OVER,但是无法弄清楚如何做到这一点,至少不增加堆栈.
怎么样,真的吗?
我想在Gforth写一个while()循环.不幸的是,由于缺少示例,在线唯一的教程没有用,计数循环的例子(我不想要的)看起来根本不同.
如何表示这样的事情的一些具体例子是什么?
while (x > 3) { print(x); x--; }
Run Code Online (Sandbox Code Playgroud)
或者,实际上,只是表达形式的任何具体方式:
while (predicate) { expression(s) }
Run Code Online (Sandbox Code Playgroud) 在Forth中定义单词时选择参数顺序的一般规则(经验法则)是什么?
例如,在控制一些伺服系统的情况下,让我们定义SERVO!哪个伺服通道的位置.
继!的方式,它应该是: SERVO! ( val #ch -- ),但另一方面不让它看起来更天然是: SERVO! ( #ch val -- )?
是否有类似于inputBasic或scanf("%d")C in Forth的东西?
可能会是这样的:
200 buffer: buf
: input ( -- n ) buf 200 accept
some-magic-filter
buf swap evaluate ;
Run Code Online (Sandbox Code Playgroud)
上面代码中的问题是如何定义一个只传递数字的过滤器,而不是任何单词,定义等?
LOOP 一词被描述为“解析所有未解析的 LEAVE 事件的目的地”。(强调我的)
与 IF ... ELSE ... THEN 的前向引用数始终为 1 不同,LOOP 对 LEAVE 的数量没有限制。那怎么实施呢?
我想到的一种方法是始终将 LEAVE 的数量保持在堆栈顶部。每个 LEAVE 都会增加此计数器并将其置于其下。LOOP 从顶部读取计数器并解析那么多引用。但这似乎是一个便宜的伎俩。
真正的 Forth 系统如何实现这种循环?我不需要 teh codez(将 Forth 作为学习经验实施),只需要概念。
该单词."打印一个字符串。更准确地说,它将 和 字符串编译到当前编译的单词中的(.")下一个。"
但我怎样才能打印
这就是问题所在”。
与福斯?
我正在用C编写一个简单的基于堆栈的语言,并且想知道我应该如何实现某种循环结构和/或前瞻符号.由于这个页面的代码有点长(超过200行),我把它放在GitHub存储库中.
编辑:主程序存档stack.c.
编辑:代码只是输入words,类似于FORTH.它使用scanf和从左到右工作.然后它使用一系列ifs和strcmps来决定做什么.真的是这样的.
如何获得Forth中当前保存在堆栈中的元素数量?
我问这个是因为我想创建一个打印出堆栈所有元素的函数,例如:
: pop_all 0 do . loop ;
1 5 10 4 5
5 pop_all
Run Code Online (Sandbox Code Playgroud)
但是现在我需要在调用它时手动指定堆栈大小.