forth - 如何在 Forth 中创建数组?
问题描述
我知道,这个问题过去经常被问到,也许这些信息在以前的 Stack Overflow 帖子中给出。但是学习 Forth 是一项非常复杂的任务,重复有助于理解串联编程语言相对于 C 等替代语言的优势。
我从 Forth 教程中学到的是,Forth 不提供创建 2D 数组的命令,但用户必须在程序中从头开始实现一切。我在 Forth 中找到了两种占用内存的方法。首先通过创建一个新词:
: 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中的元胞数组模块和动态文本字符串模块。
推荐阅读
- python - 无法使用熊猫将大数据元组转换为数据框
- javascript - Issue with infite fetch loop using useEffect
- elasticsearch - 深入了解 Kibana 脚本字段
- redis - 如何在存储其他动态数据的同时利用 Redis 的地理空间功能
- javascript - Datamap 插件不显示地图
- javascript - Formatter AxisLabel Echarts fontWeight 不起作用
- javascript - 无法使用 nuxtjs 在生产中的异步数据中获取路由参数或查询
- java - 日志中的线程轮询计数超过池大小
- laravel - 具有自动令牌更新功能的 Vue + Laravel + Gmail API
- wordpress - 如何在 Woocommerce 中自定义帐单地址的详细地址?