基本上,这是一个关于Pascal(FPC)中递归数据结构的问题。由于我想实现一个类似于SICP第4章所展示的Scheme解释器,因此这个问题可能也与Scheme相关。 :)
S表达式将被表示为带标签的数据。到目前为止,我已经构建了一个变量记录,它表示数字和对。希望代码可读性强而且自解释:
然而,编译代码会产生以下错误:
很明显在函数
S表达式将被表示为带标签的数据。到目前为止,我已经构建了一个变量记录,它表示数字和对。希望代码可读性强而且自解释:
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.
然而,编译代码会产生以下错误:
$ 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
很明显在函数
MakePair
中存在错误,但我还不明白到底错在哪里。感谢任何帮助 :)