Будучи историком, пишу интерпретатор схемы в FPC оказывается уже на первом этапе для меня серьезной задачей. :) Я слежу за блогом Питера Мишо, , который показал, как это сделать на C (есть также перевод на Ada, который может быть полезен для Pascal).
Рассмотрим эти две функции в C из работы Мишо (v 0.1):
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
Я подозреваю, что в том, как я использую и ссылаюсь на указатели, есть серьезная ошибка.
Большое спасибо всем, кто помогает мне понять, как работает этот указатель и память (ссылки на часто задаваемые вопросы, статьи и т. д. также приветствуются).