我正在使用Gforth,我想在定义中创建一个单词。在 Gforth 的命令行中我可以输入:
create foo
ok
Run Code Online (Sandbox Code Playgroud)
或者更具体地说,我定义了一个数组函数,它需要堆栈上的大小并使用该数组的地址创建一个字:
: array ( n -- ) ( i -- addr)
create cells allot
does> cells + ;
Run Code Online (Sandbox Code Playgroud)
因此,如果我输入,10 array foo
我就可以稍后使用foo
。
但如果我在另一个定义中编写,10 array foo
则会出现编译错误。我尝试用s" foo"
which 编译替换 foo ,但它在运行时爆炸,说:
尝试使用零长度字符串作为名称
有没有办法做到这一点?
我正在通过 FICL 尝试 Forth(.4th 文件扩展名)。是否可以调用外部程序的执行 - 就像我的“Hello, World!” 程序集可执行文件 - 来自 .4th 源文件内部?
John Heyes的ANS Forth测试套件包含以下定义:
: IFFLOORED [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
Run Code Online (Sandbox Code Playgroud)
然后根据我们是使用浮动还是对称除法,将其用于有条件地定义各种单词:
IFFLOORED : T/MOD >R S>D R> FM/MOD ;
Run Code Online (Sandbox Code Playgroud)
因此,IFFLOORED
无论是noop还是\
取决于表达式的结果.精细.通过这样做,我可以在我的线程解释器上轻松实现:
: POSTPONE ' , ; IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
......现在IFFLOORED
有效; 定义相当于: IFFLOORED -1 IF ['] \ EXECUTE THEN ;
.
不幸的是,测试套件的下方是以下代码:
: GT1 123 ;
: GT4 POSTPONE GT1 ; IMMEDIATE
: GT5 GT4 ;
\ assertion here that the stack is empty
Run Code Online (Sandbox Code Playgroud)
相同的实现在这里不起作用.如果POSTPONE
编译其字的引用,则GT4 …
我需要实现一个具有多个退出点的不确定循环。不幸的是,最明显的解决方案 - REPEAT - UNTIL with multiple WHILE 在 Gforth 和 swapforth 中都不起作用(当然,下面示例中的循环可以用 DO - LOOP 实现。但是,该代码只是一个演示。真正的问题与嵌入式系统中的硬件控制有关,因此循环确实必须是不确定的):
: test1 ( step -- step count )
0
begin
over +
dup .
dup 20 < while
dup 13 = while
repeat
;
3 test1
Run Code Online (Sandbox Code Playgroud)
在“Thinking Forth”中引用了摩尔的声明:
很多时候条件语句被用来跳出循环。可以通过具有多个退出点的循环来避免这种特殊用途。这是一个实时主题,因为在 poly-Forth 中存在多个 WHILE 结构,但还没有渗透到 Forth '83。这是在同一个 REPEAT 中定义多个 WHILE 的简单方法。此外,[Forth, Inc.] 的 Dean Sanderson 发明了一种新结构,该结构将两个出口点引入 DO LOOP。鉴于这种结构,您将进行更少的测试。
不幸的是我没有找到院长的解决方案。是否有任何可移植的方式在 Forth 的无限循环中实现多个退出点?
我对Windows编程的了解接近于零。但现在我已经制作了一个从 Windows 控制台运行的 Forth 程序,它打开一个原始的图形窗口。问题是我想通过按键来控制程序,但是当程序启动时,焦点没有在控制台窗口上,而是在图形窗口上。
如何改变后焦距?我想我必须使用一些 WINAPI,但是哪个呢?
我正在建设一个Forth解释准备全面的知识,并希望拆卸一些通用的第四码字如+
,-
,*
,等.
我的Gforth(我目前在Ubuntu Linux上安装了0.7.3版本)将允许我用命令反汇编冒号定义,see
以及单个代码字.
.但是当我用其他代码词尝试它时,see +
或者see /
,我得到一个错误,Code +
然后我就不能再输入我的终端了,即使我按下control-c.
我应该能够反编译/反汇编代码字,如Gforth手册所示:https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Decompilation-Tutorial.html
有没有其他人有这个问题,你知道如何解决它吗?
像 C 这样的语言使用系统堆栈来存储局部变量和返回地址。Forth有数据栈和返回栈。是否有 Forth 的实现使用系统堆栈作为返回堆栈,从而使用返回指令来结束单词的执行?这是一个可行的方法吗?
在 Forth 中,如果栈顶为零,是否有一个常用词来有条件地退出过程(返回)?我正在考虑在递归过程中使用它而不是 IF。
当一个单词被重新定义时,是否可以访问旧单词?
想象一下有一个词foo
被定义和重新定义
: foo ( n -- 2*n ) 2* ; ok
: foo ( n -- 2*n+1 ) foo 1+ ; redefined foo ok
10 foo . 21 ok
Run Code Online (Sandbox Code Playgroud)
foo
这里执行了两个定义。
是否可以执行第一个定义(“second-foo”)?
21 second-foo . 42 ok
Run Code Online (Sandbox Code Playgroud)
到see
它吗?
see second-foo
: foo
2* ; ok
Run Code Online (Sandbox Code Playgroud) 我想以非零退出状态退出 Forth 程序(使用 Gforth 0.7.3)。
我试过了:
1 bye
Run Code Online (Sandbox Code Playgroud)
但 1 不会被解释为 的参数bye
(而且我也没想到这会起作用;我在文档中找不到任何bye
接受参数的提示)。
请注意,我不想触发异常,因为这也会打印错误消息(除非有办法从 Forth 程序本身中抑制异常的错误消息)。
那么,如何将 Forth 程序退出回托管环境/操作系统并提供非零退出状态?(基本上,我正在寻找return EXIT_FAILURE; // from main()
(C) 或exit(EXIT_FAILURE);
(C) 或System.exit(1);
(Java) 的等效项。)