我正在使用Gforth,我想在定义中创建一个单词。在 Gforth 的命令行中我可以输入:
create foo
ok
或者更具体地说,我定义了一个数组函数,它需要堆栈上的大小并使用该数组的地址创建一个字:
: array ( n -- ) ( i -- addr)
    create cells allot
        does> cells + ;
因此,如果我输入,10 array foo我就可以稍后使用foo。
但如果我在另一个定义中编写,10 array foo则会出现编译错误。我尝试用s" foo"which 编译替换 foo ,但它在运行时爆炸,说:
尝试使用零长度字符串作为名称
有没有办法做到这一点?
我正在通过 FICL 尝试 Forth(.4th 文件扩展名)。是否可以调用外部程序的执行 - 就像我的“Hello, World!” 程序集可执行文件 - 来自 .4th 源文件内部?
我需要实现一个具有多个退出点的不确定循环。不幸的是,最明显的解决方案 - 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 
在“Thinking Forth”中引用了摩尔的声明:
很多时候条件语句被用来跳出循环。可以通过具有多个退出点的循环来避免这种特殊用途。这是一个实时主题,因为在 poly-Forth 中存在多个 WHILE 结构,但还没有渗透到 Forth '83。这是在同一个 REPEAT 中定义多个 WHILE 的简单方法。此外,[Forth, Inc.] 的 Dean Sanderson 发明了一种新结构,该结构将两个出口点引入 DO LOOP。鉴于这种结构,您将进行更少的测试。
不幸的是我没有找到院长的解决方案。是否有任何可移植的方式在 Forth 的无限循环中实现多个退出点?
我对Windows编程的了解接近于零。但现在我已经制作了一个从 Windows 控制台运行的 Forth 程序,它打开一个原始的图形窗口。问题是我想通过按键来控制程序,但是当程序启动时,焦点没有在控制台窗口上,而是在图形窗口上。
如何改变后焦距?我想我必须使用一些 WINAPI,但是哪个呢?
有没有办法将数据显式推送/弹出到 C 返回堆栈?(理想情况下在标准 C 中,但仅 GCC 的解决方案也可以。)
我正在用 C 语言实现 Forth,在一个内存非常紧张的微控制器上(千字节,而不是兆字节)。
我正在为数据堆栈分配 RAM,但我希望通过显式推送/弹出与 C 返回堆栈共享 Forth 返回堆栈来节省一些 RAM。
这可以在C中完成吗?
像 C 这样的语言使用系统堆栈来存储局部变量和返回地址。Forth有数据栈和返回栈。是否有 Forth 的实现使用系统堆栈作为返回堆栈,从而使用返回指令来结束单词的执行?这是一个可行的方法吗?
作为移植 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 …在 Forth 中,如果栈顶为零,是否有一个常用词来有条件地退出过程(返回)?我正在考虑在递归过程中使用它而不是 IF。
当一个单词被重新定义时,是否可以访问旧单词?
想象一下有一个词foo被定义和重新定义
: foo ( n -- 2*n ) 2* ;  ok
: foo ( n -- 2*n+1 ) foo 1+ ; redefined foo   ok
10 foo . 21  ok
foo这里执行了两个定义。
是否可以执行第一个定义(“second-foo”)?
21 second-foo . 42 ok
到see它吗?
see second-foo
: foo
  2* ; ok