【发布时间】:2013-01-05 21:56:26
【问题描述】:
作为一名历史学家,写Scheme interpreter in FPC 已经在第一阶段对我来说是一项严肃的任务。 :) 我在关注 Peter Michaux 的博客,who showed how to do it in 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 昨天的point)。
这是我目前对 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
我怀疑,我使用和引用指针的方式存在严重缺陷。
非常感谢任何帮助我理解指针和内存的工作原理的人(也欢迎参考常见问题解答、论文等)。
【问题讨论】:
-
AllocateObject 真的应该是一个函数
标签: delphi scheme pascal freepascal sicp