Escribiendo un intérprete de esquema con FPC: estructuras de datos recursivas
Esencialmente, esta es una pregunta sobre las estructuras de datos recursivos en Pascal (FPC). Como me gustaría implementar un intérprete de Scheme como se muestra en el capítulo 4 del SICP, esta pregunta también puede ser relevante para los Schemers. :)
Las expresiones S se representarán como datos etiquetados. Hasta ahora, he construido un registro de variante, que representa números y pares. Esperemos que el código sea legible y autoexplicativo:
program scheme;
type
TTag = (ScmFixnum, ScmPair);
PScmObject = ^TScmObject;
TScmObject = record
case ScmObjectTag: TTag of
ScmFixnum: (ScmObjectFixnum: integer);
ScmPair: (ScmObjectCar, ScmObjectCdr: PScmObject);
end;
var
Test1: TScmObject;
Test2: TScmObject;
Test3: TScmObject;
function MakeFixnum(x: integer): TScmObject;
var
fixnum: TScmObject;
begin
fixnum.ScmObjectTag := ScmFixnum;
fixnum.ScmObjectFixnum := x;
MakeFixnum := fixnum;
end;
function MakePair(car, cdr: PScmObject): TScmObject;
var
pair: TScmObject;
begin
pair.ScmObjectTag := ScmPair;
pair.ScmObjectCar := car;
pair.ScmObjectCdr := cdr;
MakePair := pair;
end;
begin
Test1 := MakeFixnum(7);
writeln('Test1, Tag: ', Test1.ScmObjectTag,
', Content: ', Test1.ScmObjectFixnum);
Test2 := MakeFixnum(9);
writeln('Test2, Tag: ', Test2.ScmObjectTag,
', Content: ', Test2.ScmObjectFixnum);
Test3 := MakePair(Test1, Test2);
end.
Sin embargo, compilar el código produce un error de la siguiente manera:
$ fpc scheme.pas
(...)
Compiling scheme.pas
scheme.pas(43,34) Error: Incompatible type for arg no. 2: Got "TScmObject", expected "PScmObject"
scheme.pas(45) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Es obvio que hay un error en la función.MakePair
. Pero aún no entiendo qué es exactamente lo que estoy haciendo mal. Cualquier ayuda es apreciada. :)