问题标签 [forth]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
950 浏览

forth - 为什么 Forth 返回 -1 作为 True 的标志?

第四代代码

返回-1,但我曾经使用过的所有其他语言都用作1true 的标志。为什么是这样?造成这种差异的原因是什么?

0 投票
1 回答
485 浏览

serial-port - 使用 Gforth 更改串行端口设置

我正在尝试与串行端口(打开的 Arduino 设备/dev/ttyUSB0)通信。我遇到了麻烦,因为要正确读取/写入数据,我需要设置各种参数,例如速度和奇偶校验。

是否有一个 Gforth 库已经这样做了?

我发现这个链接通过并调用 C 函数来直接设置 termios 参数 - http://www.forth.org/svfig/kk/TestSerial.f.txt,但我更喜欢使用 Gforth 附带的东西本身。

0 投票
1 回答
472 浏览

arrays - 如何在 Forth 中对整数数组进行就地排序?

我有一个 100 元素的整数数组。假设它对array 使用这个定义

现在假设这个atod数组已经填充了从 ATOD 输入读取的 100 个整数值。在处理它之前,我想使用相同的atod数组按值对整数进行永久排序。也就是说,我不关心原始顺序,我只关心它们是否已排序,而且我的内存很薄,所以我不想定义任何其他变量或数组。

你怎么排序?

编辑:根据@Julian Fondren 修复了数组定义。

0 投票
3 回答
2936 浏览

lisp - Common Lisp 宏和 Forth 元编程能力的比较

每个 Common Lisp 程序员都知道宏是一个强大的工具。通用 Lisp 宏已被用于在 Lisp 之上添加面向对象而不改变语言规范;读取宏是另一种具有思维弯曲功能的构造。

另一个允许元编程的程序是 Forth。Forth 使用“单词”和“生成单词”的方式略有不同。

我想从涉足两种语言的人那里知道,如果常见的 lisp 宏和 forward 构造在广度/功能上是可比的:有没有你可以用前者做的事情,而你不能用后者做些什么?或相反亦然?

当然,我不是在谈论这两种语言的图灵完备性:我是在谈论元编程能力。C 是图灵完备的,但只有傻瓜才会说 C 宏在功能上与 Common Lisp 相当。

0 投票
1 回答
347 浏览

class - 如何在 Forth 中创建一个基本类和该类的实例?

我想创建一个对象来表示一些电气读数,例如输入电压。为此,我想创建一个基本的类结构来处理不同类型的读数——比如电流和电压。

我想要做的伪代码(实际上是 Python)是这样的:

我正在使用Gforthoof.fs扩展。

0 投票
1 回答
295 浏览

forth - 可以在 Forth 中使用 BIOS 中断吗?

我正在做一个比较不同编程语言的课程项目。是否可以在 Forth 语言中使用 BIOS 中断?我似乎找不到任何这样的信息。如果是这样,那会是什么例子?

0 投票
1 回答
287 浏览

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

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

0 投票
1 回答
1127 浏览

compiler-construction - 为 8051 实现函数调用

假设您有一个没有外部 RAM 的 8051 微控制器。内部 RAM 为 128 字节,大约有 80 字节可用。并且您想为堆栈语言编写编译器。

假设您要编译一个 RPN 表达式2 3 +。8051有nativepushpop指令,所以可以写

然后你可以实现+为:

很简单,对吧?但在这种情况下,+它是作为内联程序集实现的。如果你想重用这段代码,并把它放到一个子程序中怎么办?好在8051有lcall说明retlcall LABEL将返回地址压入堆栈并跳转到 LABEL,同时ret返回到堆栈顶部指定的地址。但是,这些操作会干扰我们的堆栈,因此如果我们lcall跳转到+第一条指令的实现,pop A则会弹出返回地址,而不是我们想要操作的值。

在我们预先知道每个函数的参数数量的语言中,我们可以重新排列堆栈顶部的少数值并将参数放在堆栈顶部,并将返回地址进一步向下推。但是对于基于堆栈的语言,我们不知道每个函数将接受多少个参数。

那么,在这些情况下可以采取哪些方法来实现函数调用呢?

这是 8051 指令集的说明:http ://sites.fas.harvard.edu/~phys123/8051_refs/8051_instruc_set_ref.pdf

0 投票
1 回答
2251 浏览

c - Mac OS X 上的可执行文件格式

我正在尝试(一次一步)构建我自己的 Forth 副本以在 Mac OS X 上运行。

我目前有一个在 Apache 和 localhost 上以 PHP、Ruby 和 Python 运行的 Forth 版本。

我想用 C 语言制作一个 Forth 版本,它将创建一个 Forth 的本机可执行版本,它可以生成任何已编译 Forth 代码的自己的本机可执行文件。对不起半递归的句子。我的目标是从 C 开始,并以我自己的 Forth 编译器结束(不再在任何 C 代码中运行)。

我的出发点是尝试让一个最小的测试程序作为终端的二进制可执行文件运行。一旦我能够理解现有的 C 编译器在做什么,我就可以根据自己的目的修改它的方法。

我用 C 语言创建了一个小的“hello world”程序,最后得到了一个 8,497 字节的可执行文件,其中大部分由 0x00 数组(可能是缓冲区)组成。我的猜测是包含了整个 stdio 库。

接下来,我创建了我能想到的最小的 C 程序(除了一个完全为空的程序——我希望能够在生成的十六进制中找到我的代码):

这应该给我尽可能少的开销,因为 ASCII A 的存储和所有的返回值都很容易找到。

相反,我最终得到了一个 4,313 字节的文件。0x41(ASCII 'A')有四个位置,但没有一个是 MOV 立即字节指令的一部分。大概 0x41 被存储为常量数据并加载了不同的 MOV 指令。

同样有很多 0x00 数组(3,731 字节,或者除了 402 字节之外的所有)。大概在目标文件中有某种标题数据(它在终端中正确运行并发出信号-1),谁知道还有什么。

目前我并不关心应用程序包——在终端中运行是我的短期目标。一旦我完成了第一步,我就可以继续进行完整的应用程序。

关于如何确定我需要在目标文件中拥有什么才能使其正确用作终端工具的任何建议?

0 投票
1 回答
206 浏览

forth - 我如何控制新的 Forth 单词的编译位置?

有没有办法改变HERE指向的内容,或者其他方式来确保我编译的下一个定义最终会出现在某个特殊位置?或者我可以将定义复制到其他地方吗?理想情况下,我希望在 ANS Forth 中有一个解决方案,但 Gforth 特定的东西就足够了。