问题标签 [gforth]
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.
lisp - Common Lisp 宏和 Forth 元编程能力的比较
每个 Common Lisp 程序员都知道宏是一个强大的工具。通用 Lisp 宏已被用于在 Lisp 之上添加面向对象而不改变语言规范;读取宏是另一种具有思维弯曲功能的构造。
另一个允许元编程的程序是 Forth。Forth 使用“单词”和“生成单词”的方式略有不同。
我想从涉足两种语言的人那里知道,如果常见的 lisp 宏和 forward 构造在广度/功能上是可比的:有没有你可以用前者做的事情,而你不能用后者做些什么?或相反亦然?
当然,我不是在谈论这两种语言的图灵完备性:我是在谈论元编程能力。C 是图灵完备的,但只有傻瓜才会说 C 宏在功能上与 Common Lisp 相当。
class - 如何在 Forth 中创建一个基本类和该类的实例?
我想创建一个对象来表示一些电气读数,例如输入电压。为此,我想创建一个基本的类结构来处理不同类型的读数——比如电流和电压。
我想要做的伪代码(实际上是 Python)是这样的:
我正在使用Gforth
和oof.fs
扩展。
forth - 我如何控制新的 Forth 单词的编译位置?
有没有办法改变HERE
指向的内容,或者其他方式来确保我编译的下一个定义最终会出现在某个特殊位置?或者我可以将定义复制到其他地方吗?理想情况下,我希望在 ANS Forth 中有一个解决方案,但 Gforth 特定的东西就足够了。
forth - 从循环中捕获异常
我正在尝试编写一个 Forth 单词,它将丢弃堆栈中的所有项目。我正在使用一种非常愚蠢的方法,通过使用“drop”运行无限循环并在“drop”失败时捕获错误,因为堆栈为空。
我的话是这样定义的:
当我运行 droploop 时,我得到了一个我期望的错误,并且在执行之后,堆栈是空的。当我运行 dropcatcher 时,如果堆栈不为空,它会丢弃,如果堆栈为空,它不会报告任何内容。当我运行 dropall 时,我会在堆栈上得到各种剩余的东西。
它看起来像这样:
2 3 4 5 6 7 8 9 10 dropall .s <9> -1 3 -1 5 -1 7 -1 9 -1 ok
我希望 dropall 会简单地清除堆栈而不会抱怨,因为 droploop 和 dropcatcher 似乎可以自己正常工作,但是唉,我不明白为什么 dropall 不起作用。
为什么 dropall 的工作方式似乎与 droploop 和 dropcatcher 不同?或者,我在这里做错了什么?
forth - Show the return stack
Can you show the return stack in Forth?
.S
shows the parameter stack. Is there a similar word showing the contents of the return stack?
I found SHOWSTACK on the web, but it does't work.
forth - CREATE 和 VARIABLE 的区别
CREATE 和 VARIABLE 这两个词有什么区别?
例如,在这段代码中:
在这两种情况下,内存中的结果都是相同的。这样对吗?我什么时候应该用一个代替另一个?为什么?
forth - 从终端输入缓冲区加载到参数堆栈
为什么这段代码不起作用?
在该代码中,我尝试输入一个字符串并将其存储在终端输入缓冲区中,然后将其存储在参数堆栈中。
但是使用 .SI 看,这行不通。
forth - 使用 Gforth 的解释器指令在单词定义中添加新行
我正在使用 Gforth 的解释器指令(非 ANS 标准)控制结构,如手册第5.13.4 节解释器指令中所述。我基本上想使用循环词来创建一个包含文字的动态大小的词。例如,我提出了这个定义:
然而,这会在之后产生地址对齐异常[FOR]
(是的,我知道您根本不应该在 Forth 中使用 for 循环。这只是一个简单的示例)。
最后事实证明,您必须将循环编写为单行代码,以确保它们的正确执行。这样做
而是按预期工作。运行see foo
产量:
这正是我想要的。
有没有办法在单词定义中获得新的行?我想写的单词要复杂得多,对于演示文稿,我需要更好的格式。
forth - 为什么我不能在 Gforth 中得到浮点答案?
听说你只需要在运算符前面加一个F,然后在最后加一个(.),就可以计算出浮点数,然后显示出来。但它给了我这个答案:
我怎样才能得到0.66666667 ok
?
forth - 2>r 和 2r> 是如何工作的?
最近在comp.lang.forth上发现了一些代码,是 Coos Haak 写的,我很难理解。
它应该对括号之间的数字求和或相乘。例如,
为方便起见,我将在此处复制它:
我看到短语r> 2>r
和2r> rdrop 2>r
。但是,我对他们在做什么感到很困惑。我猜想开括号处的堆栈深度以某种方式隐藏在返回堆栈中。但是,我不明白。
这些对返回堆栈有什么作用?
在 Gforth 文档中,我看到:
这是否与 w 和 d 之间的转换有关?