标签: forth

由于现在每个人都在编写Lisp和Erlang,这是否意味着我们将在2010年看到Forth编码器?

我认为我看到越来越多的程序员正在研究Erlang和Lisp.由于我
以完全相同的顺序学习它,现在,我正在研究Forth,这是否意味着Forth是每个人的TODO列表中的下一个语言?

你的下一个语言是什么?

lisp erlang forth

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

在Forth中实现取幂

我正在使用Gforth来尝试实现取幂.从理论上讲,我理解基于堆栈的语言应该如何运作.但是,我在Gforth上实现它时遇到了困难.

这就是我现在所拥有的:

: myexp
    1 swap ?do rot dup * rot rot loop ;
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,我看到一个堆栈下溢,如:

3 2 myexp
:1: Stack underflow
3 2 >>>myexp<<<
Backtrace:
$7F645EFD6EF0 rot
$2
$1
Run Code Online (Sandbox Code Playgroud)

Gforth的循环结构是否在循环时操纵堆栈?

我对Forth的工作方式一无所知,因为我在网上看到的大多数循环示例都让Foss的新人感到困惑和困惑.

我的实施有什么问题?

forth gforth

2
推荐指数
1
解决办法
532
查看次数

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

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

forth

2
推荐指数
1
解决办法
289
查看次数

从终端输入缓冲区加载到参数堆栈

为什么这段代码不起作用?

TIB 10 ACCEPT
TIB SP@ 1 cells - 10 cmove
Run Code Online (Sandbox Code Playgroud)

在该代码中,我尝试输入一个字符串并将其存储在终端输入缓冲区中,然后将其存储在参数堆栈中.

但是.SI看到这不起作用.

forth gforth

2
推荐指数
1
解决办法
194
查看次数

只有一个堆栈可以实现类似Forth的语言吗?

Forth有一个堆栈和一个返回堆栈.

据我所知,返回堆栈的重点是存储程序计数器的先前值.

C程序将程序计数器的先前值放在堆栈上,并且不使用返回堆栈.

Forth只需要一个返回堆栈,因为它会在堆栈上返回结果,因此程序计数器的先前值可能会被掩埋吗?

stack forth concatenative-language

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

GNU FORTH 有编辑器吗?

开始 FORTH 的第 3 章说,

现在您已经创建了一个“当前”块,您可以通过简单地输入单词来列出它L。与 不同LISTL不希望按块号进行处理;相反,它列出了当前块。

当我跑步时180 LIST,我得到

Screen 180 not modified     
0                                                                 
...                                                             
15                                                                 
 ok
Run Code Online (Sandbox Code Playgroud)

但是当我运行时L,我收到一个错误

:30: Undefined word
>>>L<<<
Backtrace:
$7F0876E99A68 throw 
$7F0876EAFDE0 no.extensions 
$7F0876E99D28 interpreter-notfound1 
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

forth gforth

2
推荐指数
1
解决办法
1349
查看次数

如何在 Forth 中创建数组?

我知道,这个问题过去经常被问到,也许这些信息是在以前的 Stack Overflow 帖子中给出的。但是学习 Forth 是一项非常复杂的任务,重复有助于理解串联编程语言相对于 C 等替代语言的优势。

我从 Forth 教程中了解到,Forth 不提供创建二维数组的命令,但用户必须在程序中从头开始实现。我在 Forth 中找到了两种占用内存的选项。首先通过创建一个新词:

: namelist s” hello” s” world” ;
Run Code Online (Sandbox Code Playgroud)

或者其次通过 CREATE 语句:

create temperature 10 allot
temperature 10 cells dump
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好; 我们创建了一个包含 10 个单元格的数组,其中可以存储整数变量。但是,如果我需要保存浮点数呢?我必须始终将 float 转换为 int 还是可以将它们保存到普通单元格中?

另一个未解决的问题是如何在数组中存储字符串值。据我所知,一个字符串包含一个指针加上一个大小。所以理论上我只能在 10 个单元格数组中存储 5 个字符串,另外我需要在其他地方保存字符串本身的内存。那没有多大意义。

是否有某种更高的抽象可用于将值存储在可用于编写易于阅读的程序的数组中?我的意思是,如果每个程序员都使用自己的 Forth 方法在内存中存储一​​些东西,其他程序员会发现很难阅读代码。

forth

2
推荐指数
1
解决办法
1293
查看次数

第四:如何创建一个单词来编译其他单词直到找到某个分隔符?

我使用 Forth(即Swapforth)通过 I2C配置某些硬件。我有一句话:

i2c1-send ( reg-address byte -- )
Run Code Online (Sandbox Code Playgroud)

将一个字节写入某个芯片的特定内部寄存器。初始化序列很长,因此由于内存消耗,如下实现它是不可行的。

: i2c1-init
   $1201 $10 i2c1-send
   $2130 $43 i2c1-send
   [...]
   $0231 $43 i2c1-send
;
Run Code Online (Sandbox Code Playgroud)

我创建了一个实现,该实现创建了一个结构,该结构包含第一个单元格中的序列长度和下一个单元格中的三个字节。(请注意,i2c1-send 只是一个占位符,允许您在没有我的硬件的情况下对其进行测试)。

: i2c1-send ( reg_addr byte -- )
  \ It is just a placeholder to show what will be written in HW
  swap
  ." addr=" hex . ." val=" . decimal CR
;    

: i2c1: ( "<spaces>name" -- )
  create here $326e9 0 ,
  does> dup cell+ swap 
  @ 0 do 
    dup …
Run Code Online (Sandbox Code Playgroud)

forth

2
推荐指数
1
解决办法
187
查看次数

测量执行时间

如何测量我的程序的执行时间?我发现了这个,但它对我不起作用,因为我的程序需要堆栈中的一些数字才能工作,所以我的程序和这个解决方案相互干扰(据我所知,因为当我尝试time: myfunctime: num1 num2 myfunc没有任何效果时......)

: time: ( "word" -- )
  utime 2>R ' EXECUTE
  utime 2R> D-
  <# # # # # # # [CHAR] . HOLD #S #> TYPE ."  seconds" ;
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

forth gforth

2
推荐指数
1
解决办法
175
查看次数

什么可能导致 RISC-V 上的 SIGILL(非法指令除外)

我正在尝试将一些 Forth 加载到我在 RISC-V SBC 上运行的 Forth 编译器中(不过我不相信这是一个与 Forth 相关的问题):

 >load /root/repos/riscyforth/test2.4th
 : cuboid * * [ The cuboid has a volume of ] . ;
 
 OK
 cuboid
  
 
 Program received signal SIGILL, Illegal instruction.
 0x0000003ff7dbd038 in ?? ()
Run Code Online (Sandbox Code Playgroud)

上面显示的是我用 Forth 加载文件,第一行,回显到终端,是 cuboid 这个词的定义。随后的 OK 说明 Forth 编译器已经成功编译了这个词。

然后第二行是这个词的调用,长方体,然后是程序(在这种情况下在 GDB 下运行)已经用 SIGILL 兑现的消息。

但是,这是反汇编显示的内容:

(gdb) disassemble 0x3ff7dbd038, 0x3ff7dbd078
Dump of assembler code from 0x3ff7dbd038 to 0x3ff7dbd078:
=> 0x0000003ff7dbd038:  addi    s9,s9,-8
   0x0000003ff7dbd03c:  sd  s7,0(s9)
   0x0000003ff7dbd040:  li  s8,63
   0x0000003ff7dbd044:  slli    s8,s8,0x20
   0x0000003ff7dbd048:  lui …
Run Code Online (Sandbox Code Playgroud)

assembly gdb forth riscv

2
推荐指数
1
解决办法
70
查看次数

标签 统计

forth ×10

gforth ×4

assembly ×1

concatenative-language ×1

erlang ×1

gdb ×1

lisp ×1

riscv ×1

stack ×1