如何在Forth中创建数组

  • 本文关键字:创建 数组 Forth forth
  • 更新时间 :
  • 英文 :


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

我从Forth教程中学到的是,Forth没有提供创建2D阵列的命令,但用户必须在程序中从头开始实现一切。我在福斯找到了两种占据记忆的选择。首先通过创建一个新词:

: namelist s” hello” s” world” ;

或者通过CREATE语句:

create temperature 10 allot
temperature 10 cells dump

到目前为止还不错;我们创建了一个由10个单元格组成的数组,其中可以存储整数变量。但是,如果我需要保存浮点数,那又是什么呢?我必须将float始终转换为int吗?或者它们可以保存到正常单元格中吗?

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

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

create创建一个单词,返回字典(数据空间)中缓冲区的地址;它最初是零长度的,所以您必须立即为它保留所需的空间。

allot保留以地址为单位(通常为字节)测量的空间,因此您必须以字节为单位计算所需的大小。

例如:

create a 10 cells allot
create b 10 floats allot
它只是缓冲区,您仍然需要处理指针算术来获取或设置项,例如:
0.35e  2 floats b +  f!  store the float number into third item (0-based indexing)

在字典中创建浮点数组的单词示例:

: create-floats-array ( length "name" -- ) create floats allot does> swap 1- floats + ;
10 create-floats-array c
0.35e  3 c f!  store the float number into third item (1-based indexing)
3 c f@ f.  print float number form third item

如果需要许多数组和字符串,最好使用适当的库。例如,请参阅Forth Foundation Library中的Cell数组模块和Dynamic文本字符串模块。

元素的广义2darray。将元素大小作为参数

 size is the per element multiplier
 n size * is the per_row factor
 m n size * * is the total space required
: 2darray   create>  m n size -- ; does> mix nix -- a
  size is the number of bytes for one element
  
create  2dup * ,       multiplier to apply to m index 
dup ,          multiplier to apply to n index
* * allot      calculate total bytes and allot them
does>   mix nix -- a 
>r r@ cell+ @ *      offset from n index  
swap r@ @ * +     offset with m index
r> + 2 cells+         2 cells offset for the 'admin' cells
;

示例

50 40 /float 2darray 50x40floats
50 40 2 cells 2darray 50x40stringpairs

甚至

20 constant /record
10 200 /record 2darray 2000records

您对字符串感到困惑。字符串只进入内存,该地址的内存被分配给该字符串,并且它永远存在(除非您更改它)。

因此,如果你想在一个分配的内存块中存储5个(c-addr u)字符串(称之为数组有点拉伸),你只需将c-addr存储在celln中,长度u存储在cell<1。

如果你担心10个单元格占用大量空间(这真的没什么好担心的),并且只想使用5个单元格,你可以将字符串存储为计数字符串,使用像C"这样的单词-计数字符串将长度存储在第一个字节中,后面的每个字节都是一个字符。

此外,您可以使用单词,(逗号)将内容存储到当前dp的字典中。

相关内容

  • 没有找到相关文章

最新更新