标签: 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
查看次数

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

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

如何显式推送/弹出到 C 返回堆栈?

有没有办法将数据显式推送/弹出到 C 返回堆栈?(理想情况下在标准 C 中,但仅 GCC 的解决方案也可以。)

我正在用 C 语言实现 Forth,在一个内存非常紧张的微控制器上(千字节,而不是兆字节)。

我正在为数据堆栈分配 RAM,但我希望通过显式推送/弹出与 C 返回堆栈共享 Forth 返回堆栈来节省一些 RAM。

这可以在C中完成吗?

c stack gcc forth

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

如何为 J1 CPU 编译 Forth 代码?

我对在FPGA 项目中使用J1 CPU感兴趣。

我知道要使用 J1 CPU 本身,我需要综合(等)Verilog 代码,并将比特流加载到我的 FPGA 中。我可以使用 IceStorm 或 FPGA 供应商自己的工具来做到这一点。没问题。

我不明白如何编译一个可以上传到 FPGA 内存并执行的 Forth 程序。

我知道SwapForth,我相信它是在 J1 CPU 本身上运行的 Forth解释器。这不是我想要的。我希望能够在我的 PC 上将 Forth 代码编译成 J1 机器代码,以便我以后可以将它上传到 FPGA 的 RAM 并在本地执行它。

有这样的工具吗?

compilation forth fpga

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

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

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

stack forth

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

macOS v10.15 (Catalina) / x64 上的自修改代码

作为移植 Forth 编译器的一部分,我正在尝试创建一个允许自修改代码的二进制文件。血淋淋的细节位于https://github.com/klapauciusisgreat/jonesforth-MacOS-x64

理想情况下,我为用户定义创建一堆页面并调用 mprotect,如下所示:

#define __NR_exit 0x2000001
#define __NR_open 0x2000005
#define __NR_close 0x2000006
#define __NR_read 0x2000003
#define __NR_write 0x2000004
#define __NR_mprotect 0x200004a

#define PROT_READ 0x01
#define PROT_WRITE 0x02
#define PROT_EXEC 0x04
#define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC)
#define PAGE_SIZE 4096


// https://opensource.apple.com/source/xnu/xnu-201/bsd/sys/errno.h
#define EACCES    13              /* Permission denied */
#define EINVAL    22              /* Invalid argument */
#define ENOTSUP   45              /* Operation not supported */


/* Assembler entry point. */
        .text
        .globl start
start:
        // Use mprotect to …
Run Code Online (Sandbox Code Playgroud)

macos assembly x86-64 forth macos-catalina

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

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
查看次数