标签: forth

如何在 Forth 定义中创建单词

我正在使用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 ,但它在运行时爆炸,说:

尝试使用零长度字符串作为名称

有没有办法做到这一点?

definition forth gforth

5
推荐指数
1
解决办法
819
查看次数

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

我正在通过 FICL 尝试 Forth(.4th 文件扩展名)。是否可以调用外部程序的执行 - 就像我的“Hello, World!” 程序集可执行文件 - 来自 .4th 源文件内部?

forth

5
推荐指数
1
解决办法
403
查看次数

第四名:POSTPONE ---它是如何运作的?

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 …

user-interface forth

5
推荐指数
2
解决办法
917
查看次数

第四:具有多个出口点的便携式无限循环

我需要实现一个具有多个退出点的不确定循环。不幸的是,最明显的解决方案 - 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 的无限循环中实现多个退出点?

loops forth

5
推荐指数
1
解决办法
557
查看次数

将焦点更改回控制台窗口

我对Windows编程的了解接近于零。但现在我已经制作了一个从 Windows 控制台运行的 Forth 程序,它打开一个原始的图形窗口。问题是我想通过按键来控制程序,但是当程序启动时,焦点没有在控制台窗口上,而是在图形窗口上。

如何改变后焦距?我想我必须使用一些 WINAPI,但是哪个呢?

c# forth setfocus windows-console

5
推荐指数
0
解决办法
1659
查看次数

使用'see'对Forth代码字进行反汇编

我正在建设一个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

有没有其他人有这个问题,你知道如何解决它吗?

forth gforth

5
推荐指数
1
解决办法
561
查看次数

Forth 实现使用系统堆栈作为返回堆栈是否实用?

像 C 这样的语言使用系统堆栈来存储局部变量和返回地址。Forth有数据栈和返回栈。是否有 Forth 的实现使用系统堆栈作为返回堆栈,从而使用返回指令来结束单词的执行?这是一个可行的方法吗?

stack forth

5
推荐指数
1
解决办法
505
查看次数

Forth 中有条件退出的说法吗?

在 Forth 中,如果栈顶为零,是否有一个常用词来有条件地退出过程(返回)?我正在考虑在递归过程中使用它而不是 IF。

forth gforth

5
推荐指数
1
解决办法
99
查看次数

如何访问 Forth 中的隐藏定义?

当一个单词被重新定义时,是否可以访问旧单词?

想象一下有一个词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

5
推荐指数
1
解决办法
167
查看次数

如何以非零退出状态退出 Forth?

我想以非零退出状态退出 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) 的等效项。)

forth gforth

5
推荐指数
1
解决办法
180
查看次数