作为一名历史学家,在 FPC 中编写Scheme 解释器已经在第一阶段对我来说是一项严肃的任务。:) 我正在关注 Peter Michaux 的博客,他展示了如何在 C 中执行此操作(还有对Ada的翻译,这可能对 Pascal 有帮助)。
考虑 Michaux 的工作 (v 0.1) 中的 C 语言中的这两个函数:
object *alloc_object(void) {
object *obj;
obj = malloc(sizeof(object));
if (obj == NULL) {
fprintf(stderr, "out of memory\n");
exit(1);
}
return obj;
}
object *make_fixnum(long value) {
object *obj;
obj = alloc_object();
obj->type = FIXNUM;
obj->data.fixnum.value = value;
return obj;
}
据我了解(只是C中的基本阅读知识),构造函数make_fixnum
返回一个指向结构的指针(类型为fixnum的标记数据);对于构造的对象,必须分配内存(感谢@David Heffernan 昨天的观点)。
到目前为止,这是我对 FPC 的翻译,编译时没有任何错误:
program scheme;
type
TTag = (ScmFixnum);
PScmObject = ^TScmObject;
TScmObject = record
case ScmObjectTag: TTag of
ScmFixnum: (ScmObjectFixnum: integer);
end;
var Test: PScmObject = nil;
procedure AllocateObject(x: PScmObject);
begin
new(x);
end;
function MakeFixnum(x: integer): PScmObject;
var
fixnum: PScmObject = nil;
begin
AllocateObject(fixnum);
fixnum^.ScmObjectTag := ScmFixnum;
fixnum^.ScmObjectFixnum := x;
MakeFixnum := fixnum;
end;
begin
Test := MakeFixnum(1);
writeln(Test^.ScmObjectTag);
writeln(Test^.ScmObjectFixnum);
end.
然而...:
$ ./test
Runtime error 216 at $080480DD
$080480DD
$08048117
$08063873
我怀疑,我使用和引用指针的方式存在严重缺陷。
非常感谢任何帮助我理解指针和内存的工作原理的人(也欢迎参考常见问题解答、论文等)。