我曾经用来CREATE创建一个字符串数组:
create mystringarray s" This" , s" is" , s" a", s" list" ,
Run Code Online (Sandbox Code Playgroud)
我想按升序排序.我在线发现了汇编语言的一些教程,但我想在Forth中完成.什么是最佳实践方法?
Forth 编程语言使用堆栈在函数之间传递参数。不是给子函数一个数字作为直接信息,而是首先将值放入数据堆栈,另一个函数从堆栈中获取值。
Forth 的一个特殊功能是处理不同堆栈上的整数值和浮点值。这意味着,不可能将浮点值推送到数据堆栈。在 Forth 中编写短程序时,经常需要调试代码行。
这可以通过打印堆栈的内容来实现。如果开发人员看到现在堆栈上的内容,他/她很容易理解代码有什么问题。打印出堆栈的内容对于错误跟踪很重要。
将两个数字压入普通数据栈后,就可以显示其内容了。在示例中,输入“.s”命令后,两个整数都被打印出来。但是,如果我将两个浮点数推入专用浮点堆栈,则只显示最后一个元素。如何使整个浮点堆栈可见?
gforth example.fs
1 2 .s cr \ <2> 1 2
1.0e 2.0e f. cr \ 2.
bye
Run Code Online (Sandbox Code Playgroud) 默认情况下,Forth 只有少量的工作库,所以一切都必须从头开始编程。原因是,基于堆栈的 Forth 虚拟机将自己标识为一个超薄系统。
根据 Gforth 手册,可以使用现有的 C 库并访问用 C 编写的预编译图形库和游戏引擎。 C项目。
我从头开始用 C 创建了一个库。它提供了一个 add 函数,可以从主程序中调用。这些文件被编译和链接,它工作正常。
### add.c ###
int add(int a, int b) {
return a + b;
}
### add.h ###
int add(int, int);
### main.c ###
#include <stdio.h>
#include "add.h"
void main() {
printf("5 + 7 = %d\n", add(5,7));
}
### compile ###
gcc -c -fPIC add.c
gcc -c main.c
gcc main.o add.o
./a.out
5 + 7 = 12
Run Code Online (Sandbox Code Playgroud)
计划是使用这个来自 Forth 的预编译 c 库。Gforth 编译器为此提供了一个特殊的关键字,它将 Forth …
目的是在字典中创建一个Forth单词,然后打印出该单词的内存内容。第一步很容易。这个: main词的创建方法与教程中所述相同。创建单词后,字典指针将移至下一个位置,因此我必须从中减去一些项目,现在可以转储创建单词的内存区域了:
\ create a dummy routine
: main 1 dup + . ;
\ put dictionary pointer to the stack
\ and subtract 50 indizies
dp 50 -
\ print out 20 cells to the screen from dp-50 until dp+50
\ but where is my newly created routine ": main"?
100 dump
bye
------
gforth "a.fs"
7F81DF443FC6: 00 00 20 17 12 AF 60 55 - 00 00 04 00 00 00 00 00 .. ...`U........
7F81DF443FD6: …Run Code Online (Sandbox Code Playgroud) 我知道,这个问题过去经常被问到,也许这些信息是在以前的 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 方法在内存中存储一些东西,其他程序员会发现很难阅读代码。